From 664452af0861ec4cfed89d3a55c9c03991981661 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Fri, 8 Sep 2023 12:11:09 -0700 Subject: [PATCH 01/75] Update nlog.config to include scope props in console logs Signed-off-by: Victor Chang --- src/InformaticsGateway/nlog.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/InformaticsGateway/nlog.config b/src/InformaticsGateway/nlog.config index 86f7e067c..4b106748b 100644 --- a/src/InformaticsGateway/nlog.config +++ b/src/InformaticsGateway/nlog.config @@ -44,7 +44,7 @@ limitations under the License. - + From 1018ca0497a364510942d098ac1d41d2cb8852f6 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 13 Sep 2023 09:42:59 -0700 Subject: [PATCH 02/75] Publish API project to nuget (#473) * Update NLog console formatter & Messaging lib * Publish API project to nuget * Update license decisions * Update copyright header * Use seconds for duration and log connection duration Signed-off-by: Victor Chang --- .github/workflows/ci.yml | 61 ++++++- .github/workflows/package-cleanup.yml | 45 ++++++ doc/dependency_decisions.yml | 51 +++--- docs/compliance/third-party-licenses.md | 153 +++++++----------- ...Monai.Deploy.InformaticsGateway.Api.csproj | 19 ++- ....Deploy.InformaticsGateway.Api.Test.csproj | 2 +- src/Api/Test/packages.lock.json | 36 ++--- src/Api/packages.lock.json | 12 +- ....Deploy.InformaticsGateway.CLI.Test.csproj | 2 +- src/CLI/Test/packages.lock.json | 36 ++--- src/CLI/packages.lock.json | 12 +- ...formaticsGateway.Client.Common.Test.csproj | 2 +- src/Client.Common/Test/packages.lock.json | 24 +-- ...ploy.InformaticsGateway.Client.Test.csproj | 2 +- src/Client/Test/packages.lock.json | 144 ++++++++--------- src/Client/packages.lock.json | 12 +- ...ploy.InformaticsGateway.Common.Test.csproj | 2 +- src/Common/Test/packages.lock.json | 24 +-- ...formaticsGateway.Configuration.Test.csproj | 2 +- src/Configuration/Test/packages.lock.json | 36 ++--- src/Configuration/packages.lock.json | 12 +- ...loy.InformaticsGateway.Database.Api.csproj | 2 +- ...nformaticsGateway.Database.Api.Test.csproj | 2 +- src/Database/Api/Test/packages.lock.json | 42 ++--- src/Database/Api/packages.lock.json | 18 +-- ...icsGateway.Database.EntityFramework.csproj | 6 +- ...teway.Database.EntityFramework.Test.csproj | 4 +- .../EntityFramework/Test/packages.lock.json | 64 ++++---- .../EntityFramework/packages.lock.json | 46 +++--- ....Deploy.InformaticsGateway.Database.csproj | 2 +- ...y.Database.MongoDB.Integration.Test.csproj | 2 +- .../Integration.Test/packages.lock.json | 42 ++--- src/Database/MongoDB/packages.lock.json | 18 +-- src/Database/packages.lock.json | 60 +++---- ...rmaticsGateway.DicomWeb.Client.Test.csproj | 2 +- src/DicomWebClient/Test/packages.lock.json | 24 +-- .../Logging/FileLoggingTextFormatter.cs | 86 ---------- .../Logging/Log.100.200.ScpService.cs | 3 + .../Logging/Log.700.PayloadService.cs | 4 +- ... - Backup.Deploy.InformaticsGateway.csproj | 114 ------------- .../Monai.Deploy.InformaticsGateway.csproj | 5 +- .../PayloadNotificationActionHandler.cs | 2 +- .../Services/Scp/ScpServiceInternal.cs | 1 + .../Logging/FileLoggingTextFormatterTest.cs | 52 ------ ...onai.Deploy.InformaticsGateway.Test.csproj | 6 +- .../Test/packages.lock.json | 152 ++++++++--------- src/InformaticsGateway/packages.lock.json | 120 +++++++------- ...sGateway.PlugIns.RemoteAppExecution.csproj | 10 +- ...way.PlugIns.RemoteAppExecution.Test.csproj | 8 +- .../Test/packages.lock.json | 98 +++++------ .../RemoteAppExecution/packages.lock.json | 70 ++++---- ...InformaticsGateway.Integration.Test.csproj | 8 +- tests/Integration.Test/packages.lock.json | 150 ++++++++--------- 53 files changed, 843 insertions(+), 1069 deletions(-) create mode 100644 .github/workflows/package-cleanup.yml delete mode 100644 src/InformaticsGateway/Logging/FileLoggingTextFormatter.cs delete mode 100644 src/InformaticsGateway/Monai - Backup.Deploy.InformaticsGateway.csproj delete mode 100644 src/InformaticsGateway/Test/Logging/FileLoggingTextFormatterTest.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 875e527a8..68fc5c4dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -# Copyright 2021-2022 MONAI Consortium +# Copyright 2021-2023 MONAI Consortium # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ jobs: semVer: ${{ steps.gitversion.outputs.semVer }} preReleaseLabel: ${{ steps.gitversion.outputs.preReleaseLabel }} majorMinorPatch: ${{ steps.gitversion.outputs.majorMinorPatch }} + nuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }} steps: - uses: actions/checkout@v3 @@ -308,6 +309,7 @@ jobs: runs-on: ${{ matrix.os }} needs: [calc-version] env: + NUGETVER: ${{ needs.calc-version.outputs.nuGetVersionV2 }} SEMVER: ${{ needs.calc-version.outputs.semVer }} PRERELEASELABEL: ${{ needs.calc-version.outputs.preReleaseLabel }} MAJORMINORPATCH: ${{ needs.calc-version.outputs.majorMinorPatch }} @@ -388,6 +390,22 @@ jobs: path: ~/release retention-days: 7 + - name: Package API + if: ${{ (matrix.os == 'ubuntu-latest') }} + run: | + mkdir ~/nupkg + dotnet pack --no-build -c ${{ env.BUILD_CONFIG }} -o ~/nupkg -p:PackageVersion=${{ env.NUGETVER }} + ls -lR ~/nupkg + working-directory: ./src/Api + + - name: Upload Nuget + if: ${{ matrix.os == 'ubuntu-latest' }} + uses: actions/upload-artifact@v3.1.2 + with: + name: nuget + path: ~/nupkg + retention-days: 30 + - name: Log in to the Container registry uses: docker/login-action@v2.2.0 if: ${{ (matrix.os == 'ubuntu-latest') }} @@ -501,6 +519,31 @@ jobs: name: artifacts path: ~/release retention-days: 7 + + publish: + name: Publish to GitHub Packages + runs-on: ubuntu-latest + needs: [build, unit-test, integration-test] + if: ${{ ! ( github.event.inputs.nuget ) && ! ( contains(github.ref, 'refs/heads/main') ) }} + steps: + - uses: actions/download-artifact@v3 + id: download + + - name: List artifacts + run: ls -ldR ${{steps.download.outputs.download-path}}/**/* + + - name: Install grp + run: dotnet tool install gpr -g + + - uses: actions/setup-dotnet@v3 + env: + NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} + with: + dotnet-version: "6.0.x" + source-url: https://nuget.pkg.github.com/Project-MONAI/index.json + + - name: Publish to GitHub + run: gpr push '${{ steps.download.outputs.download-path }}/nuget/*.nupkg' --repository ${{ github.repository }} -k ${{ secrets.GITHUB_TOKEN }} release: if: ${{ contains(github.ref, 'refs/heads/main') || contains(github.ref, 'refs/heads/develop') ||contains(github.head_ref, 'release/') || contains(github.head_ref, 'feature/') || contains(github.head_ref, 'develop') }} @@ -521,6 +564,22 @@ jobs: - name: List artifacts run: ls -ldR ${{steps.download.outputs.download-path}}/**/* + + - name: Install grp + run: dotnet tool install gpr -g + + - uses: actions/setup-dotnet@v3 + env: + NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} + with: + dotnet-version: "6.0.x" + source-url: https://nuget.pkg.github.com/Project-MONAI/index.json + + - name: Publish to GitHub + run: gpr push '${{ steps.download.outputs.download-path }}/nuget/*.nupkg' --repository ${{ github.repository }} -k ${{ secrets.GITHUB_TOKEN }} + + - name: Publish to NuGet.org + run: dotnet nuget push ${{ steps.download.outputs.download-path }}/nuget/*.nupkg -s https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET }} --skip-duplicate - name: Extract owner and repo uses: jungwinter/split@v2 diff --git a/.github/workflows/package-cleanup.yml b/.github/workflows/package-cleanup.yml new file mode 100644 index 000000000..b6aad9edc --- /dev/null +++ b/.github/workflows/package-cleanup.yml @@ -0,0 +1,45 @@ +# Copyright 2021-2023 MONAI Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + + +name: Cleanup Pre-release Packages + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/delete-package-versions@v4 + name: Monai.Deploy.InformaticsGateway.Api + with: + package-name: 'Monai.Deploy.InformaticsGateway.Api' + package-type: nuget + min-versions-to-keep: 10 + delete-only-pre-release-versions: "true" + + - uses: actions/delete-package-versions@v4 + name: monai-deploy-informatics-gateway + with: + package-name: 'monai-deploy-informatics-gateway' + package-type: container + min-versions-to-keep: 10 + delete-only-pre-release-versions: "true" + diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 5e1a5ecfe..c44f250f2 100644 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -125,13 +125,6 @@ :versions: - 2021.3.0 :when: 2022-08-16 23:05:35.941494226 Z -- - :approve - - Karambolo.Extensions.Logging.File - - :who: mocsharp - :why: MIT (https://github.com/adams85/filelogger/raw/master/LICENSE) - :versions: - - 3.4.0 - :when: 2022-08-16 23:05:36.373717252 Z - - :approve - Macross.Json.Extensions - :who: mocsharp @@ -313,71 +306,70 @@ - :who: mocsharp :why: MIT (https://github.com/microsoft/vstest/raw/main/LICENSE) :versions: - - 17.4.1 - - 17.7.1 + - 17.7.2 :when: 2022-08-16 23:05:48.342748414 Z - - :approve - Microsoft.Data.Sqlite.Core - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:49.698463427 Z - - :approve - Microsoft.EntityFrameworkCore - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:50.137694970 Z - - :approve - Microsoft.EntityFrameworkCore.Abstractions - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:51.008105271 Z - - :approve - Microsoft.EntityFrameworkCore.Analyzers - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:51.445711308 Z - - :approve - Microsoft.EntityFrameworkCore.Design - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:51.922790944 Z - - :approve - Microsoft.EntityFrameworkCore.InMemory - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:52.375150938 Z - - :approve - Microsoft.EntityFrameworkCore.Relational - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:52.828879230 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:53.270526921 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite.Core - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-16 23:05:53.706997823 Z - - :approve - Microsoft.Extensions.ApiDescription.Server @@ -519,6 +511,7 @@ :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.21 + - 6.0.22 :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions @@ -526,13 +519,14 @@ :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.21 + - 6.0.22 :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore - :who: mocsharp :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - - 6.0.21 + - 6.0.22 :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.FileProviders.Abstractions @@ -681,8 +675,7 @@ - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/microsoft/vstest/main/LICENSE) :versions: - - 17.4.1 - - 17.7.1 + - 17.7.2 :when: 2022-09-01 23:06:13.008314524 Z - - :approve - Microsoft.NETCore.Platforms @@ -732,16 +725,14 @@ - :who: mocsharp :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) :versions: - - 17.4.1 - - 17.7.1 + - 17.7.2 :when: 2022-08-16 23:06:16.175705981 Z - - :approve - Microsoft.TestPlatform.TestHost - :who: mocsharp :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) :versions: - - 17.4.1 - - 17.7.1 + - 17.7.2 :when: 2022-08-16 23:06:17.671459450 Z - - :approve - Microsoft.Toolkit.HighPerformance @@ -783,14 +774,14 @@ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.0 + - 1.0.1 :when: 2022-08-16 23:06:21.051573547 Z - - :approve - Monai.Deploy.Messaging.RabbitMQ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.0 + - 1.0.1 :when: 2022-08-16 23:06:21.511789690 Z - - :approve - Monai.Deploy.Storage @@ -2270,21 +2261,21 @@ - :who: mocsharp :why: BSD 3-Clause License (https://github.com/NLog/NLog/raw/dev/LICENSE.txt) :versions: - - 5.2.3 + - 5.2.4 :when: 2022-10-12 03:14:06.538744982 Z - - :approve - NLog.Extensions.Logging - :who: mocsharp :why: BSD 2-Clause Simplified License (https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) :versions: - - 5.3.3 + - 5.3.4 :when: 2022-10-12 03:14:06.964203977 Z - - :approve - NLog.Web.AspNetCore - :who: mocsharp :why: BSD 3-Clause License (https://github.com/NLog/NLog.Web/raw/master/LICENSE) :versions: - - 5.3.3 + - 5.3.4 :when: 2022-10-12 03:14:07.396706995 Z - - :approve - fo-dicom.NLog diff --git a/docs/compliance/third-party-licenses.md b/docs/compliance/third-party-licenses.md index 509e18f15..952785a9f 100644 --- a/docs/compliance/third-party-licenses.md +++ b/docs/compliance/third-party-licenses.md @@ -1680,45 +1680,6 @@ SOFTWARE. -
-Karambolo.Extensions.Logging.File 3.4.0 - -## Karambolo.Extensions.Logging.File - -- Version: 3.4.0 -- Authors: Adam Simon -- Project URL: https://github.com/adams85/filelogger -- Source: [NuGet](https://www.nuget.org/packages/Karambolo.Extensions.Logging.File/3.4.0) -- License: [MIT](https://github.com/adams85/filelogger/raw/master/LICENSE) - - -``` -MIT License - -Copyright (c) 2023 Adam Simon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- -
Macross.Json.Extensions 3.0.0 @@ -3339,15 +3300,15 @@ SOFTWARE.
-Microsoft.CodeCoverage 17.4.1 +Microsoft.CodeCoverage 17.7.2 ## Microsoft.CodeCoverage -- Version: 17.4.1 +- Version: 17.7.2 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.4.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.7.2) - License: [MIT](https://github.com/microsoft/vstest/raw/main/LICENSE) @@ -3377,14 +3338,14 @@ SOFTWARE.
-Microsoft.Data.Sqlite.Core 6.0.14 +Microsoft.Data.Sqlite.Core 6.0.22 ## Microsoft.Data.Sqlite.Core -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/dotnet/standard/data/sqlite/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3418,14 +3379,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore 6.0.14 +Microsoft.EntityFrameworkCore 6.0.22 ## Microsoft.EntityFrameworkCore -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3459,14 +3420,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Abstractions 6.0.14 +Microsoft.EntityFrameworkCore.Abstractions 6.0.22 ## Microsoft.EntityFrameworkCore.Abstractions -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Abstractions/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Abstractions/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3500,14 +3461,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Analyzers 6.0.14 +Microsoft.EntityFrameworkCore.Analyzers 6.0.22 ## Microsoft.EntityFrameworkCore.Analyzers -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Analyzers/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Analyzers/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3541,14 +3502,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Design 6.0.14 +Microsoft.EntityFrameworkCore.Design 6.0.22 ## Microsoft.EntityFrameworkCore.Design -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3582,14 +3543,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.InMemory 6.0.14 +Microsoft.EntityFrameworkCore.InMemory 6.0.22 ## Microsoft.EntityFrameworkCore.InMemory -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3623,14 +3584,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Relational 6.0.14 +Microsoft.EntityFrameworkCore.Relational 6.0.22 ## Microsoft.EntityFrameworkCore.Relational -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3664,14 +3625,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Sqlite 6.0.14 +Microsoft.EntityFrameworkCore.Sqlite 6.0.22 ## Microsoft.EntityFrameworkCore.Sqlite -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -3705,14 +3666,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Sqlite.Core 6.0.14 +Microsoft.EntityFrameworkCore.Sqlite.Core 6.0.22 ## Microsoft.EntityFrameworkCore.Sqlite.Core -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite.Core/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite.Core/6.0.22) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -4591,14 +4552,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks 6.0.14 +Microsoft.Extensions.Diagnostics.HealthChecks 6.0.22 ## Microsoft.Extensions.Diagnostics.HealthChecks -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/6.0.22) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -4673,14 +4634,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.14 +Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.22 ## Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/6.0.22) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -4755,14 +4716,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.14 +Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.22 ## Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore -- Version: 6.0.14 +- Version: 6.0.22 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/6.0.14) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/6.0.22) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -5869,15 +5830,15 @@ SOFTWARE.
-Microsoft.NET.Test.Sdk 17.4.1 +Microsoft.NET.Test.Sdk 17.7.2 ## Microsoft.NET.Test.Sdk -- Version: 17.4.1 +- Version: 17.7.2 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.4.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.7.2) - License: [MIT](https://raw.githubusercontent.com/microsoft/vstest/main/LICENSE) @@ -6663,15 +6624,15 @@ SOFTWARE.
-Microsoft.TestPlatform.ObjectModel 17.4.1 +Microsoft.TestPlatform.ObjectModel 17.7.2 ## Microsoft.TestPlatform.ObjectModel -- Version: 17.4.1 +- Version: 17.7.2 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.4.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.7.2) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) @@ -6701,15 +6662,15 @@ SOFTWARE.
-Microsoft.TestPlatform.TestHost 17.4.1 +Microsoft.TestPlatform.TestHost 17.7.2 ## Microsoft.TestPlatform.TestHost -- Version: 17.4.1 +- Version: 17.7.2 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.4.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.7.2) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) @@ -7304,14 +7265,14 @@ Apache License
-Monai.Deploy.Messaging 1.0.0 +Monai.Deploy.Messaging 1.0.1 ## Monai.Deploy.Messaging -- Version: 1.0.0 +- Version: 1.0.1 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-messaging -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging/1.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging/1.0.1) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) @@ -7532,14 +7493,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Messaging.RabbitMQ 1.0.0 +Monai.Deploy.Messaging.RabbitMQ 1.0.1 ## Monai.Deploy.Messaging.RabbitMQ -- Version: 1.0.0 +- Version: 1.0.1 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-messaging -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging.RabbitMQ/1.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging.RabbitMQ/1.0.1) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) @@ -9134,14 +9095,14 @@ SOFTWARE.
-NLog 5.1.2 +NLog 5.2.3 ## NLog -- Version: 5.1.2 +- Version: 5.2.3 - Authors: Jarek Kowalski,Kim Christensen,Julian Verdurmen - Project URL: https://nlog-project.org/ -- Source: [NuGet](https://www.nuget.org/packages/NLog/5.1.2) +- Source: [NuGet](https://www.nuget.org/packages/NLog/5.2.3) - License: [BSD 3-Clause License](https://github.com/NLog/NLog/raw/dev/LICENSE.txt) diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index 1b6401d78..f4ada69d4 100644 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -25,13 +25,28 @@ true enable false + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + + Monai.Deploy.InformaticsGateway.Api + 0.4.1 + MONAI Consortium + MONAI Consortium + true + MONAI Deploy Informatics Gateway API + MONAI Consortium + https://github.com/Project-MONAI/monai-deploy-informatics-gateway + https://github.com/Project-MONAI/monai-deploy-informatics-gateway + Apache-2.0 + True + + - - + + diff --git a/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj b/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj index c9cee6e8d..0a064a532 100644 --- a/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj +++ b/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj @@ -33,7 +33,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index fe9645890..a7a444fc4 100644 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "System.IO.Abstractions.TestingHelpers": { @@ -111,13 +111,13 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -221,8 +221,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -230,10 +230,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1249,9 +1249,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index e126abf9a..2ab5eaf2c 100644 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -29,15 +29,15 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Direct", - "requested": "[6.0.21, )", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "requested": "[6.0.22, )", + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.0, )", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "requested": "[1.0.1, )", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj b/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj index b4d216b5e..0aa26c5cf 100644 --- a/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj +++ b/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj @@ -33,7 +33,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index c29cfe67d..251afc0cd 100644 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -154,8 +154,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.CSharp": { "type": "Transitive", @@ -164,8 +164,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", @@ -469,8 +469,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -478,10 +478,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1532,9 +1532,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index b4b9d88e6..f8d0493fc 100644 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -115,8 +115,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -513,9 +513,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj b/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj index fbe673a50..ec3b39f41 100644 --- a/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj +++ b/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj @@ -31,7 +31,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/Client.Common/Test/packages.lock.json b/src/Client.Common/Test/packages.lock.json index 6b1cd193f..b602d8c07 100644 --- a/src/Client.Common/Test/packages.lock.json +++ b/src/Client.Common/Test/packages.lock.json @@ -16,12 +16,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -69,8 +69,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -84,8 +84,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -93,10 +93,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, diff --git a/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj b/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj index e576754d6..f88b6068f 100644 --- a/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj +++ b/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj @@ -33,7 +33,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index ae3adbda0..b77e0738c 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -132,17 +132,6 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, - "Karambolo.Extensions.Logging.File": { - "type": "Transitive", - "resolved": "3.4.0", - "contentHash": "ZhDYGgEv792s754DXn5xGidn1CbDnk1fTNcXDeUVr3suL/FH1faA4R5S2pDimS61wD8t0J+CBmG9qY9YmqV9Kw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -177,8 +166,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.CSharp": { "type": "Transitive", @@ -187,19 +176,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "9S+kvYcPyGBqH5KX7sL0d7xYADTUrUVaBz+GZsSx4N4jKh/0mka6IFdeuFYzs3T6wdtHTvzdltcRwucwuTFpdw==", + "resolved": "6.0.22", + "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "XUPcDrn/Vrv9yF4M3b9FYEZvqW1gyS3hfJhFiP0pttuRYnGRB+y3/6g/9k0GIoU62+XkxGa78l1JUccq1uvAXQ==", + "resolved": "6.0.22", + "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.21", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.21", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -209,39 +198,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "gS8tH419vOY2kEyqEZBX8VnXWmtHaor7gVx6zVaXCsEyQurGR/aVB++IZ62vzeQFS9R46LbNY6D6bqEA6j3iCg==" + "resolved": "6.0.22", + "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "Ev5FM2KpXJu7+Dm9qvLf1FhSJMytrhSXho92Vompmgeiz3p4InldluidmKKmv8nZQAjs9dTCUUyvk1pxQjysaQ==", + "resolved": "6.0.22", + "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.21", + "Microsoft.EntityFrameworkCore": "6.0.22", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "iAs1F5gxEQRRGNHDKJ6ZtoSbOAWcjdk+mABEIy2vRLeACp7xBPdQRQdJnENmxykkBgOVef73RpU3xVdDcn8Omg==", + "resolved": "6.0.22", + "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.21", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "2If1Lt04gD+KrKPFbMUeUzB8Av/EGJJFxNLGfC/CKLgy8+jAYsamyQ/Hux+93XCajJxFLnJimqSg+bBBvXX+2g==", + "resolved": "6.0.22", + "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.21", - "Microsoft.EntityFrameworkCore.Relational": "6.0.21", + "Microsoft.Data.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Relational": "6.0.22", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -347,10 +336,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "6.0.22", + "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -358,17 +347,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "6.0.22", + "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "6StjSICTiNdXK9NiQx0jpmsfJhSsXekjfJt8r/3K9qUx9dxVF8V2hhhIxRnZt8HM+4YagFLejNCD6hFUAnx9pw==", + "resolved": "6.0.22", + "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.21", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21" + "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -523,8 +512,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -532,10 +521,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -570,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -581,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "1UiWYO+EjNZSFrL/SUElqmBo3TktG+XiCXm8oyXheEWz/CuZS2hhepYB4BDz7XAohUqt2/Hv7wpLiaauiaIFZg==", + "resolved": "1.0.1", + "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.0", + "Monai.Deploy.Messaging": "1.0.1", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -741,25 +730,25 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "NLog.Extensions.Logging": { "type": "Transitive", - "resolved": "5.3.3", - "contentHash": "o3V1oUr0izjhU1djuVqN5JdmNUGmunTs3Amjhumt/nxva8kG9QWjOdba+ciwkP//QOjv+KkGklZtI9o4qz50hQ==", + "resolved": "5.3.4", + "contentHash": "rxUGUqhE3DlcKfKhPJOI0xOt8q2+NX0NkBY9lbRXwZEYQsh8ASFS8X7K+Y7/dcE8v0tpAe7GF8rPD5h4h9Hpsg==", "dependencies": { "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", "Microsoft.Extensions.Logging": "6.0.0", - "NLog": "5.2.3" + "NLog": "5.2.4" } }, "NLog.Web.AspNetCore": { "type": "Transitive", - "resolved": "5.3.3", - "contentHash": "ub8LOAbIGIPtv9nMAdZXlxUvszau6p2Svmeo8mhJFD+PQDMnI6PFc5IID1Jj3c1Lv8sxKVL7vRCsaWdTrmnrFw==", + "resolved": "5.3.4", + "contentHash": "80FaN8CKu94E3mZqZ+r46nRyEYgnHMn4i3vPslbaINs8k+TqJClNFYw6uWLhPU4AN7PKi/jHHzpswqn7K8jgGg==", "dependencies": { - "NLog.Extensions.Logging": "5.3.3" + "NLog.Extensions.Logging": "5.3.4" } }, "NuGet.Frameworks": { @@ -1819,7 +1808,6 @@ "dependencies": { "DotNext.Threading": "[4.7.4, )", "HL7-dotnetcore": "[2.36.0, )", - "Karambolo.Extensions.Logging.File": "[3.4.0, )", "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1828,10 +1816,10 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", - "NLog.Web.AspNetCore": "[5.3.3, )", + "NLog.Web.AspNetCore": "[5.3.4, )", "Swashbuckle.AspNetCore": "[6.5.0, )" } }, @@ -1839,9 +1827,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1877,7 +1865,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.21, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1891,13 +1879,13 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.21, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.21, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", @@ -1927,9 +1915,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.21, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.21, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.21, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", @@ -1937,7 +1925,7 @@ "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", + "NLog": "[5.2.4, )", "Polly": "[7.2.4, )" } } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index 8ab948909..d1cd8c1c0 100644 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -60,8 +60,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -246,9 +246,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj b/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj index fcb70220f..5ed90fe6e 100644 --- a/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj +++ b/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj @@ -29,7 +29,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/Common/Test/packages.lock.json b/src/Common/Test/packages.lock.json index 0e2b9c325..09e8a6f51 100644 --- a/src/Common/Test/packages.lock.json +++ b/src/Common/Test/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -74,8 +74,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -89,8 +89,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -98,10 +98,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, diff --git a/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj b/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj index 404f87fe0..4c623b194 100644 --- a/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj +++ b/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj @@ -34,7 +34,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 4c9a31e40..f583c4d3f 100644 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -119,13 +119,13 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -229,8 +229,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -238,10 +238,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1262,9 +1262,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index 7ff3fd5cc..f8c0c969a 100644 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -60,8 +60,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -246,9 +246,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj index 5f6b08a84..0231a11ef 100755 --- a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj +++ b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj @@ -36,7 +36,7 @@ - + diff --git a/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj b/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj index b43b7e732..b06925d48 100644 --- a/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj +++ b/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj @@ -25,7 +25,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index ebf766e42..22b241ec1 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "xunit": { @@ -93,13 +93,13 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -203,8 +203,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -212,10 +212,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -318,8 +318,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -1236,9 +1236,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1262,7 +1262,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } } } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index 8b15ce163..1f2fdb0fb 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -4,9 +4,9 @@ "net6.0": { "NLog": { "type": "Direct", - "requested": "[5.2.3, )", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "requested": "[5.2.4, )", + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "Ardalis.GuardClauses": { "type": "Transitive", @@ -66,8 +66,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -252,9 +252,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj index e8510be68..b99824dd2 100644 --- a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj +++ b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj @@ -42,12 +42,12 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj index 75b7286c0..c9ad64d69 100644 --- a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj +++ b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj @@ -25,8 +25,8 @@ - - + + diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 7542dcb52..e94aa5d8b 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -10,21 +10,21 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.21, )", - "resolved": "6.0.21", - "contentHash": "NJq3pURTBBHWkHgYkZJlCesZ6udyQIlnS2gU8SdR0xZ5VhW3c90tCCkZel38CgPmq29vWfxLurJLEwroIUokzg==", + "requested": "[6.0.22, )", + "resolved": "6.0.22", + "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.21" + "Microsoft.EntityFrameworkCore": "6.0.22" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -119,8 +119,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", @@ -132,11 +132,11 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "XUPcDrn/Vrv9yF4M3b9FYEZvqW1gyS3hfJhFiP0pttuRYnGRB+y3/6g/9k0GIoU62+XkxGa78l1JUccq1uvAXQ==", + "resolved": "6.0.22", + "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.21", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.21", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -146,13 +146,13 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "gS8tH419vOY2kEyqEZBX8VnXWmtHaor7gVx6zVaXCsEyQurGR/aVB++IZ62vzeQFS9R46LbNY6D6bqEA6j3iCg==" + "resolved": "6.0.22", + "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", @@ -364,8 +364,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -373,10 +373,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -479,8 +479,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -1450,9 +1450,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1476,13 +1476,13 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.21, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.21, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 1435f8a70..ceac40064 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -4,12 +4,12 @@ "net6.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.21, )", - "resolved": "6.0.21", - "contentHash": "XUPcDrn/Vrv9yF4M3b9FYEZvqW1gyS3hfJhFiP0pttuRYnGRB+y3/6g/9k0GIoU62+XkxGa78l1JUccq1uvAXQ==", + "requested": "[6.0.22, )", + "resolved": "6.0.22", + "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.21", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.21", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -19,12 +19,12 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.21, )", - "resolved": "6.0.21", - "contentHash": "G+e0jPI1nD2DHszHXGqO57ogAVIKRy4930jCb7W/v2JfYKVcEbupzdYxEOQAGZws98MXllHNSqeb6fE1EW131A==", + "requested": "[6.0.22, )", + "resolved": "6.0.22", + "contentHash": "es9TKd0cpM263Ou0QMEETN7MDzD7kXDkThiiXl1+c/69v97AZlzeLoM5tDdC0RC4L74ZWyk3+WMnoDPL93DDyQ==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.21" + "Microsoft.EntityFrameworkCore.Relational": "6.0.22" } }, "Microsoft.EntityFrameworkCore.Sqlite": { @@ -140,20 +140,20 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "gS8tH419vOY2kEyqEZBX8VnXWmtHaor7gVx6zVaXCsEyQurGR/aVB++IZ62vzeQFS9R46LbNY6D6bqEA6j3iCg==" + "resolved": "6.0.22", + "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "Ev5FM2KpXJu7+Dm9qvLf1FhSJMytrhSXho92Vompmgeiz3p4InldluidmKKmv8nZQAjs9dTCUUyvk1pxQjysaQ==", + "resolved": "6.0.22", + "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.21", + "Microsoft.EntityFrameworkCore": "6.0.22", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -351,8 +351,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", @@ -454,9 +454,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -480,7 +480,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } } } diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index 145e8086e..2fab0c504 100755 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -68,7 +68,7 @@ - + diff --git a/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj b/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj index 1c8029bd4..5cd670515 100644 --- a/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj +++ b/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj @@ -27,7 +27,7 @@ - + diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index e2c197cbc..9e54f0f84 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -19,12 +19,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -127,13 +127,13 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -237,8 +237,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -246,10 +246,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -402,8 +402,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -1377,9 +1377,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1403,7 +1403,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index 4cc379a71..943ad83ee 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -86,8 +86,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -261,8 +261,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "SharpCompress": { "type": "Transitive", @@ -355,9 +355,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -381,7 +381,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } } } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 17ac45d6b..97ea9486b 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -14,13 +14,13 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.21, )", - "resolved": "6.0.21", - "contentHash": "6StjSICTiNdXK9NiQx0jpmsfJhSsXekjfJt8r/3K9qUx9dxVF8V2hhhIxRnZt8HM+4YagFLejNCD6hFUAnx9pw==", + "requested": "[6.0.22, )", + "resolved": "6.0.22", + "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.21", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21" + "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { @@ -110,11 +110,11 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "XUPcDrn/Vrv9yF4M3b9FYEZvqW1gyS3hfJhFiP0pttuRYnGRB+y3/6g/9k0GIoU62+XkxGa78l1JUccq1uvAXQ==", + "resolved": "6.0.22", + "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.21", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.21", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -124,20 +124,20 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "GlNsy7qoFnCxgZlPpb8H/Srq1juOiV6W5XaijSA0+h8V0yn1VJ0owjb01If3di3Covs/8682A+ByTFjmEUxePA==" + "resolved": "6.0.22", + "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "gS8tH419vOY2kEyqEZBX8VnXWmtHaor7gVx6zVaXCsEyQurGR/aVB++IZ62vzeQFS9R46LbNY6D6bqEA6j3iCg==" + "resolved": "6.0.22", + "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "Ev5FM2KpXJu7+Dm9qvLf1FhSJMytrhSXho92Vompmgeiz3p4InldluidmKKmv8nZQAjs9dTCUUyvk1pxQjysaQ==", + "resolved": "6.0.22", + "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.21", + "Microsoft.EntityFrameworkCore": "6.0.22", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, @@ -257,10 +257,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "6.0.22", + "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -268,8 +268,8 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "6.0.22", + "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "Xr1V3ZrSJByfUP4w+aiOAqC7Uzt1GqRXj35qSTQs9C1oI4gCiBN4wnre0SSvoA7vHQNZPGWNWXtiqbI7Cov3Mg==", + "resolved": "1.0.1", + "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -431,8 +431,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.3", - "contentHash": "rHTNRtQF5qYqLutSR9ldUWXglKym/KA1R6GKw4JtDvza8i5+kgfmeKH75Ccn1noeJIOjHLXorphMxKk3EiN2tg==" + "resolved": "5.2.4", + "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, "Polly": { "type": "Transitive", @@ -568,9 +568,9 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.21, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.1, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -594,13 +594,13 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.3, )" + "NLog": "[5.2.4, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.21, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.21, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj b/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj index 6a39c6053..47200e72a 100644 --- a/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj +++ b/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj @@ -31,7 +31,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/DicomWebClient/Test/packages.lock.json b/src/DicomWebClient/Test/packages.lock.json index 73999e265..61f3d9a5a 100644 --- a/src/DicomWebClient/Test/packages.lock.json +++ b/src/DicomWebClient/Test/packages.lock.json @@ -16,12 +16,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.1, )", - "resolved": "17.7.1", - "contentHash": "o1qyqDOR8eMuQrC1e5EMMcE+Wm3rwES5aHNWaJpi2A5qwVOru23zsdXkndT6hgl79QsJsqKp+/RNcayIzpHjvA==", + "requested": "[17.7.2, )", + "resolved": "17.7.2", + "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.1", - "Microsoft.TestPlatform.TestHost": "17.7.1" + "Microsoft.CodeCoverage": "17.7.2", + "Microsoft.TestPlatform.TestHost": "17.7.2" } }, "Moq": { @@ -111,8 +111,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "NmGwM2ZJy4CAMdJYIp53opUjnXsMbzASX5oQzgxORicJsgz5Lp50fnRI8OmQ/kYNg6dHfr3IjuUoXbsotDX+KA==" + "resolved": "17.7.2", + "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", @@ -174,8 +174,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "nDmV03yHIdAiG5J3ZEjMyJM2XDjmWORuKgbrGzqlAipBEjUuy5Z5S7WwSqUv9OiaUrtCn9dNYmjfMELUi08leQ==", + "resolved": "17.7.2", + "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -183,10 +183,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.1", - "contentHash": "WCU1NyBarz0tih+I9K5OWN1dVo3z562Iek/VAqWNWRFWw1GeUGqB61iixrBvZO77sjTtBc1cXO8H95uImfmEdw==", + "resolved": "17.7.2", + "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.1", + "Microsoft.TestPlatform.ObjectModel": "17.7.2", "Newtonsoft.Json": "13.0.1" } }, diff --git a/src/InformaticsGateway/Logging/FileLoggingTextFormatter.cs b/src/InformaticsGateway/Logging/FileLoggingTextFormatter.cs deleted file mode 100644 index 15446152f..000000000 --- a/src/InformaticsGateway/Logging/FileLoggingTextFormatter.cs +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Globalization; -using System.Text; -using Karambolo.Extensions.Logging.File; -using Microsoft.Extensions.Logging; - -namespace Monai.Deploy.InformaticsGateway.Logging -{ - public class FileLoggingTextFormatter : FileLogEntryTextBuilder - { - public static readonly FileLoggingTextFormatter Default = new(); - - protected override void AppendTimestamp(StringBuilder sb, DateTimeOffset timestamp) - { - sb.Append(timestamp.ToLocalTime().ToString("o", CultureInfo.InvariantCulture)).Append(' '); - } - - protected override void AppendLogScopeInfo(StringBuilder sb, IExternalScopeProvider scopeProvider) - { - scopeProvider.ForEachScope((scope, builder) => - { - builder.Append(' '); - - AppendLogScope(builder, scope!); - }, sb); - } - - protected override void AppendLogScope(StringBuilder sb, object scope) - { - sb.Append('[').Append(scope).Append(']'); - } - - protected override void AppendMessage(StringBuilder sb, string message) - { - sb.Append(" => "); - - var length = sb.Length; - sb.AppendLine(message); - sb.Replace(Environment.NewLine, " ", length, message.Length); - } - - public override void BuildEntryText( - StringBuilder sb, - string categoryName, - LogLevel logLevel, - EventId eventId, - string message, - Exception exception, - IExternalScopeProvider scopeProvider, - DateTimeOffset timestamp) - { - AppendTimestamp(sb, timestamp); - - AppendLogLevel(sb, logLevel); - - AppendCategoryName(sb, categoryName); - - AppendEventId(sb, eventId); - - if (scopeProvider != null) - AppendLogScopeInfo(sb, scopeProvider); - - if (!string.IsNullOrEmpty(message)) - AppendMessage(sb, message); - - if (exception != null) - AppendException(sb, exception); - } - } -} diff --git a/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs b/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs index 024414061..df26a9cf3 100755 --- a/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs +++ b/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs @@ -103,5 +103,8 @@ public static partial class Log [LoggerMessage(EventId = 213, Level = LogLevel.Error, Message = "Error saving DICOM association information. Correlation ID={correlationId}.")] public static partial void ErrorSavingDicomAssociationInfo(this ILogger logger, Guid correlationId, Exception ex); + + [LoggerMessage(EventId = 214, Level = LogLevel.Information, Message = "Connection closed. Correlation ID={correlationId}. Calling AE Title={callingAeTitle}. Called AE Title={calledAeTitle}. Duration={durationSeconds} seconds.")] + public static partial void ConnectionClosed(this ILogger logger, string correlationId, string callingAeTitle, string calledAeTitle, double durationSeconds); } } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs index 992f98815..c09270e2f 100644 --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -53,8 +53,8 @@ public static partial class Log [LoggerMessage(EventId = 711, Level = LogLevel.Information, Message = "Publishing workflow request message ID={messageId}...")] public static partial void PublishingWorkflowRequest(this ILogger logger, string messageId); - [LoggerMessage(EventId = 712, Level = LogLevel.Information, Message = "Workflow request published to {queue}, message ID={messageId}. Payload took {payloadElapsedTime} to complete.")] - public static partial void WorkflowRequestPublished(this ILogger logger, string queue, string messageId, TimeSpan payloadElapsedTime); + [LoggerMessage(EventId = 712, Level = LogLevel.Information, Message = "Workflow request published to {queue}, message ID={messageId}. Payload took {durationSeconds} seconds to complete.")] + public static partial void WorkflowRequestPublished(this ILogger logger, string queue, string messageId, double durationSeconds); [LoggerMessage(EventId = 713, Level = LogLevel.Information, Message = "Restoring payloads from database.")] public static partial void StartupRestoreFromDatabase(this ILogger logger); diff --git a/src/InformaticsGateway/Monai - Backup.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai - Backup.Deploy.InformaticsGateway.csproj deleted file mode 100644 index 943ca34f3..000000000 --- a/src/InformaticsGateway/Monai - Backup.Deploy.InformaticsGateway.csproj +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - Monai.Deploy.InformaticsGateway - Exe - net6.0 - Apache-2.0 - true - True - latest - ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset - true - be0fffc8-bebb-4509-a2c0-3c981e5415ab - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_Parameter1>$(AssemblyName).Test - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index 5bbd72de0..84c22832a 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -37,12 +37,11 @@ - - + - + diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index ff49a6941..944d172d9 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -135,7 +135,7 @@ await messageBrokerPublisherService.Publish( _options.Value.Messaging.Topics.WorkflowRequest, message.ToMessage()).ConfigureAwait(false); - _logger.WorkflowRequestPublished(_options.Value.Messaging.Topics.WorkflowRequest, message.MessageId, payload.Elapsed); + _logger.WorkflowRequestPublished(_options.Value.Messaging.Topics.WorkflowRequest, message.MessageId, payload.Elapsed.TotalSeconds); } private async Task UpdatePayloadState(Payload payload, CancellationToken cancellationToken = default) diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs index 68f59f39a..3eb07278d 100644 --- a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs @@ -74,6 +74,7 @@ public void OnConnectionClosed(Exception exception) var repo = _associationDataProvider!.GetService(); _associationInfo.Disconnect(); repo?.AddAsync(_associationInfo).Wait(); + _logger.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); } catch (Exception ex) { diff --git a/src/InformaticsGateway/Test/Logging/FileLoggingTextFormatterTest.cs b/src/InformaticsGateway/Test/Logging/FileLoggingTextFormatterTest.cs deleted file mode 100644 index 313fb0004..000000000 --- a/src/InformaticsGateway/Test/Logging/FileLoggingTextFormatterTest.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Globalization; -using System.Text; -using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Logging; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.Test.Logging -{ - public class FileLoggingTextFormatterTest - { - [Fact(DisplayName = "BuildEntryText")] - public void BuildEntryText() - { - var sb = new StringBuilder(); - var timestamp = DateTimeOffset.Now; - var cateogry = "Test"; - var eventId = new EventId(100); - var message = "This is a test"; - var exception = new Exception("Exception"); - var scopeProvider = new LoggerExternalScopeProvider(); - scopeProvider.Push("StateA"); - scopeProvider.Push("StateB"); - - var formatter = FileLoggingTextFormatter.Default; - formatter.BuildEntryText( - sb, cateogry, LogLevel.Information, eventId, message, - exception, scopeProvider, timestamp); - - var result = sb.ToString(); - Assert.Contains(timestamp.ToLocalTime().ToString("o", CultureInfo.InvariantCulture), result); - Assert.Contains($"info: {cateogry}[{eventId.Id}] [StateA] [StateB] => {message}", result); - Assert.Contains("System.Exception: Exception", result); - } - } -} diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj index a20e789a1..5e9d5db60 100644 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -1,4 +1,4 @@ - + +# DICOM Association information + +The `/dicom-associations' endpoint is for retrieving a list of information regarding dicom +associations. + +## GET /dicom-associations/ + +#### Query Parameters + +| Name | Type | Description | +|------------|----------|---------------------------------------------| +| startTime | DateTime | (Optional) Start date to query from. | +| endTime | DateTime | (Optional) End date to query from. | +| pageNumber | Number | (Optional) Page number to query.(default 0) | +| pageSize | Number | (Optional) Page size of query. | + +Max & Defaults for PageSize can be set in appSettings. + +```json +"endpointSettings": { + "defaultPageSize": number, + "maxPageSize": number +} +``` + +Endpoint returns a paged result for example + +```json +{ + "PageNumber": 1, + "PageSize": 10, + "FirstPage": "/payload?pageNumber=1&pageSize=10", + "LastPage": "/payload?pageNumber=1&pageSize=10", + "TotalPages": 1, + "TotalRecords": 3, + "NextPage": null, + "PreviousPage": null, + "Data": [...] + "Succeeded": true, + "Errors": null, + "Message": null +} +``` diff --git a/src/Configuration/HttpEndpointSettings.cs b/src/Configuration/HttpEndpointSettings.cs new file mode 100644 index 000000000..d62a045a6 --- /dev/null +++ b/src/Configuration/HttpEndpointSettings.cs @@ -0,0 +1,30 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.Extensions.Configuration; + +namespace Monai.Deploy.InformaticsGateway.Configuration +{ + public class HttpEndpointSettings + { + [ConfigurationKeyName("defaultPageSize")] + public int DefaultPageSize { get; set; } = 10; + + [ConfigurationKeyName("maxPageSize")] + public int MaxPageSize { get; set; } = 10; + } +} diff --git a/src/Configuration/InformaticsGatewayConfiguration.cs b/src/Configuration/InformaticsGatewayConfiguration.cs index e87229134..b7bfd77d2 100644 --- a/src/Configuration/InformaticsGatewayConfiguration.cs +++ b/src/Configuration/InformaticsGatewayConfiguration.cs @@ -82,6 +82,7 @@ public class InformaticsGatewayConfiguration [ConfigurationKeyName("plugins")] public PlugInConfiguration PlugInConfigurations { get; set; } + public InformaticsGatewayConfiguration() { Dicom = new DicomConfiguration(); diff --git a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs index 5ca178cd2..2457dcb7e 100644 --- a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs +++ b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs @@ -23,5 +23,20 @@ public interface IDicomAssociationInfoRepository Task> ToListAsync(CancellationToken cancellationToken = default); Task AddAsync(DicomAssociationInfo item, CancellationToken cancellationToken = default); + + /// + /// Retrieves a list of DicomAssociationInfo in the database. + /// + Task> GetAllAsync(int skip, + int? limit, + DateTime startTime, + DateTime endTime, + CancellationToken cancellationToken); + + /// + /// Gets count of objects + /// + /// Count of objects. + Task CountAsync(); } } diff --git a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs index d381e58fc..fce537511 100644 --- a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs @@ -67,6 +67,24 @@ public async Task AddAsync(DicomAssociationInfo item, Canc }).ConfigureAwait(false); } + public async Task> GetAllAsync(int skip, + int? limit, + DateTime startTime, + DateTime endTime, + CancellationToken cancellationToken) + { + return await _dataset + .Where(t => + t.DateTimeDisconnected >= startTime.ToUniversalTime() && + t.DateTimeDisconnected <= endTime.ToUniversalTime()) + .Skip(skip) + .Take(limit!.Value) + .ToListAsync(cancellationToken) + .ConfigureAwait(false); + } + + public Task CountAsync() => _dataset.LongCountAsync(); + public async Task> ToListAsync(CancellationToken cancellationToken = default) { return await _retryPolicy.ExecuteAsync(async () => diff --git a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs index 8ed336cd8..3696b8e48 100644 --- a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs @@ -59,6 +59,27 @@ public DicomAssociationInfoRepositoryTest(SqliteDatabaseFixture databaseFixture) _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenGetAllAsyncCalled_ExpectLimitedEntitiesToBeReturned() + { + var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + var filter = new Func(t => + t.DateTimeDisconnected >= startTime.ToUniversalTime() && + t.DateTimeDisconnected <= endTime.ToUniversalTime()); + + var expected = _databaseFixture.DatabaseContext.Set() + .Where(filter) + .Skip(0) + .Take(1) + .ToList(); + var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(expected, actual); + } + [Fact] public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSaved() { diff --git a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs index 6f1a83c6d..7fd23164b 100644 --- a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs @@ -89,6 +89,25 @@ public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSa actual!.DateTimeDisconnected.Should().BeCloseTo(association.DateTimeDisconnected, TimeSpan.FromMilliseconds(500)); } + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenGetAllAsyncCalled_ExpectLimitedEntitiesToBeReturned() + { + var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(DicomAssociationInfo)); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + var builder = Builders.Filter; + var filter = builder.Empty; + filter &= builder.Where(t => t.DateTimeDisconnected >= startTime.ToUniversalTime()); + filter &= builder.Where(t => t.DateTimeDisconnected <= endTime.ToUniversalTime()); + var expected = await collection.Find(filter).ToListAsync().ConfigureAwait(false); + var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(false); + + actual.Should().NotBeNull(); + actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); + } + [Fact] public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() { diff --git a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs index bc376631b..395f8f4cf 100755 --- a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs @@ -29,7 +29,7 @@ namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories { - public class DicomAssociationInfoRepository : IDicomAssociationInfoRepository, IDisposable + public class DicomAssociationInfoRepository : MongoDBRepositoryBase, IDicomAssociationInfoRepository, IDisposable { private readonly ILogger _logger; private readonly IServiceScope _scope; @@ -78,6 +78,29 @@ public async Task> ToListAsync(CancellationToken canc }).ConfigureAwait(false); } + public Task> GetAllAsync(int skip, + int? limit, + DateTime startTime, + DateTime endTime, + CancellationToken cancellationToken) + { + var builder = Builders.Filter; + var filter = builder.Empty; + filter &= builder.Where(t => t.DateTimeDisconnected >= startTime.ToUniversalTime()); + filter &= builder.Where(t => t.DateTimeDisconnected <= endTime.ToUniversalTime()); + + return GetAllAsync(_collection, + filter, + Builders.Sort.Descending(x => x.DateTimeDisconnected), + skip, + limit); + } + + public Task CountAsync() + { + return _collection.CountDocumentsAsync(Builders.Filter.Empty); + } + protected virtual void Dispose(bool disposing) { if (!_disposedValue) diff --git a/src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs b/src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs new file mode 100644 index 000000000..06f81a9d0 --- /dev/null +++ b/src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs @@ -0,0 +1,64 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using MongoDB.Driver; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public abstract class MongoDBRepositoryBase + { + /// + /// Get All T that match filters provided. + /// + /// + /// Collection to run against. + /// Filter function you can filter on properties of T. + /// Function used to sort data. + /// Items to skip. + /// Items to limit results by. + /// + protected static async Task> GetAllAsync(IMongoCollection collection, + Expression>? filterFunction, + SortDefinition sortFunction, + int? skip = null, + int? limit = null) + { + return await collection + .Find(filterFunction) + .Skip(skip) + .Limit(limit) + .Sort(sortFunction) + .ToListAsync().ConfigureAwait(false); + } + + protected static async Task> GetAllAsync(IMongoCollection collection, + FilterDefinition filterFunction, + SortDefinition sortFunction, + int? skip = null, + int? limit = null) + { + var result = await collection + .Find(filterFunction) + .Skip(skip) + .Limit(limit) + .Sort(sortFunction) + .ToListAsync().ConfigureAwait(false); + return result; + } + } +} diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs index a494082c4..48fcdd325 100644 --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -173,5 +173,11 @@ public static partial class Log [LoggerMessage(EventId = 8204, Level = LogLevel.Error, Message = "Failed to store FHIR resource.")] public static partial void ErrorStoringFhirResource(this ILogger logger, Exception ex); + + // + // Dicom Associations Controller. + // + [LoggerMessage(EventId = 8300, Level = LogLevel.Error, Message = "Unexpected error occurred in GET /dicom-associations API..")] + public static partial void DicomAssociationsControllerGetError(this ILogger logger, Exception ex); } } diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 9c3c95336..d0fa5d970 100644 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -97,6 +97,7 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => .ConfigureServices((hostContext, services) => { services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway")); + services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:httpEndpointSettings")); services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:messaging")); services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:storage")); services.AddOptions().Bind(hostContext.Configuration.GetSection("MonaiDeployAuthentication")); diff --git a/src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs b/src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs new file mode 100644 index 000000000..00fa1d355 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs @@ -0,0 +1,107 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Monai.Deploy.InformaticsGateway.Services.UriService; + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + /// + /// Paged Response for use with pagination's. + /// + /// Type of response. + public class PagedResponse : Response + { + /// + /// Initializes a new instance of the class. + /// + /// Response Data. + /// Page number. + /// Page size. + public PagedResponse(T data, int pageNumber, int pageSize) + { + PageNumber = pageNumber; + PageSize = pageSize; + Data = data; + Message = null; + Succeeded = true; + Errors = null; + } + + /// + /// Gets or sets PageNumber. + /// + public int PageNumber { get; set; } + + /// + /// Gets or sets PageSize. + /// + public int PageSize { get; set; } + + /// + /// Gets or sets FirstPage. + /// + public string? FirstPage { get; set; } + + /// + /// Gets or sets LastPage. + /// + public string? LastPage { get; set; } + + /// + /// Gets or sets TotalPages. + /// + public int TotalPages { get; set; } + + /// + /// Gets or sets TotalRecords. + /// + public long TotalRecords { get; set; } + + /// + /// Gets or sets NextPage. + /// + public string? NextPage { get; set; } + + /// + /// Gets or sets previousPage. + /// + public string? PreviousPage { get; set; } + + public void SetUp(PaginationFilter validFilter, long totalRecords, IUriService uriService, string route) + { + var totalPages = (double)totalRecords / PageSize; + var roundedTotalPages = Convert.ToInt32(Math.Ceiling(totalPages)); + + var pageNumber = validFilter.PageNumber ?? 0; + NextPage = + pageNumber >= 1 && pageNumber < roundedTotalPages + ? uriService.GetPageUriString(new PaginationFilter(pageNumber + 1, PageSize), route) + : null; + + PreviousPage = + pageNumber - 1 >= 1 && pageNumber <= roundedTotalPages + ? uriService.GetPageUriString(new PaginationFilter(pageNumber - 1, PageSize), route) + : null; + + FirstPage = uriService.GetPageUriString(new PaginationFilter(1, PageSize), route); + LastPage = uriService.GetPageUriString(new PaginationFilter(roundedTotalPages, PageSize), route); + TotalPages = roundedTotalPages; + TotalRecords = totalRecords; + } + } +} diff --git a/src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs b/src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs new file mode 100644 index 000000000..9183c2005 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs @@ -0,0 +1,58 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + /// + /// Pagination Filter class. + /// + public class PaginationFilter + { + /// + /// Initializes a new instance of the class. + /// + public PaginationFilter() + { + PageNumber = 1; + PageSize = null; + } + + /// + /// Initializes a new instance of the class. + /// + /// Page size with limit set in the config. + /// Page size 1 or above. + /// Max page size. + public PaginationFilter(int pageNumber, int pageSize, int maxPageSize = 10) + { + PageNumber = pageNumber < 1 ? 1 : pageNumber; + PageSize = pageSize > maxPageSize ? maxPageSize : pageSize; + } + + /// + /// Gets or sets page number. + /// + public int? PageNumber { get; set; } + + /// + /// Gets or sets page size. + /// + public int? PageSize { get; set; } + + public int GetSkip() => (PageNumber - 1) * PageSize ?? 0; + } +} diff --git a/src/InformaticsGateway/Services/Common/Pagination/Response.cs b/src/InformaticsGateway/Services/Common/Pagination/Response.cs new file mode 100644 index 000000000..ba0bec7b9 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/Response.cs @@ -0,0 +1,67 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + /// + /// Response object. + /// + /// Type of response data. + public class Response + { + /// + /// Initializes a new instance of the class. + /// + public Response() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Response data. + public Response(T data) + { + Succeeded = true; + Message = string.Empty; + Errors = Array.Empty(); + Data = data; + } + + /// + /// Gets or sets Data. + /// + public T? Data { get; set; } + + /// + /// Gets or sets a value indicating whether response has succeeded. + /// + public bool Succeeded { get; set; } + + /// + /// Gets or sets errors. + /// + public string[]? Errors { get; set; } = Array.Empty(); + + /// + /// Gets or sets message. + /// + public string? Message { get; set; } + } +} diff --git a/src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs b/src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs new file mode 100644 index 000000000..20f09e962 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs @@ -0,0 +1,51 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + public class TimeFilter : PaginationFilter + { + public TimeFilter() + { + } + + public TimeFilter(DateTime? startTime, + DateTime? endTime, + int pageNumber, + int pageSize, + int maxPageSize) : base(pageNumber, + pageSize, + maxPageSize) + { + if (endTime == default) + { + EndTime = DateTime.Now; + } + + if (startTime == default) + { + StartTime = new DateTime(2023, 1, 1); + } + } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } + } +} diff --git a/src/InformaticsGateway/Services/Http/ApiControllerBase.cs b/src/InformaticsGateway/Services/Http/ApiControllerBase.cs new file mode 100644 index 000000000..6ecd5050f --- /dev/null +++ b/src/InformaticsGateway/Services/Http/ApiControllerBase.cs @@ -0,0 +1,51 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Net; +using Microsoft.AspNetCore.Mvc; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + /// + /// Base Api Controller. + /// + [ApiController] + public class ApiControllerBase : ControllerBase + { + /// + /// Initializes a new instance of the class. + /// + public ApiControllerBase() + { + } + + /// + /// Gets internal Server Error 500. + /// + public static int InternalServerError => (int)HttpStatusCode.InternalServerError; + + /// + /// Gets bad Request 400. + /// + public static new int BadRequest => (int)HttpStatusCode.BadRequest; + + /// + /// Gets notFound 404. + /// + public static new int NotFound => (int)HttpStatusCode.NotFound; + } +} diff --git a/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs new file mode 100644 index 000000000..d794cecff --- /dev/null +++ b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs @@ -0,0 +1,91 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; +using Monai.Deploy.InformaticsGateway.Services.UriService; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [Route("dicom-associations")] + public class DicomAssociationInfoController : PagedApiControllerBase + { + private const string Endpoint = "/dicom-associations"; + private readonly ILogger _logger; + private readonly IDicomAssociationInfoRepository _dicomRepo; + private readonly IUriService _uriService; + + public DicomAssociationInfoController(ILogger logger, + IOptions options, + IDicomAssociationInfoRepository dicomRepo, + IUriService uriService) : base(options) + { + _logger = logger; + _dicomRepo = dicomRepo; + _uriService = uriService; + } + + /// + /// Gets a paged response list of all workflows. + /// + /// Filters. + /// paged response of subset of all workflows. + [HttpGet] + [ProducesResponseType(typeof(PagedResponse>), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] + public async Task GetAllAsync([FromQuery] TimeFilter filter) + { + try + { + var route = Request?.Path.Value ?? string.Empty; + var pageSize = filter.PageSize ?? EndpointOptions.Value.DefaultPageSize; + var validFilter = new TimeFilter( + filter.StartTime, + filter.EndTime, + filter.PageNumber ?? 0, + pageSize, + EndpointOptions.Value.MaxPageSize); + + var pagedData = await _dicomRepo.GetAllAsync( + validFilter.GetSkip(), + validFilter.PageSize, + filter.StartTime!.Value, + filter.EndTime!.Value, default).ConfigureAwait(false); + + var dataTotal = await _dicomRepo.CountAsync().ConfigureAwait(false); + var pagedResponse = CreatePagedResponse(pagedData.ToList(), validFilter, dataTotal, _uriService, route); + return Ok(pagedResponse); + } + catch (Exception e) + { + _logger.DicomAssociationsControllerGetError(e); + return Problem($"Unexpected error occurred: {e.Message}", Endpoint, InternalServerError); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs b/src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs new file mode 100644 index 000000000..09db23ea7 --- /dev/null +++ b/src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs @@ -0,0 +1,61 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Ardalis.GuardClauses; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; +using Monai.Deploy.InformaticsGateway.Services.UriService; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + public class PagedApiControllerBase : ApiControllerBase + { + protected readonly IOptions EndpointOptions; + + public PagedApiControllerBase(IOptions options) + { + EndpointOptions = options ?? throw new ArgumentNullException(nameof(options)); + } + + /// + /// Creates a pagination paged response. + /// + /// Data set type. + /// Data set. + /// Filters. + /// Total records. + /// Uri service. + /// Route. + /// Returns . + public PagedResponse> CreatePagedResponse(IEnumerable pagedData, PaginationFilter validFilter, long totalRecords, IUriService uriService, string route) + { + Guard.Against.Null(pagedData, nameof(pagedData)); + Guard.Against.Null(validFilter, nameof(validFilter)); + Guard.Against.Null(route, nameof(route)); + Guard.Against.Null(uriService, nameof(uriService)); + + var pageSize = validFilter.PageSize ?? EndpointOptions.Value.DefaultPageSize; + var response = new PagedResponse>(pagedData, validFilter.PageNumber ?? 0, pageSize); + + response.SetUp(validFilter, totalRecords, uriService, route); + return response; + } + } +} diff --git a/src/InformaticsGateway/Services/UriService/IUriService.cs b/src/InformaticsGateway/Services/UriService/IUriService.cs new file mode 100644 index 000000000..6fc38e20e --- /dev/null +++ b/src/InformaticsGateway/Services/UriService/IUriService.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; + +namespace Monai.Deploy.InformaticsGateway.Services.UriService +{ + /// + /// Uri Service. + /// + public interface IUriService + { + /// + /// Gets Relative Uri path with filters as a string. + /// + /// Filters. + /// Route. + /// Relative Uri string. + public string GetPageUriString(PaginationFilter filter, string route); + } +} diff --git a/src/InformaticsGateway/Services/UriService/UriService.cs b/src/InformaticsGateway/Services/UriService/UriService.cs new file mode 100644 index 000000000..28f78488c --- /dev/null +++ b/src/InformaticsGateway/Services/UriService/UriService.cs @@ -0,0 +1,60 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Microsoft.AspNetCore.WebUtilities; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; + +namespace Monai.Deploy.InformaticsGateway.Services.UriService +{ + /// + /// Uri Service. + /// + public class UriService : IUriService + { + private readonly Uri _baseUri; + + /// + /// Initializes a new instance of the class. + /// + /// Base Url. + public UriService(Uri baseUri) + { + _baseUri = baseUri; + } + + /// + /// Gets page uri. + /// + /// Filters. + /// Route. + /// Uri. + public string GetPageUriString(PaginationFilter filter, string route) + { + if (_baseUri.ToString().EndsWith('/') && route.StartsWith('/')) + { + route = route.TrimStart('/'); + } + + var endpointUri = new Uri(string.Concat(_baseUri, route)); + var modifiedUri = QueryHelpers.AddQueryString(endpointUri.ToString(), "pageNumber", filter.PageNumber.ToString()!); + modifiedUri = QueryHelpers.AddQueryString(modifiedUri, "pageSize", filter?.PageSize?.ToString() ?? string.Empty); + var uri = new Uri(modifiedUri); + return uri.IsAbsoluteUri ? uri.PathAndQuery : uri.OriginalString; + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs b/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs new file mode 100644 index 000000000..1d3ed888f --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs @@ -0,0 +1,44 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; +using Monai.Deploy.InformaticsGateway.Services.UriService; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Common.Pagination +{ + public class PagedResponseTest + { + [Fact] + public void SetUp_GivenExpectedInput_ReturnsExpectedResult() + { + var filter = new PaginationFilter(); + var data = new List { "orange", "apple", "donkey" }; + var pagedResponse = new PagedResponse>(data,0, 3); + var uriService = new UriService(new Uri("https://test.com")); + pagedResponse.SetUp(filter, 9, uriService, "test"); + + Assert.Equal(pagedResponse.FirstPage, "/test?pageNumber=1&pageSize=3"); + Assert.Equal(pagedResponse.LastPage, "/test?pageNumber=3&pageSize=3"); + Assert.Equal(pagedResponse.NextPage, "/test?pageNumber=2&pageSize=3"); + Assert.Null(pagedResponse.PreviousPage); + + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs new file mode 100644 index 000000000..1558ec691 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs @@ -0,0 +1,80 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; +using Monai.Deploy.InformaticsGateway.Services.Http; +using Monai.Deploy.InformaticsGateway.Services.UriService; +using Moq; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Http +{ + public class DicomAssociationInfoControllerTest + { + private readonly Mock> _logger; + private Mock _loggerFactory; + private readonly DicomAssociationInfoController _controller; + private readonly IOptions _options; + private readonly Mock _repo; + private readonly UriService _uriService; + + public DicomAssociationInfoControllerTest() + { + _loggerFactory = new Mock(); + _logger = new Mock>(); + _repo = new Mock(); + _loggerFactory.Setup(p => p.CreateLogger(It.IsAny())).Returns(_logger.Object); + _options = Options.Create(new HttpEndpointSettings()); + _uriService = new UriService(new Uri("https://test.com/")); + + _controller = new DicomAssociationInfoController(_logger.Object, _options, _repo.Object, _uriService); + } + + [Fact] + public async Task GetAllAsync_GiveExpectedInput_ReturnsOK() + { + var input = new TimeFilter + { + EndTime = DateTime.Now, + StartTime = DateTime.MinValue, + PageNumber = 0, + PageSize = 1 + }; + _repo.Setup(r => r.GetAllAsync(It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); + var result = await _controller.GetAllAsync(input); + + var okResult = Assert.IsType(result); + var response = Assert.IsType>>(okResult.Value); + Assert.Equal(0 ,response.TotalRecords); + Assert.Empty(response.Data); + } + } +} From cf7f11236280325cde444dcfec2e37a7b05193a6 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Fri, 22 Sep 2023 15:11:42 -0700 Subject: [PATCH 09/75] Update package-cleanup.yml Signed-off-by: Victor Chang --- .github/workflows/package-cleanup.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/package-cleanup.yml b/.github/workflows/package-cleanup.yml index 6772f0754..9c125cd28 100644 --- a/.github/workflows/package-cleanup.yml +++ b/.github/workflows/package-cleanup.yml @@ -17,8 +17,8 @@ name: Cleanup Pre-release Packages on: - schedule: - - cron: "0 0 * * *" + # schedule: + # - cron: "0 0 * * *" workflow_dispatch: jobs: From bbaad93795acd7b4a02bfe275e1b5f6f642da2c4 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 5 Oct 2023 14:50:17 +0100 Subject: [PATCH 10/75] change around config and fixs for plugins Signed-off-by: Neil South --- .github/workflows/package-cleanup.yml | 4 +- Dockerfile | 4 +- docs/api/rest/dicom-association.md | 59 ++++++++ src/Client/Test/packages.lock.json | 1 + ...nfiguration.cs => HttpEndpointSettings.cs} | 15 ++- .../InformaticsGatewayConfiguration.cs | 14 -- src/Configuration/RetryConfiguration.cs | 9 +- src/Database/Api/DatabaseOptions.cs | 7 + src/Database/Api/DatabaseRegistrationBase.cs | 3 +- .../IDicomAssociationInfoRepository.cs | 15 +++ .../InferenceRequestRepositoryBase.cs | 7 +- src/Database/Api/StorageMetadataWrapper.cs | 4 +- src/Database/DatabaseManager.cs | 25 ++-- .../DicomAssociationInfoConfiguration.cs | 4 +- .../DestinationApplicationEntityRepository.cs | 6 +- .../DicomAssociationInfoRepository.cs | 24 +++- .../InferenceRequestRepository.cs | 6 +- .../MonaiApplicationEntityRepository.cs | 6 +- .../Repositories/PayloadRepository.cs | 6 +- .../SourceApplicationEntityRepository.cs | 6 +- .../StorageMetadataWrapperRepository.cs | 5 +- .../VirtualApplicationEntityRepository.cs | 6 +- ...tinationApplicationEntityRepositoryTest.cs | 8 +- .../DicomAssociationInfoRepositoryTest.cs | 29 +++- .../Test/InferenceRequestRepositoryTest.cs | 8 +- .../MonaiApplicationEntityRepositoryTest.cs | 8 +- .../Test/PayloadRepositoryTest.cs | 10 +- .../SourceApplicationEntityRepositoryTest.cs | 8 +- .../StorageMetadataWrapperRepositoryTest.cs | 9 +- .../VirtualApplicationEntityRepositoryTest.cs | 8 +- ...tinationApplicationEntityRepositoryTest.cs | 8 +- .../DicomAssociationInfoRepositoryTest.cs | 31 ++++- .../InferenceRequestRepositoryTest.cs | 28 ++-- .../MonaiApplicationEntityRepositoryTest.cs | 20 +-- .../Integration.Test/PayloadRepositoryTest.cs | 22 +-- .../SourceApplicationEntityRepositoryTest.cs | 22 +-- .../StorageMetadataWrapperRepositoryTest.cs | 34 +++-- .../VirtualApplicationEntityRepositoryTest.cs | 22 +-- .../DestinationApplicationEntityRepository.cs | 5 +- .../DicomAssociationInfoRepository.cs | 34 ++++- .../InferenceRequestRepository.cs | 8 +- .../MonaiApplicationEntityRepository.cs | 9 +- .../Repositories/MongoDBRepositoryBase.cs | 64 +++++++++ .../MongoDB/Repositories/PayloadRepository.cs | 10 +- .../SourceApplicationEntityRepository.cs | 10 +- .../StorageMetadataWrapperRepository.cs | 10 +- .../VirtualApplicationEntityRepository.cs | 10 +- .../Logging/Log.8000.HttpServices.cs | 6 + src/InformaticsGateway/Program.cs | 7 +- .../Services/Common/OutputDataPluginEngine.cs | 1 + .../Common/Pagination/PagedResponse.cs | 107 +++++++++++++++ .../Common/Pagination/PaginationFilter.cs | 58 ++++++++ .../Services/Common/Pagination/Response.cs | 67 ++++++++++ .../Services/Common/Pagination/TimeFilter.cs | 51 +++++++ .../Services/Export/ExportServiceBase.cs | 8 ++ .../Services/Http/ApiControllerBase.cs | 51 +++++++ .../Http/DicomAssociationInfoController.cs | 91 +++++++++++++ .../Services/Http/PagedApiControllerBase.cs | 61 +++++++++ .../Services/Scp/ApplicationEntityHandler.cs | 6 +- .../Services/Scp/ApplicationEntityManager.cs | 9 +- .../Services/Scp/ScpServiceInternal.cs | 2 +- .../Services/UriService/IUriService.cs | 35 +++++ .../Services/UriService/UriService.cs | 60 +++++++++ ...onai.Deploy.InformaticsGateway.Test.csproj | 4 +- .../InputDataPluginEngineFactoryTest.cs | 13 +- .../OutputDataPluginEngineFactoryTest.cs | 20 ++- .../Common/Pagination/PagedResponseTest.cs | 44 ++++++ .../Connectors/PayloadAssemblerTest.cs | 10 +- .../PayloadNotificationActionHandlerTest.cs | 3 +- .../PayloadNotificationServiceTest.cs | 8 +- .../Export/DicomWebExportServiceTest.cs | 2 + .../DicomAssociationInfoControllerTest.cs | 80 +++++++++++ .../Storage/ObjectUploadServiceTest.cs | 1 + .../Test/packages.lock.json | 1 + src/InformaticsGateway/Test/xunit.runner.json | 4 + src/InformaticsGateway/appsettings.json | 58 +++++--- src/InformaticsGateway/nlog.config | 1 + src/InformaticsGateway/packages.lock.json | 1 + .../Database/DatabaseRegistrar.cs | 21 ++- .../RemoteAppExecutionRepository.cs | 6 +- .../Database/IRemoteAppExecutionRepository.cs | 0 .../MongoDb/RemoteAppExecutionRepository.cs | 19 ++- .../RemoteAppExecution/DicomDeidentifier.cs | 71 +++++----- ...sGateway.PlugIns.RemoteAppExecution.csproj | 1 + src/Plug-ins/RemoteAppExecution/SR.cs | 4 + .../Test/Database/DatabaseRegistrarTest.cs | 35 ++++- .../RemoteAppExecutionRepositoryTest.cs | 8 +- .../Database/MongoDb/MongoDatabaseFixture.cs | 0 .../RemoteAppExecutionRepositoryTest.cs | 23 ++-- .../Test/packages.lock.json | 27 +++- .../RemoteAppExecution/packages.lock.json | 25 +++- tests/Integration.Test/Hooks/TestHooks.cs | 5 +- ...emoteAppExecutionPlugInsStepDefinitions.cs | 30 +++-- tests/Integration.Test/appsettings.json | 21 ++- tests/Integration.Test/packages.lock.json | 126 ++++++++++++++++++ 95 files changed, 1594 insertions(+), 369 deletions(-) mode change 100644 => 100755 Dockerfile create mode 100644 docs/api/rest/dicom-association.md mode change 100644 => 100755 src/Client/Test/packages.lock.json rename src/Configuration/{DatabaseConfiguration.cs => HttpEndpointSettings.cs} (67%) mode change 100644 => 100755 src/Configuration/InformaticsGatewayConfiguration.cs mode change 100644 => 100755 src/Configuration/RetryConfiguration.cs mode change 100644 => 100755 src/Database/Api/DatabaseOptions.cs mode change 100644 => 100755 src/Database/Api/DatabaseRegistrationBase.cs mode change 100644 => 100755 src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs mode change 100644 => 100755 src/Database/Api/StorageMetadataWrapper.cs mode change 100644 => 100755 src/Database/DatabaseManager.cs mode change 100644 => 100755 src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/PayloadRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/PayloadRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs create mode 100644 src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs mode change 100644 => 100755 src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs mode change 100644 => 100755 src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs mode change 100644 => 100755 src/InformaticsGateway/Program.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs create mode 100644 src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs create mode 100644 src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs create mode 100644 src/InformaticsGateway/Services/Common/Pagination/Response.cs create mode 100644 src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Export/ExportServiceBase.cs create mode 100644 src/InformaticsGateway/Services/Http/ApiControllerBase.cs create mode 100644 src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs create mode 100644 src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs create mode 100644 src/InformaticsGateway/Services/UriService/IUriService.cs create mode 100644 src/InformaticsGateway/Services/UriService/UriService.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineFactoryTest.cs create mode 100644 src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs create mode 100644 src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/packages.lock.json create mode 100755 src/InformaticsGateway/Test/xunit.runner.json mode change 100644 => 100755 src/InformaticsGateway/nlog.config mode change 100644 => 100755 src/InformaticsGateway/packages.lock.json mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Database/IRemoteAppExecutionRepository.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/packages.lock.json mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/packages.lock.json mode change 100644 => 100755 tests/Integration.Test/Hooks/TestHooks.cs mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs mode change 100644 => 100755 tests/Integration.Test/appsettings.json mode change 100644 => 100755 tests/Integration.Test/packages.lock.json diff --git a/.github/workflows/package-cleanup.yml b/.github/workflows/package-cleanup.yml index 6772f0754..9c125cd28 100644 --- a/.github/workflows/package-cleanup.yml +++ b/.github/workflows/package-cleanup.yml @@ -17,8 +17,8 @@ name: Cleanup Pre-release Packages on: - schedule: - - cron: "0 0 * * *" + # schedule: + # - cron: "0 0 * * *" workflow_dispatch: jobs: diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 index cb8226e31..0791426a6 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM mcr.microsoft.com/dotnet/sdk:6.0-jammy as build +FROM mcr.microsoft.com/dotnet/sdk:6.0-focal as build # Install the tools RUN dotnet tool install --tool-path /tools dotnet-trace @@ -26,7 +26,7 @@ RUN echo "Building MONAI Deploy Informatics Gateway..." RUN dotnet publish -c Release -o out --nologo src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj # Build runtime image -FROM mcr.microsoft.com/dotnet/aspnet:6.0-jammy +FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal # Enable elastic client compatibility mode ENV ELASTIC_CLIENT_APIVERSIONING=true diff --git a/docs/api/rest/dicom-association.md b/docs/api/rest/dicom-association.md new file mode 100644 index 000000000..1b2ffc5a2 --- /dev/null +++ b/docs/api/rest/dicom-association.md @@ -0,0 +1,59 @@ + + +# DICOM Association information + +The `/dicom-associations' endpoint is for retrieving a list of information regarding dicom +associations. + +## GET /dicom-associations/ + +#### Query Parameters + +| Name | Type | Description | +|------------|----------|---------------------------------------------| +| startTime | DateTime | (Optional) Start date to query from. | +| endTime | DateTime | (Optional) End date to query from. | +| pageNumber | Number | (Optional) Page number to query.(default 0) | +| pageSize | Number | (Optional) Page size of query. | + +Max & Defaults for PageSize can be set in appSettings. + +```json +"endpointSettings": { + "defaultPageSize": number, + "maxPageSize": number +} +``` + +Endpoint returns a paged result for example + +```json +{ + "PageNumber": 1, + "PageSize": 10, + "FirstPage": "/payload?pageNumber=1&pageSize=10", + "LastPage": "/payload?pageNumber=1&pageSize=10", + "TotalPages": 1, + "TotalRecords": 3, + "NextPage": null, + "PreviousPage": null, + "Data": [...] + "Succeeded": true, + "Errors": null, + "Message": null +} +``` diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json old mode 100644 new mode 100755 index 326f4cfbd..ebc99b32c --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -1921,6 +1921,7 @@ "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", diff --git a/src/Configuration/DatabaseConfiguration.cs b/src/Configuration/HttpEndpointSettings.cs similarity index 67% rename from src/Configuration/DatabaseConfiguration.cs rename to src/Configuration/HttpEndpointSettings.cs index 342bdfafb..d62a045a6 100644 --- a/src/Configuration/DatabaseConfiguration.cs +++ b/src/Configuration/HttpEndpointSettings.cs @@ -1,5 +1,6 @@ /* - * Copyright 2021-2022 MONAI Consortium + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +19,12 @@ namespace Monai.Deploy.InformaticsGateway.Configuration { - public class DatabaseConfiguration + public class HttpEndpointSettings { - /// - /// Gets or sets retry options relate to reading/writing to the database. - /// - [ConfigurationKeyName("retries")] - public RetryConfiguration Retries { get; set; } = new RetryConfiguration(); + [ConfigurationKeyName("defaultPageSize")] + public int DefaultPageSize { get; set; } = 10; + + [ConfigurationKeyName("maxPageSize")] + public int MaxPageSize { get; set; } = 10; } } diff --git a/src/Configuration/InformaticsGatewayConfiguration.cs b/src/Configuration/InformaticsGatewayConfiguration.cs old mode 100644 new mode 100755 index e87229134..7b0bd11fd --- a/src/Configuration/InformaticsGatewayConfiguration.cs +++ b/src/Configuration/InformaticsGatewayConfiguration.cs @@ -70,18 +70,6 @@ public class InformaticsGatewayConfiguration [ConfigurationKeyName("messaging")] public MessageBrokerConfiguration Messaging { get; set; } - /// - /// Represents the database section of the configuration file. - /// - [ConfigurationKeyName("database")] - public DatabaseConfiguration Database { get; set; } - - /// - /// Represents the pluginConfiguration section of the configuration file. - /// - [ConfigurationKeyName("plugins")] - public PlugInConfiguration PlugInConfigurations { get; set; } - public InformaticsGatewayConfiguration() { Dicom = new DicomConfiguration(); @@ -90,9 +78,7 @@ public InformaticsGatewayConfiguration() Fhir = new FhirConfiguration(); Export = new DataExportConfiguration(); Messaging = new MessageBrokerConfiguration(); - Database = new DatabaseConfiguration(); Hl7 = new Hl7Configuration(); - PlugInConfigurations = new PlugInConfiguration(); } } } diff --git a/src/Configuration/RetryConfiguration.cs b/src/Configuration/RetryConfiguration.cs old mode 100644 new mode 100755 index fa99b8125..ae9b343fc --- a/src/Configuration/RetryConfiguration.cs +++ b/src/Configuration/RetryConfiguration.cs @@ -29,7 +29,7 @@ public class RetryConfiguration /// Default is 250, 500, 1000. /// [ConfigurationKeyName("delays")] - public int[] DelaysMilliseconds { get; set; } = new[] { 750, 1200, 2500 }; + public int[] DelaysMilliseconds { get; set; } // Gets the delays in TimeSpan objects public IEnumerable RetryDelays @@ -42,5 +42,12 @@ public IEnumerable RetryDelays } } } + public RetryConfiguration() + { + if (DelaysMilliseconds is null || DelaysMilliseconds.Length == 0) + { + DelaysMilliseconds = new[] { 250, 500, 1000 }; + } + } } } diff --git a/src/Database/Api/DatabaseOptions.cs b/src/Database/Api/DatabaseOptions.cs old mode 100644 new mode 100755 index 9951e44ce..26a35eb94 --- a/src/Database/Api/DatabaseOptions.cs +++ b/src/Database/Api/DatabaseOptions.cs @@ -15,6 +15,7 @@ */ using Microsoft.Extensions.Configuration; +using Monai.Deploy.InformaticsGateway.Configuration; namespace Monai.Deploy.InformaticsGateway.Database.Api { @@ -22,5 +23,11 @@ public class DatabaseOptions { [ConfigurationKeyName("DatabaseName")] public string DatabaseName { get; set; } = string.Empty; + + /// + /// Gets or sets retry options relate to reading/writing to the database. + /// + [ConfigurationKeyName("retries")] + public RetryConfiguration Retries { get; set; } = new RetryConfiguration(); } } diff --git a/src/Database/Api/DatabaseRegistrationBase.cs b/src/Database/Api/DatabaseRegistrationBase.cs old mode 100644 new mode 100755 index 828f473e4..0c40bed90 --- a/src/Database/Api/DatabaseRegistrationBase.cs +++ b/src/Database/Api/DatabaseRegistrationBase.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -21,6 +22,6 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api { public abstract class DatabaseRegistrationBase { - public abstract IServiceCollection Configure(IServiceCollection services, DatabaseType databaseType, string? connectionString, ILogger logger); + public abstract IServiceCollection Configure(IServiceCollection services, DatabaseType databaseType, IConfigurationSection? connectionstringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, ILoggerFactory loggerFactory); } } diff --git a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs index 5ca178cd2..2457dcb7e 100644 --- a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs +++ b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs @@ -23,5 +23,20 @@ public interface IDicomAssociationInfoRepository Task> ToListAsync(CancellationToken cancellationToken = default); Task AddAsync(DicomAssociationInfo item, CancellationToken cancellationToken = default); + + /// + /// Retrieves a list of DicomAssociationInfo in the database. + /// + Task> GetAllAsync(int skip, + int? limit, + DateTime startTime, + DateTime endTime, + CancellationToken cancellationToken); + + /// + /// Gets count of objects + /// + /// Count of objects. + Task CountAsync(); } } diff --git a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs old mode 100644 new mode 100755 index 38c1639c3..ce298d06c --- a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs +++ b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs @@ -19,7 +19,6 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories @@ -27,11 +26,11 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories public abstract class InferenceRequestRepositoryBase : IInferenceRequestRepository { private readonly ILogger _logger; - private readonly IOptions _options; + private readonly IOptions _options; protected InferenceRequestRepositoryBase( ILogger logger, - IOptions options) + IOptions options) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _options = options ?? throw new ArgumentNullException(nameof(options)); @@ -72,7 +71,7 @@ public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceReques } else { - if (++inferenceRequest.TryCount > _options.Value.Database.Retries.DelaysMilliseconds.Length) + if (++inferenceRequest.TryCount > _options.Value.Retries.DelaysMilliseconds.Length) { _logger.InferenceRequestUpdateExceededMaximumRetries(); inferenceRequest.State = InferenceRequestState.Completed; diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs old mode 100644 new mode 100755 index 3c1352d12..559124b36 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -27,7 +27,7 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api /// public class StorageMetadataWrapper : MongoDBEntityBase { - private readonly JsonSerializerOptions _options; + //private readonly JsonSerializerOptions _options; [JsonPropertyName("correlationId")] public string CorrelationId { get; set; } = string.Empty; @@ -92,4 +92,4 @@ public override string ToString() return $"Identity: {Identity}"; } } -} \ No newline at end of file +} diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs old mode 100644 new mode 100755 index c2efd0e9d..34676aa7d --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -63,16 +63,18 @@ public static IHealthChecksBuilder AddDatabaseHealthCheck(this IHealthChecksBuil } } - public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, ILogger logger) - => services.ConfigureDatabase(connectionStringConfigurationSection, new FileSystem(), logger); + public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, ILoggerFactory loggerFactory) + => services.ConfigureDatabase(connectionStringConfigurationSection, pluginsConfigurationSection, new FileSystem(), loggerFactory); - public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IFileSystem fileSystem, ILogger logger) + public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, IFileSystem fileSystem, ILoggerFactory loggerFactory) { + var logger = loggerFactory.CreateLogger("DatabaseManager"); + if (connectionStringConfigurationSection is null) { throw new ConfigurationException("No database connections found in configuration section 'ConnectionStrings'."); } - + services.Configure(connectionStringConfigurationSection.GetSection("DatabaseOptions")); var databaseType = connectionStringConfigurationSection["Type"].ToLowerInvariant(); switch (databaseType) { @@ -90,13 +92,12 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(EntityFramework.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(EntityFramework.Repositories.VirtualApplicationEntityRepository)); - services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, logger); + services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); return services; case DbType_MongoDb: + var terst = connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]; services.AddSingleton(s => new MongoClient(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey])); - services.Configure(connectionStringConfigurationSection); - services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(MongoDB.Repositories.DestinationApplicationEntityRepository)); services.AddScoped(typeof(IInferenceRequestRepository), typeof(MongoDB.Repositories.InferenceRequestRepository)); @@ -107,7 +108,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(MongoDB.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(MongoDB.Repositories.VirtualApplicationEntityRepository)); - services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, logger); + services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); return services; @@ -120,7 +121,8 @@ public static IServiceCollection ConfigureDatabaseFromPlugIns(this IServiceColle DatabaseType databaseType, IFileSystem fileSystem, IConfigurationSection? connectionStringConfigurationSection, - ILogger logger) + IConfigurationSection? pluginsConfigurationSection, + ILoggerFactory loggerFactory) { Guard.Against.Null(fileSystem, nameof(fileSystem)); @@ -133,7 +135,7 @@ public static IServiceCollection ConfigureDatabaseFromPlugIns(this IServiceColle { throw new ConfigurationException($"Error activating database registration from type '{type.FullName}'."); } - registrar.Configure(services, databaseType, connectionStringConfigurationSection?[SR.DatabaseConnectionStringKey], logger); + registrar.Configure(services, databaseType, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); } return services; } @@ -167,8 +169,7 @@ internal static Assembly[] LoadAssemblyFromPlugInsDirectory(IFileSystem fileSyst foreach (var plugin in plugins) { - var asesmblyeData = fileSystem.File.ReadAllBytes(plugin); - assemblies.Add(Assembly.Load(asesmblyeData)); + assemblies.Add(Assembly.LoadFrom(plugin)); } return assemblies.ToArray(); } diff --git a/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs b/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs old mode 100644 new mode 100755 index 6fe9b5362..67bda9b8d --- a/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs @@ -29,7 +29,7 @@ internal class DicomAssociationInfoConfiguration : IEntityTypeConfiguration builder) { var comparer = new ValueComparer>( - (c1, c2) => c1.SequenceEqual(c2), + (c1, c2) => c1!.SequenceEqual(c2!), c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), c => c.ToHashSet()); @@ -50,7 +50,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(j => j.PayloadIds).IsRequired() .HasConversion( v => JsonSerializer.Serialize(v, jsonSerializerSettings), - v => JsonSerializer.Deserialize>(v, jsonSerializerSettings)) + v => JsonSerializer.Deserialize>(v, jsonSerializerSettings) ?? new HashSet()) .Metadata.SetValueComparer(comparer); } } diff --git a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs old mode 100644 new mode 100755 index 5209ece7b..cc71e7820 --- a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -41,7 +41,7 @@ public class DestinationApplicationEntityRepository : IDestinationApplicationEnt public DestinationApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -51,7 +51,7 @@ public DestinationApplicationEntityRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs old mode 100644 new mode 100755 index d381e58fc..f0546aba4 --- a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -40,7 +40,7 @@ public class DicomAssociationInfoRepository : IDicomAssociationInfoRepository, I public DicomAssociationInfoRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -50,7 +50,7 @@ public DicomAssociationInfoRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } @@ -67,6 +67,24 @@ public async Task AddAsync(DicomAssociationInfo item, Canc }).ConfigureAwait(false); } + public async Task> GetAllAsync(int skip, + int? limit, + DateTime startTime, + DateTime endTime, + CancellationToken cancellationToken) + { + return await _dataset + .Where(t => + t.DateTimeDisconnected >= startTime.ToUniversalTime() && + t.DateTimeDisconnected <= endTime.ToUniversalTime()) + .Skip(skip) + .Take(limit!.Value) + .ToListAsync(cancellationToken) + .ConfigureAwait(false); + } + + public Task CountAsync() => _dataset.LongCountAsync(); + public async Task> ToListAsync(CancellationToken cancellationToken = default) { return await _retryPolicy.ExecuteAsync(async () => diff --git a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs index 87d59470e..61a16475e 100755 --- a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs +++ b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs @@ -22,7 +22,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -44,7 +44,7 @@ public class InferenceRequestRepository : InferenceRequestRepositoryBase, IDispo public InferenceRequestRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) : base(logger, options) + IOptions options) : base(logger, options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); @@ -52,7 +52,7 @@ public InferenceRequestRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs old mode 100644 new mode 100755 index e84cb78ff..9ebbf8818 --- a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -41,7 +41,7 @@ public class MonaiApplicationEntityRepository : IMonaiApplicationEntityRepositor public MonaiApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -51,7 +51,7 @@ public MonaiApplicationEntityRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Repositories/PayloadRepository.cs b/src/Database/EntityFramework/Repositories/PayloadRepository.cs old mode 100644 new mode 100755 index 441fe2544..180594610 --- a/src/Database/EntityFramework/Repositories/PayloadRepository.cs +++ b/src/Database/EntityFramework/Repositories/PayloadRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -40,7 +40,7 @@ public class PayloadRepository : IPayloadRepository, IDisposable public PayloadRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -50,7 +50,7 @@ public PayloadRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs old mode 100644 new mode 100755 index d4abf081b..9c53d9216 --- a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -41,7 +41,7 @@ public class SourceApplicationEntityRepository : ISourceApplicationEntityReposit public SourceApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -51,7 +51,7 @@ public SourceApplicationEntityRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs old mode 100644 new mode 100755 index 201730eca..3e8db63a6 --- a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs +++ b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs @@ -22,7 +22,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -43,7 +42,7 @@ public class StorageMetadataWrapperRepository : StorageMetadataRepositoryBase, I public StorageMetadataWrapperRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) : base(logger) + IOptions options) : base(logger) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -53,7 +52,7 @@ public StorageMetadataWrapperRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle(p => p is not ArgumentException).WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs old mode 100644 new mode 100755 index 0382f76f0..0d2cb0a8d --- a/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; @@ -41,7 +41,7 @@ public class VirtualApplicationEntityRepository : IVirtualApplicationEntityRepos public VirtualApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -51,7 +51,7 @@ public VirtualApplicationEntityRepository( _scope = serviceScopeFactory.CreateScope(); _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _informaticsGatewayContext.Set(); } diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index b1a411f0b..64a4472f8 --- a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; @@ -32,7 +32,7 @@ public class DestinationApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -44,7 +44,7 @@ public DestinationApplicationEntityRepositoryTest(SqliteDatabaseFixture database _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -55,7 +55,7 @@ public DestinationApplicationEntityRepositoryTest(SqliteDatabaseFixture database _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs old mode 100644 new mode 100755 index 8ed336cd8..127e3fab5 --- a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; @@ -32,7 +32,7 @@ public class DicomAssociationInfoRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -44,7 +44,7 @@ public DicomAssociationInfoRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -55,10 +55,31 @@ public DicomAssociationInfoRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenGetAllAsyncCalled_ExpectLimitedEntitiesToBeReturned() + { + var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + var filter = new Func(t => + t.DateTimeDisconnected >= startTime.ToUniversalTime() && + t.DateTimeDisconnected <= endTime.ToUniversalTime()); + + var expected = _databaseFixture.DatabaseContext.Set() + .Where(filter) + .Skip(0) + .Take(1) + .ToList(); + var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(expected, actual); + } + [Fact] public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSaved() { diff --git a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs old mode 100644 new mode 100755 index a90ff02d1..f97463920 --- a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; @@ -32,7 +32,7 @@ public class InferenceRequestRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -43,7 +43,7 @@ public InferenceRequestRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -54,7 +54,7 @@ public InferenceRequestRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index ab50f74b2..a16a4b894 --- a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; @@ -32,7 +32,7 @@ public class MonaiApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -44,7 +44,7 @@ public MonaiApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixtur _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -55,7 +55,7 @@ public MonaiApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixtur _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs b/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs old mode 100644 new mode 100755 index 5eb837103..776faf090 --- a/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Monai.Deploy.Messaging.Events; using Moq; @@ -33,7 +33,7 @@ public class PayloadRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -44,7 +44,7 @@ public PayloadRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -55,7 +55,7 @@ public PayloadRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -220,4 +220,4 @@ public async Task GivenPayloadsInDifferentStates_WhenGetPayloadsInStateAsyncIsCa Assert.Equal(4, result.Count); } } -} \ No newline at end of file +} diff --git a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index ad6487ef8..237d45a2d --- a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; @@ -32,7 +32,7 @@ public class SourceApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -44,7 +44,7 @@ public SourceApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixtu _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -55,7 +55,7 @@ public SourceApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixtu _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs old mode 100644 new mode 100755 index 8a1e733aa..05946a5ed --- a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs @@ -21,7 +21,6 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Monai.Deploy.Messaging.Events; @@ -36,7 +35,7 @@ public class StorageMetadataWrapperRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -47,7 +46,7 @@ public StorageMetadataWrapperRepositoryTest(SqliteDatabaseFixture databaseFixtur _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -58,7 +57,7 @@ public StorageMetadataWrapperRepositoryTest(SqliteDatabaseFixture databaseFixtur _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -266,4 +265,4 @@ public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_E "callingAET", "calledAET"); } -} \ No newline at end of file +} diff --git a/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index fa677b5a4..69967261d --- a/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; @@ -32,7 +32,7 @@ public class VirtualApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -44,7 +44,7 @@ public VirtualApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixt _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -55,7 +55,7 @@ public VirtualApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixt _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index 5d4756844..875dc1fc9 --- a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; @@ -34,7 +34,7 @@ public class DestinationApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -46,7 +46,7 @@ public DestinationApplicationEntityRepositoryTest(MongoDatabaseFixture databaseF _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,7 +57,7 @@ public DestinationApplicationEntityRepositoryTest(MongoDatabaseFixture databaseF _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs old mode 100644 new mode 100755 index 6f1a83c6d..11aefe0af --- a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; @@ -34,7 +34,7 @@ public class DicomAssociationInfoRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -46,7 +46,7 @@ public DicomAssociationInfoRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,7 +57,7 @@ public DicomAssociationInfoRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -72,7 +72,7 @@ public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSa association.FileReceived(string.Empty); association.Disconnect(); - var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(association).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(DicomAssociationInfo)); @@ -89,10 +89,29 @@ public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSa actual!.DateTimeDisconnected.Should().BeCloseTo(association.DateTimeDisconnected, TimeSpan.FromMilliseconds(500)); } + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenGetAllAsyncCalled_ExpectLimitedEntitiesToBeReturned() + { + var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(DicomAssociationInfo)); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + var builder = Builders.Filter; + var filter = builder.Empty; + filter &= builder.Where(t => t.DateTimeDisconnected >= startTime.ToUniversalTime()); + filter &= builder.Where(t => t.DateTimeDisconnected <= endTime.ToUniversalTime()); + var expected = await collection.Find(filter).ToListAsync().ConfigureAwait(false); + var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(false); + + actual.Should().NotBeNull(); + actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); + } + [Fact] public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() { - var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(DicomAssociationInfo)); var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); diff --git a/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs old mode 100644 new mode 100755 index ae9c47dfe..6a947c37f --- a/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; @@ -33,7 +33,7 @@ public class InferenceRequestRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -45,7 +45,7 @@ public InferenceRequestRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -56,7 +56,7 @@ public InferenceRequestRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -65,7 +65,7 @@ public async Task GivenAnInferenceRequest_WhenAddingToDatabase_ExpectItToBeSaved { var inferenceRequest = CreateInferenceRequest(); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(InferenceRequest)); @@ -88,7 +88,7 @@ public async Task GivenAFailedInferenceRequstThatExceededRetries_WhenUpdateIsCal TryCount = 3 }; - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); @@ -109,7 +109,7 @@ public async Task GivenAFailedInferenceRequst_WhenUpdateIsCalled_ShallRetryLater TryCount = 1 }; - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); @@ -129,7 +129,7 @@ public async Task GivenASuccessfulInferenceRequest_WhenUpdateIsCalled_ShallMarkA TransactionId = Guid.NewGuid().ToString() }; - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Success).ConfigureAwait(false); @@ -152,7 +152,7 @@ public async Task GivenAQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnFirs var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); var inferenceRequestQueued = CreateInferenceRequest(); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); await store.AddAsync(inferenceRequestQueued).ConfigureAwait(false); @@ -176,7 +176,7 @@ public async Task GivenNoQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnNot var inferenceRequestInProcess = CreateInferenceRequest(InferenceRequestState.InProcess); var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); @@ -191,7 +191,7 @@ public async Task GivenInferenceRequests_WhenGetInferenceRequestIsCalled_ShallRe var inferenceRequest2 = CreateInferenceRequest(); var inferenceRequest3 = CreateInferenceRequest(); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest1).ConfigureAwait(false); await store.AddAsync(inferenceRequest2).ConfigureAwait(false); await store.AddAsync(inferenceRequest3).ConfigureAwait(false); @@ -222,7 +222,7 @@ public async Task GivenInferenceRequests_WhenExistsCalled_ShallReturnCorrectValu { var inferenceRequest = CreateInferenceRequest(); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); var result = await store.ExistsAsync(inferenceRequest.TransactionId).ConfigureAwait(false); @@ -237,7 +237,7 @@ public async Task GivenAMatchingInferenceRequest_WhenGetStatusCalled_ShallReturn { var inferenceRequest = CreateInferenceRequest(); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(false); @@ -251,7 +251,7 @@ public async Task GivenNoMatchingInferenceRequest_WhenGetStatusCalled_ShallRetur { var inferenceRequest = CreateInferenceRequest(); - var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); var result = await store.GetStatusAsync("bogus").ConfigureAwait(false); diff --git a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index 5a6d0776b..226ca6e95 --- a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; @@ -34,7 +34,7 @@ public class MonaiApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -46,7 +46,7 @@ public MonaiApplicationEntityRepositoryTest(MongoDatabaseFixture databaseFixture _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,7 +57,7 @@ public MonaiApplicationEntityRepositoryTest(MongoDatabaseFixture databaseFixture _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -75,7 +75,7 @@ public async Task GivenAMonaiApplicationEntity_WhenAddingToDatabase_ExpectItToBe IgnoredSopClasses = new List { "4", "5" } }; - var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(aet).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(MonaiApplicationEntity)); @@ -94,7 +94,7 @@ public async Task GivenAMonaiApplicationEntity_WhenAddingToDatabase_ExpectItToBe [Fact] public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() { - var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); Assert.True(result); @@ -109,7 +109,7 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet [Fact] public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() { - var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); Assert.NotNull(actual); @@ -123,7 +123,7 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn [Fact] public async Task GivenAMonaiApplicationEntity_WhenRemoveIsCalled_ExpectItToDeleted() { - var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); Assert.NotNull(expected); @@ -139,7 +139,7 @@ public async Task GivenAMonaiApplicationEntity_WhenRemoveIsCalled_ExpectItToDele [Fact] public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() { - var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(MonaiApplicationEntity)); var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); @@ -151,7 +151,7 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC [Fact] public async Task GivenAMonaiApplicationEntity_WhenUpdatedIsCalled_ExpectItToSaved() { - var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); Assert.NotNull(expected); diff --git a/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs old mode 100644 new mode 100755 index dc11b9fc6..ef3965958 --- a/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using Monai.Deploy.Messaging.Events; @@ -35,7 +35,7 @@ public class PayloadRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -46,7 +46,7 @@ public PayloadRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,7 +57,7 @@ public PayloadRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -70,7 +70,7 @@ public async Task GivenAPayload_WhenAddingToDatabase_ExpectItToBeSaved() payload.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.DIMSE, "calling2", "called2")); payload.State = Payload.PayloadState.Move; - var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(payload).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(Payload)); @@ -103,7 +103,7 @@ public async Task GivenAPayload_WhenRemoveIsCalled_ExpectItToDeleted() payload.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.DIMSE, "calling", "called")); payload.State = Payload.PayloadState.Move; - var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); var added = await store.AddAsync(payload).ConfigureAwait(false); var removed = await store.RemoveAsync(added!).ConfigureAwait(false); @@ -117,7 +117,7 @@ public async Task GivenAPayload_WhenRemoveIsCalled_ExpectItToDeleted() [Fact] public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() { - var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(Payload)); var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); @@ -132,7 +132,7 @@ public async Task GivenAPayload_WhenUpdateIsCalled_ExpectItToSaved() var payload = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = DataService.DIMSE, Destination = "dest", Source = "source" }, 5); payload.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.DIMSE, "source", "dest")); - var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); var added = await store.AddAsync(payload).ConfigureAwait(false); added.State = Payload.PayloadState.Notify; @@ -175,7 +175,7 @@ public async Task GivenPayloadsInDifferentStates_WhenRemovePendingPayloadsAsyncI var payload4 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; var payload5 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; - var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); _ = await store.AddAsync(payload1).ConfigureAwait(false); _ = await store.AddAsync(payload2).ConfigureAwait(false); _ = await store.AddAsync(payload3).ConfigureAwait(false); @@ -206,7 +206,7 @@ public async Task GivenPayloadsInDifferentStates_WhenGetPayloadsInStateAsyncIsCa var payload4 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; var payload5 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; - var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); _ = await store.AddAsync(payload1).ConfigureAwait(false); _ = await store.AddAsync(payload2).ConfigureAwait(false); _ = await store.AddAsync(payload3).ConfigureAwait(false); @@ -226,4 +226,4 @@ public async Task GivenPayloadsInDifferentStates_WhenGetPayloadsInStateAsyncIsCa Assert.Equal(4, result.Count); } } -} \ No newline at end of file +} diff --git a/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index 9529fd6b1..d23a37722 --- a/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; @@ -34,7 +34,7 @@ public class SourceApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -46,7 +46,7 @@ public SourceApplicationEntityRepositoryTest(MongoDatabaseFixture databaseFixtur _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,7 +57,7 @@ public SourceApplicationEntityRepositoryTest(MongoDatabaseFixture databaseFixtur _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -71,7 +71,7 @@ public async Task GivenASourceApplicationEntity_WhenAddingToDatabase_ExpectItToB HostIp = "localhost" }; - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(aet).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(SourceApplicationEntity)); @@ -86,7 +86,7 @@ public async Task GivenASourceApplicationEntity_WhenAddingToDatabase_ExpectItToB [Fact] public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() { - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); Assert.True(result); @@ -101,7 +101,7 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet [Fact] public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() { - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); Assert.NotNull(actual); @@ -115,7 +115,7 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn [Fact] public async Task GivenAETitle_WhenFindByAETitleAsyncIsCalled_ExpectItToReturnMatchingEntity() { - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var actual = await store.FindByAETAsync("AET1").ConfigureAwait(false); Assert.NotNull(actual); @@ -130,7 +130,7 @@ public async Task GivenAETitle_WhenFindByAETitleAsyncIsCalled_ExpectItToReturnMa [Fact] public async Task GivenASourceApplicationEntity_WhenRemoveIsCalled_ExpectItToDeleted() { - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); Assert.NotNull(expected); @@ -146,7 +146,7 @@ public async Task GivenASourceApplicationEntity_WhenRemoveIsCalled_ExpectItToDel [Fact] public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() { - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(SourceApplicationEntity)); var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); @@ -158,7 +158,7 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC [Fact] public async Task GivenASourceApplicationEntity_WhenUpdatedIsCalled_ExpectItToSaved() { - var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); Assert.NotNull(expected); diff --git a/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs old mode 100644 new mode 100755 index 9cf7f5c68..88094129c --- a/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; @@ -37,7 +36,7 @@ public class StorageMetadataWrapperRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -48,7 +47,7 @@ public StorageMetadataWrapperRepositoryTest(MongoDatabaseFixture databaseFixture _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -59,19 +58,18 @@ public StorageMetadataWrapperRepositoryTest(MongoDatabaseFixture databaseFixture _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } [Fact] public void GivenStorageMetadataWrapperRepositoryType_WhenInitialized_TheConstructorShallGuardAllParameters() { - Assert.Throws(() => new StorageMetadataWrapperRepository(null!, null!, null!, null!)); - Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, null!, null!, null!)); - Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, null!, null!)); - Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, null!)); + Assert.Throws(() => new StorageMetadataWrapperRepository(null!, null!, null!)); + Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, null!, null!)); + Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, null!)); - _ = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + _ = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); } [Fact] @@ -79,7 +77,7 @@ public async Task GivenADicomStorageMetadataObject_WhenAddingToDatabase_ExpectIt { var metadata = CreateMetadataObject(); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(metadata).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(StorageMetadataWrapper)); @@ -98,7 +96,7 @@ public async Task GivenANonExistedDicomStorageMetadataObject_WhenSavedToDatabase var metadata1 = CreateMetadataObject(); var metadata2 = CreateMetadataObject(); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddOrUpdateAsync(metadata1).ConfigureAwait(false); await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata2).ConfigureAwait(false)).ConfigureAwait(false); @@ -109,7 +107,7 @@ public async Task GivenAnExistingDicomStorageMetadataObject_WhenUpdated_ExpectIt { var metadata = CreateMetadataObject(); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(metadata).ConfigureAwait(false); metadata.SetWorkflows("A", "B", "C"); metadata.File.SetUploaded("bucket"); @@ -156,7 +154,7 @@ public async Task GivenACorrelationId_WhenGetFileStorageMetdadataIsCalled_Expect "origin"), }; - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); foreach (var item in list) { @@ -188,7 +186,7 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenGetFileStorageMetadadataI "calling", "called"); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddOrUpdateAsync(expected).ConfigureAwait(false); var match = await store.GetFileStorageMetdadataAsync(correlationId, identifier).ConfigureAwait(false); @@ -213,7 +211,7 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalled_Expec "calling", "called"); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(expected).ConfigureAwait(false); var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); Assert.True(result); @@ -231,7 +229,7 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalledWithou var identifier = Guid.NewGuid().ToString(); var pending = CreateMetadataObject(); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(pending).ConfigureAwait(false); var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); @@ -254,7 +252,7 @@ public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_E uploaded.File.SetUploaded("bucket"); uploaded.JsonFile.SetUploaded("bucket"); - var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(pending).ConfigureAwait(false); await store.AddAsync(uploaded).ConfigureAwait(false); @@ -277,4 +275,4 @@ public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_E "calling", "called"); } -} \ No newline at end of file +} diff --git a/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs old mode 100644 new mode 100755 index c526884b8..3f79783ce --- a/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; @@ -34,7 +34,7 @@ public class VirtualApplicationEntityRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -46,7 +46,7 @@ public VirtualApplicationEntityRepositoryTest(MongoDatabaseFixture databaseFixtu _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,7 +57,7 @@ public VirtualApplicationEntityRepositoryTest(MongoDatabaseFixture databaseFixtu _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } @@ -72,7 +72,7 @@ public async Task GivenAVirtualApplicationEntity_WhenAddingToDatabase_ExpectItTo PlugInAssemblies = new List { "AssemblyA", "AssemblyB", "AssemblyC" }, }; - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(aet).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(VirtualApplicationEntity)); @@ -88,7 +88,7 @@ public async Task GivenAVirtualApplicationEntity_WhenAddingToDatabase_ExpectItTo [Fact] public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() { - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var result = await store.ContainsAsync(p => p.VirtualAeTitle == "AET1").ConfigureAwait(false); Assert.True(result); @@ -103,7 +103,7 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet [Fact] public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() { - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); Assert.NotNull(actual); @@ -117,7 +117,7 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn [Fact] public async Task GivenAAETitleName_WhenFindByVirtualAeTitleAsyncIsCalled_ExpectItToReturnMatchingEntity() { - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var actual = await store.FindByAeTitleAsync("AET1").ConfigureAwait(false); Assert.NotNull(actual); @@ -131,7 +131,7 @@ public async Task GivenAAETitleName_WhenFindByVirtualAeTitleAsyncIsCalled_Expect [Fact] public async Task GivenAVirtualApplicationEntity_WhenRemoveIsCalled_ExpectItToDeleted() { - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = await store.FindByAeTitleAsync("AET5").ConfigureAwait(false); Assert.NotNull(expected); @@ -147,7 +147,7 @@ public async Task GivenAVirtualApplicationEntity_WhenRemoveIsCalled_ExpectItToDe [Fact] public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() { - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(VirtualApplicationEntity)); var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); @@ -159,7 +159,7 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC [Fact] public async Task GivenAVirtualApplicationEntity_WhenUpdatedIsCalled_ExpectItToSaved() { - var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = await store.FindByAeTitleAsync("AET3").ConfigureAwait(false); Assert.NotNull(expected); diff --git a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs index 97a554dd0..8b4fee8c8 100755 --- a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -41,7 +40,7 @@ public class DestinationApplicationEntityRepository : IDestinationApplicationEnt public DestinationApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, + IOptions options, IOptions mongoDbOptions) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); @@ -52,7 +51,7 @@ public DestinationApplicationEntityRepository( _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); diff --git a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs index bc376631b..6093a39fa 100755 --- a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs @@ -19,7 +19,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -29,7 +28,7 @@ namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories { - public class DicomAssociationInfoRepository : IDicomAssociationInfoRepository, IDisposable + public class DicomAssociationInfoRepository : MongoDBRepositoryBase, IDicomAssociationInfoRepository, IDisposable { private readonly ILogger _logger; private readonly IServiceScope _scope; @@ -40,22 +39,20 @@ public class DicomAssociationInfoRepository : IDicomAssociationInfoRepository, I public DicomAssociationInfoRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(DicomAssociationInfo)); } @@ -78,6 +75,29 @@ public async Task> ToListAsync(CancellationToken canc }).ConfigureAwait(false); } + public Task> GetAllAsync(int skip, + int? limit, + DateTime startTime, + DateTime endTime, + CancellationToken cancellationToken) + { + var builder = Builders.Filter; + var filter = builder.Empty; + filter &= builder.Where(t => t.DateTimeDisconnected >= startTime.ToUniversalTime()); + filter &= builder.Where(t => t.DateTimeDisconnected <= endTime.ToUniversalTime()); + + return GetAllAsync(_collection, + filter, + Builders.Sort.Descending(x => x.DateTimeDisconnected), + skip, + limit); + } + + public Task CountAsync() + { + return _collection.CountDocumentsAsync(Builders.Filter.Empty); + } + protected virtual void Dispose(bool disposing) { if (!_disposedValue) diff --git a/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs b/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs index 4ca30aaad..d0d58028b 100755 --- a/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs +++ b/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs @@ -21,7 +21,6 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -44,19 +43,18 @@ public class InferenceRequestRepository : InferenceRequestRepositoryBase, IDispo public InferenceRequestRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) : base(logger, options) + IOptions options) : base(logger, options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(InferenceRequest)); CreateIndexes(); } diff --git a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs index d8395992d..4a60cbc16 100755 --- a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -41,22 +40,20 @@ public class MonaiApplicationEntityRepository : IMonaiApplicationEntityRepositor public MonaiApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(MonaiApplicationEntity)); CreateIndexes(); } diff --git a/src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs b/src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs new file mode 100644 index 000000000..06f81a9d0 --- /dev/null +++ b/src/Database/MongoDB/Repositories/MongoDBRepositoryBase.cs @@ -0,0 +1,64 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using MongoDB.Driver; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public abstract class MongoDBRepositoryBase + { + /// + /// Get All T that match filters provided. + /// + /// + /// Collection to run against. + /// Filter function you can filter on properties of T. + /// Function used to sort data. + /// Items to skip. + /// Items to limit results by. + /// + protected static async Task> GetAllAsync(IMongoCollection collection, + Expression>? filterFunction, + SortDefinition sortFunction, + int? skip = null, + int? limit = null) + { + return await collection + .Find(filterFunction) + .Skip(skip) + .Limit(limit) + .Sort(sortFunction) + .ToListAsync().ConfigureAwait(false); + } + + protected static async Task> GetAllAsync(IMongoCollection collection, + FilterDefinition filterFunction, + SortDefinition sortFunction, + int? skip = null, + int? limit = null) + { + var result = await collection + .Find(filterFunction) + .Skip(skip) + .Limit(limit) + .Sort(sortFunction) + .ToListAsync().ConfigureAwait(false); + return result; + } + } +} diff --git a/src/Database/MongoDB/Repositories/PayloadRepository.cs b/src/Database/MongoDB/Repositories/PayloadRepository.cs index e2ead7f56..24c5cb807 100755 --- a/src/Database/MongoDB/Repositories/PayloadRepository.cs +++ b/src/Database/MongoDB/Repositories/PayloadRepository.cs @@ -19,7 +19,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -40,22 +39,21 @@ public class PayloadRepository : IPayloadRepository, IDisposable public PayloadRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) + IOptions options + ) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(Payload)); CreateIndexes(); } diff --git a/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs index 5df8c678b..bbad7fa62 100755 --- a/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -41,22 +40,21 @@ public class SourceApplicationEntityRepository : ISourceApplicationEntityReposit public SourceApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) + IOptions options + ) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(SourceApplicationEntity)); CreateIndexes(); } diff --git a/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs old mode 100644 new mode 100755 index 1186f5a7e..8b66bccb1 --- a/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs +++ b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs @@ -21,7 +21,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -42,22 +41,21 @@ public class StorageMetadataWrapperRepository : StorageMetadataRepositoryBase, I public StorageMetadataWrapperRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) : base(logger) + IOptions options + ) : base(logger) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle(p => p is not ArgumentException).WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(StorageMetadataWrapper)); CreateIndexes(); } diff --git a/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs old mode 100644 new mode 100755 index d895b016a..4e82c6142 --- a/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; @@ -41,22 +40,21 @@ public class VirtualApplicationEntityRepository : IVirtualApplicationEntityRepos public VirtualApplicationEntityRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options, - IOptions mongoDbOptions) + IOptions options + ) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(VirtualApplicationEntity)); CreateIndexes(); } diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs index a494082c4..48fcdd325 100644 --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -173,5 +173,11 @@ public static partial class Log [LoggerMessage(EventId = 8204, Level = LogLevel.Error, Message = "Failed to store FHIR resource.")] public static partial void ErrorStoringFhirResource(this ILogger logger, Exception ex); + + // + // Dicom Associations Controller. + // + [LoggerMessage(EventId = 8300, Level = LogLevel.Error, Message = "Unexpected error occurred in GET /dicom-associations API..")] + public static partial void DicomAssociationsControllerGetError(this ILogger logger, Exception ex); } } diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs old mode 100644 new mode 100755 index 9c3c95336..aaf5d9d91 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -29,7 +29,6 @@ using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database; -using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database; using Monai.Deploy.InformaticsGateway.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; @@ -97,12 +96,13 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => .ConfigureServices((hostContext, services) => { services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway")); + services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:httpEndpointSettings")); services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:messaging")); services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:storage")); services.AddOptions().Bind(hostContext.Configuration.GetSection("MonaiDeployAuthentication")); - services.AddOptions().Bind(hostContext.Configuration.GetSection("InformaticsGateway:plugins")); + services.AddOptions().Bind(hostContext.Configuration.GetSection("plugins")); services.TryAddEnumerable(ServiceDescriptor.Singleton, ConfigurationValidator>()); - services.ConfigureDatabase(hostContext.Configuration?.GetSection("ConnectionStrings"), services.BuildServiceProvider().GetService>()!); + services.ConfigureDatabase(hostContext.Configuration?.GetSection("ConnectionStrings"), hostContext.Configuration?.GetSection("plugins"), services.BuildServiceProvider().GetService()!); services.AddTransient(); services.AddTransient(); @@ -168,6 +168,7 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddHostedService(p => p.GetService()); services.AddHostedService(p => p.GetService()); #pragma warning restore CS8603 // Possible null reference return. + }) .ConfigureWebHostDefaults(webBuilder => { diff --git a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs old mode 100644 new mode 100755 index fd317a0e4..33d72b186 --- a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs @@ -25,6 +25,7 @@ using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Logging; + namespace Monai.Deploy.InformaticsGateway.Services.Common { internal class OutputDataPlugInEngine : IOutputDataPlugInEngine diff --git a/src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs b/src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs new file mode 100644 index 000000000..00fa1d355 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/PagedResponse.cs @@ -0,0 +1,107 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Monai.Deploy.InformaticsGateway.Services.UriService; + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + /// + /// Paged Response for use with pagination's. + /// + /// Type of response. + public class PagedResponse : Response + { + /// + /// Initializes a new instance of the class. + /// + /// Response Data. + /// Page number. + /// Page size. + public PagedResponse(T data, int pageNumber, int pageSize) + { + PageNumber = pageNumber; + PageSize = pageSize; + Data = data; + Message = null; + Succeeded = true; + Errors = null; + } + + /// + /// Gets or sets PageNumber. + /// + public int PageNumber { get; set; } + + /// + /// Gets or sets PageSize. + /// + public int PageSize { get; set; } + + /// + /// Gets or sets FirstPage. + /// + public string? FirstPage { get; set; } + + /// + /// Gets or sets LastPage. + /// + public string? LastPage { get; set; } + + /// + /// Gets or sets TotalPages. + /// + public int TotalPages { get; set; } + + /// + /// Gets or sets TotalRecords. + /// + public long TotalRecords { get; set; } + + /// + /// Gets or sets NextPage. + /// + public string? NextPage { get; set; } + + /// + /// Gets or sets previousPage. + /// + public string? PreviousPage { get; set; } + + public void SetUp(PaginationFilter validFilter, long totalRecords, IUriService uriService, string route) + { + var totalPages = (double)totalRecords / PageSize; + var roundedTotalPages = Convert.ToInt32(Math.Ceiling(totalPages)); + + var pageNumber = validFilter.PageNumber ?? 0; + NextPage = + pageNumber >= 1 && pageNumber < roundedTotalPages + ? uriService.GetPageUriString(new PaginationFilter(pageNumber + 1, PageSize), route) + : null; + + PreviousPage = + pageNumber - 1 >= 1 && pageNumber <= roundedTotalPages + ? uriService.GetPageUriString(new PaginationFilter(pageNumber - 1, PageSize), route) + : null; + + FirstPage = uriService.GetPageUriString(new PaginationFilter(1, PageSize), route); + LastPage = uriService.GetPageUriString(new PaginationFilter(roundedTotalPages, PageSize), route); + TotalPages = roundedTotalPages; + TotalRecords = totalRecords; + } + } +} diff --git a/src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs b/src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs new file mode 100644 index 000000000..9183c2005 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/PaginationFilter.cs @@ -0,0 +1,58 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + /// + /// Pagination Filter class. + /// + public class PaginationFilter + { + /// + /// Initializes a new instance of the class. + /// + public PaginationFilter() + { + PageNumber = 1; + PageSize = null; + } + + /// + /// Initializes a new instance of the class. + /// + /// Page size with limit set in the config. + /// Page size 1 or above. + /// Max page size. + public PaginationFilter(int pageNumber, int pageSize, int maxPageSize = 10) + { + PageNumber = pageNumber < 1 ? 1 : pageNumber; + PageSize = pageSize > maxPageSize ? maxPageSize : pageSize; + } + + /// + /// Gets or sets page number. + /// + public int? PageNumber { get; set; } + + /// + /// Gets or sets page size. + /// + public int? PageSize { get; set; } + + public int GetSkip() => (PageNumber - 1) * PageSize ?? 0; + } +} diff --git a/src/InformaticsGateway/Services/Common/Pagination/Response.cs b/src/InformaticsGateway/Services/Common/Pagination/Response.cs new file mode 100644 index 000000000..ba0bec7b9 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/Response.cs @@ -0,0 +1,67 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + /// + /// Response object. + /// + /// Type of response data. + public class Response + { + /// + /// Initializes a new instance of the class. + /// + public Response() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Response data. + public Response(T data) + { + Succeeded = true; + Message = string.Empty; + Errors = Array.Empty(); + Data = data; + } + + /// + /// Gets or sets Data. + /// + public T? Data { get; set; } + + /// + /// Gets or sets a value indicating whether response has succeeded. + /// + public bool Succeeded { get; set; } + + /// + /// Gets or sets errors. + /// + public string[]? Errors { get; set; } = Array.Empty(); + + /// + /// Gets or sets message. + /// + public string? Message { get; set; } + } +} diff --git a/src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs b/src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs new file mode 100644 index 000000000..20f09e962 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/Pagination/TimeFilter.cs @@ -0,0 +1,51 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Monai.Deploy.InformaticsGateway.Services.Common.Pagination +{ + public class TimeFilter : PaginationFilter + { + public TimeFilter() + { + } + + public TimeFilter(DateTime? startTime, + DateTime? endTime, + int pageNumber, + int pageSize, + int maxPageSize) : base(pageNumber, + pageSize, + maxPageSize) + { + if (endTime == default) + { + EndTime = DateTime.Now; + } + + if (startTime == default) + { + StartTime = new DateTime(2023, 1, 1); + } + } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } + } +} diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs old mode 100644 new mode 100755 index 61507b616..d32f7ec3d --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -131,6 +131,10 @@ private void SetupPolling() private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) { + using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { + { "ThreadId", Environment.CurrentManagedThreadId }, + }); + if (!_storageInfoProvider.HasSpaceAvailableForExport) { _logger.ExportServiceStoppedDueToLowStorageSpace(_storageInfoProvider.AvailableFreeSpace); @@ -275,6 +279,10 @@ private IEnumerable DownloadPayloadActionCallback(Expo private async Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) { + using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { + { "WorkflowInstanceId", exportDataRequest.WorkflowInstanceId }, + { "TaskId", exportDataRequest.ExportTaskId } + }); var outputDataEngine = _scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IOutputDataPlugInEngine)); outputDataEngine.Configure(exportDataRequest.PlugInAssemblies); diff --git a/src/InformaticsGateway/Services/Http/ApiControllerBase.cs b/src/InformaticsGateway/Services/Http/ApiControllerBase.cs new file mode 100644 index 000000000..6ecd5050f --- /dev/null +++ b/src/InformaticsGateway/Services/Http/ApiControllerBase.cs @@ -0,0 +1,51 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Net; +using Microsoft.AspNetCore.Mvc; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + /// + /// Base Api Controller. + /// + [ApiController] + public class ApiControllerBase : ControllerBase + { + /// + /// Initializes a new instance of the class. + /// + public ApiControllerBase() + { + } + + /// + /// Gets internal Server Error 500. + /// + public static int InternalServerError => (int)HttpStatusCode.InternalServerError; + + /// + /// Gets bad Request 400. + /// + public static new int BadRequest => (int)HttpStatusCode.BadRequest; + + /// + /// Gets notFound 404. + /// + public static new int NotFound => (int)HttpStatusCode.NotFound; + } +} diff --git a/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs new file mode 100644 index 000000000..d794cecff --- /dev/null +++ b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs @@ -0,0 +1,91 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; +using Monai.Deploy.InformaticsGateway.Services.UriService; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [Route("dicom-associations")] + public class DicomAssociationInfoController : PagedApiControllerBase + { + private const string Endpoint = "/dicom-associations"; + private readonly ILogger _logger; + private readonly IDicomAssociationInfoRepository _dicomRepo; + private readonly IUriService _uriService; + + public DicomAssociationInfoController(ILogger logger, + IOptions options, + IDicomAssociationInfoRepository dicomRepo, + IUriService uriService) : base(options) + { + _logger = logger; + _dicomRepo = dicomRepo; + _uriService = uriService; + } + + /// + /// Gets a paged response list of all workflows. + /// + /// Filters. + /// paged response of subset of all workflows. + [HttpGet] + [ProducesResponseType(typeof(PagedResponse>), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] + public async Task GetAllAsync([FromQuery] TimeFilter filter) + { + try + { + var route = Request?.Path.Value ?? string.Empty; + var pageSize = filter.PageSize ?? EndpointOptions.Value.DefaultPageSize; + var validFilter = new TimeFilter( + filter.StartTime, + filter.EndTime, + filter.PageNumber ?? 0, + pageSize, + EndpointOptions.Value.MaxPageSize); + + var pagedData = await _dicomRepo.GetAllAsync( + validFilter.GetSkip(), + validFilter.PageSize, + filter.StartTime!.Value, + filter.EndTime!.Value, default).ConfigureAwait(false); + + var dataTotal = await _dicomRepo.CountAsync().ConfigureAwait(false); + var pagedResponse = CreatePagedResponse(pagedData.ToList(), validFilter, dataTotal, _uriService, route); + return Ok(pagedResponse); + } + catch (Exception e) + { + _logger.DicomAssociationsControllerGetError(e); + return Problem($"Unexpected error occurred: {e.Message}", Endpoint, InternalServerError); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs b/src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs new file mode 100644 index 000000000..09db23ea7 --- /dev/null +++ b/src/InformaticsGateway/Services/Http/PagedApiControllerBase.cs @@ -0,0 +1,61 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Ardalis.GuardClauses; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; +using Monai.Deploy.InformaticsGateway.Services.UriService; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + public class PagedApiControllerBase : ApiControllerBase + { + protected readonly IOptions EndpointOptions; + + public PagedApiControllerBase(IOptions options) + { + EndpointOptions = options ?? throw new ArgumentNullException(nameof(options)); + } + + /// + /// Creates a pagination paged response. + /// + /// Data set type. + /// Data set. + /// Filters. + /// Total records. + /// Uri service. + /// Route. + /// Returns . + public PagedResponse> CreatePagedResponse(IEnumerable pagedData, PaginationFilter validFilter, long totalRecords, IUriService uriService, string route) + { + Guard.Against.Null(pagedData, nameof(pagedData)); + Guard.Against.Null(validFilter, nameof(validFilter)); + Guard.Against.Null(route, nameof(route)); + Guard.Against.Null(uriService, nameof(uriService)); + + var pageSize = validFilter.PageSize ?? EndpointOptions.Value.DefaultPageSize; + var response = new PagedResponse>(pagedData, validFilter.PageNumber ?? 0, pageSize); + + response.SetUp(validFilter, totalRecords, uriService, route); + return response; + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs old mode 100644 new mode 100755 index 19e302a99..f41d63966 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -103,7 +103,7 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string if (!AcceptsSopClass(uids.SopClassUid)) { _logger.InstanceIgnoredWIthMatchingSopClassUid(request.SOPClassUID.UID); - return null; + return string.Empty; } var dicomInfo = new DicomFileStorageMetadata(associationId.ToString(), uids.Identifier, uids.StudyInstanceUid, uids.SeriesInstanceUid, uids.SopInstanceUid, DataService.DIMSE, callingAeTitle, calledAeTitle); @@ -115,6 +115,8 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string var result = await _pluginEngine.ExecutePlugInsAsync(request.File, dicomInfo).ConfigureAwait(false); + using var scope = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); + dicomInfo = (result.Item2 as DicomFileStorageMetadata)!; var dicomFile = result.Item1; await dicomInfo.SetDataStreams(dicomFile, dicomFile.ToJson(_dicomJsonOptions, _validateDicomValueOnJsonSerialization), _options.Value.Storage.TemporaryDataStorage, _fileSystem, _options.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); @@ -167,4 +169,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs old mode 100644 new mode 100755 index f30ba056e..778266cd2 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Concurrent; +using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; using FellowOakDicom.Network; @@ -114,7 +115,13 @@ private async Task HandleInstance(DicomCStoreRequest request, string cal { var uids = _dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - using (_logger.BeginScope(new LoggingDataDictionary() { { "SOPInstanceUID", uids.SopInstanceUid }, { "CorrelationId", associationId } })) + using (_logger.BeginScope(new LoggingDataDictionary() { + { "SOPInstanceUID", uids.SopInstanceUid }, + { "CorrelationId", associationId }, + { "calledAeTitle", calledAeTitle}, + { "callingAeTitle",callingAeTitle}, + { "ThreadId", Environment.CurrentManagedThreadId} + })) { _logger.InstanceInformation(uids.StudyInstanceUid, uids.SeriesInstanceUid); diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs old mode 100644 new mode 100755 index 1fe1f6694..0ee55a106 --- a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs @@ -74,7 +74,7 @@ public void OnConnectionClosed(Exception exception) var repo = _associationDataProvider!.GetService(); _associationInfo.Disconnect(); repo?.AddAsync(_associationInfo).Wait(); - _logger.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); + _logger?.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); } catch (Exception ex) { diff --git a/src/InformaticsGateway/Services/UriService/IUriService.cs b/src/InformaticsGateway/Services/UriService/IUriService.cs new file mode 100644 index 000000000..6fc38e20e --- /dev/null +++ b/src/InformaticsGateway/Services/UriService/IUriService.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; + +namespace Monai.Deploy.InformaticsGateway.Services.UriService +{ + /// + /// Uri Service. + /// + public interface IUriService + { + /// + /// Gets Relative Uri path with filters as a string. + /// + /// Filters. + /// Route. + /// Relative Uri string. + public string GetPageUriString(PaginationFilter filter, string route); + } +} diff --git a/src/InformaticsGateway/Services/UriService/UriService.cs b/src/InformaticsGateway/Services/UriService/UriService.cs new file mode 100644 index 000000000..28f78488c --- /dev/null +++ b/src/InformaticsGateway/Services/UriService/UriService.cs @@ -0,0 +1,60 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Microsoft.AspNetCore.WebUtilities; +using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; + +namespace Monai.Deploy.InformaticsGateway.Services.UriService +{ + /// + /// Uri Service. + /// + public class UriService : IUriService + { + private readonly Uri _baseUri; + + /// + /// Initializes a new instance of the class. + /// + /// Base Url. + public UriService(Uri baseUri) + { + _baseUri = baseUri; + } + + /// + /// Gets page uri. + /// + /// Filters. + /// Route. + /// Uri. + public string GetPageUriString(PaginationFilter filter, string route) + { + if (_baseUri.ToString().EndsWith('/') && route.StartsWith('/')) + { + route = route.TrimStart('/'); + } + + var endpointUri = new Uri(string.Concat(_baseUri, route)); + var modifiedUri = QueryHelpers.AddQueryString(endpointUri.ToString(), "pageNumber", filter.PageNumber.ToString()!); + modifiedUri = QueryHelpers.AddQueryString(modifiedUri, "pageSize", filter?.PageSize?.ToString() ?? string.Empty); + var uri = new Uri(modifiedUri); + return uri.IsAbsoluteUri ? uri.PathAndQuery : uri.OriginalString; + } + } +} diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj old mode 100644 new mode 100755 index 5e9d5db60..9680120d1 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -1,4 +1,4 @@ - diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json old mode 100644 new mode 100755 index 44e4aa02a..4a0a986ed --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -1768,6 +1768,7 @@ "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs b/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs old mode 100644 new mode 100755 index 311eaa145..5f1692e35 --- a/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs @@ -16,6 +16,7 @@ using Ardalis.GuardClauses; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Database.Api; @@ -24,25 +25,35 @@ namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database { public class DatabaseRegistrar : DatabaseRegistrationBase { - public override IServiceCollection Configure(IServiceCollection services, DatabaseType databaseType, string? connectionString, ILogger logger) + public override IServiceCollection Configure( + IServiceCollection services, + DatabaseType databaseType, + IConfigurationSection? connectionstringConfigurationSection, + IConfigurationSection? pluginsConfigurationSection, + ILoggerFactory loggerFactory) { Guard.Against.Null(services, nameof(services)); + Guard.Against.Null(connectionstringConfigurationSection, nameof(connectionstringConfigurationSection)); + + var logger = loggerFactory.CreateLogger(); switch (databaseType) { case DatabaseType.EntityFramework: - Guard.Against.Null(connectionString, nameof(connectionString)); - services.AddDbContext(options => options.UseSqlite(connectionString), ServiceLifetime.Transient); + + services.AddDbContext(options => options.UseSqlite(connectionstringConfigurationSection[SR.DatabaseConnectionStringKey]), ServiceLifetime.Transient); services.AddScoped(); logger.AddedDbScope("IDatabaseMigrationManagerForPlugIns", "EntityFramework"); - services.AddScoped(typeof(IRemoteAppExecutionRepository), typeof(EntityFramework.RemoteAppExecutionRepository)); + services.AddScoped(); logger.AddedDbScope("IRemoteAppExecutionRepository", "EntityFramework"); break; case DatabaseType.MongoDb: + Guard.Against.Null(pluginsConfigurationSection, nameof(pluginsConfigurationSection)); + services.Configure(connectionstringConfigurationSection.GetSection("DatabaseOptions")); services.AddScoped(); logger.AddedDbScope("IDatabaseMigrationManagerForPlugIns", "MongoDb"); - services.AddScoped(typeof(IRemoteAppExecutionRepository), typeof(MongoDb.RemoteAppExecutionRepository)); + services.AddScoped(); logger.AddedDbScope("IRemoteAppExecutionRepository", "MongoDb"); break; } diff --git a/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs b/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs old mode 100644 new mode 100755 index 6f34c5923..f5b34550c --- a/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Polly; using Polly.Retry; @@ -41,7 +41,7 @@ public class RemoteAppExecutionRepository : IRemoteAppExecutionRepository, IDisp public RemoteAppExecutionRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); @@ -51,7 +51,7 @@ public RemoteAppExecutionRepository( _scope = serviceScopeFactory.CreateScope(); _dbContext = _scope.ServiceProvider.GetRequiredService(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); _dataset = _dbContext.Set(); } diff --git a/src/Plug-ins/RemoteAppExecution/Database/IRemoteAppExecutionRepository.cs b/src/Plug-ins/RemoteAppExecution/Database/IRemoteAppExecutionRepository.cs old mode 100644 new mode 100755 diff --git a/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs b/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs old mode 100644 new mode 100755 index 41aec37b8..217de356d --- a/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs @@ -18,7 +18,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using MongoDB.Driver; @@ -29,30 +28,30 @@ namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.Mo { public class RemoteAppExecutionRepository : IRemoteAppExecutionRepository, IDisposable { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly IServiceScope _scope; private readonly AsyncRetryPolicy _retryPolicy; private readonly IMongoCollection _collection; private bool _disposedValue; - public RemoteAppExecutionRepository(IServiceScopeFactory serviceScopeFactory, - ILogger logger, - IOptions options, - IOptions mongoDbOptions) + public RemoteAppExecutionRepository( + IServiceScopeFactory serviceScopeFactory, + ILoggerFactory loggerFactory, + IOptions options + ) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(options, nameof(options)); - Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _logger = loggerFactory.CreateLogger(); _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( - options.Value.Database.Retries.RetryDelays, + options.Value.Retries.RetryDelays, (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); - var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); _collection = mongoDatabase.GetCollection(nameof(RemoteAppExecution)); CreateIndexes(); } diff --git a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs old mode 100644 new mode 100755 index 46d4a0c9c..df05b40ce --- a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs @@ -53,52 +53,59 @@ public DicomDeidentifier( public async Task<(DicomFile dicomFile, ExportRequestDataMessage exportRequestDataMessage)> ExecuteAsync(DicomFile dicomFile, ExportRequestDataMessage exportRequestDataMessage) { - Guard.Against.Null(dicomFile, nameof(dicomFile)); - Guard.Against.Null(exportRequestDataMessage, nameof(exportRequestDataMessage)); + try + { + Guard.Against.Null(dicomFile, nameof(dicomFile)); + Guard.Against.Null(exportRequestDataMessage, nameof(exportRequestDataMessage)); - var tags = Utilities.GetTagArrayFromStringArray(_options.RemoteAppConfigurations[SR.ConfigKey_ReplaceTags]); - var studyInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); - var seriesInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID); + var tags = Utilities.GetTagArrayFromStringArray(_options.RemoteAppConfigurations[SR.ConfigKey_ReplaceTags]); + var studyInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); + var seriesInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID); - var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService(); + var scope = _serviceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); - var existing = await repository.GetAsync(exportRequestDataMessage.WorkflowInstanceId, exportRequestDataMessage.ExportTaskId, studyInstanceUid, seriesInstanceUid).ConfigureAwait(false); + var existing = await repository.GetAsync(exportRequestDataMessage.WorkflowInstanceId, exportRequestDataMessage.ExportTaskId, studyInstanceUid, seriesInstanceUid).ConfigureAwait(false); - var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid); + var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid); - newRecord.OriginalValues.Add(DicomTag.StudyInstanceUID.ToString(), studyInstanceUid); - newRecord.OriginalValues.Add(DicomTag.SeriesInstanceUID.ToString(), seriesInstanceUid); - newRecord.OriginalValues.Add(DicomTag.SOPInstanceUID.ToString(), dicomFile.Dataset.GetSingleValue(DicomTag.SOPInstanceUID)); + newRecord.OriginalValues.Add(DicomTag.StudyInstanceUID.ToString(), studyInstanceUid); + newRecord.OriginalValues.Add(DicomTag.SeriesInstanceUID.ToString(), seriesInstanceUid); + newRecord.OriginalValues.Add(DicomTag.SOPInstanceUID.ToString(), dicomFile.Dataset.GetSingleValue(DicomTag.SOPInstanceUID)); - dicomFile.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, newRecord.StudyInstanceUid); - dicomFile.Dataset.AddOrUpdate(DicomTag.SeriesInstanceUID, newRecord.SeriesInstanceUid); - dicomFile.Dataset.AddOrUpdate(DicomTag.SOPInstanceUID, newRecord.SopInstanceUid); + dicomFile.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, newRecord.StudyInstanceUid); + dicomFile.Dataset.AddOrUpdate(DicomTag.SeriesInstanceUID, newRecord.SeriesInstanceUid); + dicomFile.Dataset.AddOrUpdate(DicomTag.SOPInstanceUID, newRecord.SopInstanceUid); - foreach (var tag in tags) - { - if (tag.Equals(DicomTag.StudyInstanceUID) || - tag.Equals(DicomTag.SeriesInstanceUID) || - tag.Equals(DicomTag.SOPInstanceUID)) + foreach (var tag in tags) { - continue; - } + if (tag.Equals(DicomTag.StudyInstanceUID) || + tag.Equals(DicomTag.SeriesInstanceUID) || + tag.Equals(DicomTag.SOPInstanceUID)) + { + continue; + } - if (dicomFile.Dataset.TryGetString(tag, out var value)) - { - newRecord.OriginalValues.Add(tag.ToString(), value); - var newValue = Utilities.GetTagProxyValue(tag); - if (newValue != null) + if (dicomFile.Dataset.TryGetString(tag, out var value)) { - dicomFile.Dataset.AddOrUpdate(tag, newValue); - _logger.ValueChanged(tag.ToString(), value, newValue); + newRecord.OriginalValues.Add(tag.ToString(), value); + var newValue = Utilities.GetTagProxyValue(tag); + if (newValue != null) + { + dicomFile.Dataset.AddOrUpdate(tag, newValue); + _logger.ValueChanged(tag.ToString(), value, newValue); + } } } - } - await repository.AddAsync(newRecord).ConfigureAwait(false); + await repository.AddAsync(newRecord).ConfigureAwait(false); - return (dicomFile, exportRequestDataMessage); + return (dicomFile, exportRequestDataMessage); + } + catch (Exception) + { + throw; + } } } } diff --git a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj old mode 100644 new mode 100755 index 7f200a04f..bf2bc0cd2 --- a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj +++ b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj @@ -57,6 +57,7 @@ + diff --git a/src/Plug-ins/RemoteAppExecution/SR.cs b/src/Plug-ins/RemoteAppExecution/SR.cs index 1aa1395ae..09cbe4b45 100644 --- a/src/Plug-ins/RemoteAppExecution/SR.cs +++ b/src/Plug-ins/RemoteAppExecution/SR.cs @@ -19,5 +19,9 @@ namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution internal static class SR { public const string ConfigKey_ReplaceTags = "ReplaceTags"; + + public const string DatabaseConnectionStringKey = "InformaticsGatewayDatabase"; + + public const string DatabaseNameKey = "DatabaseName"; } } diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs old mode 100644 new mode 100755 index a6e623650..da6b6c540 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs @@ -14,7 +14,9 @@ * limitations under the License. */ +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.EntityFramework; @@ -35,7 +37,21 @@ public void GivenEntityFrameworkDatabaseType_WhenConfigureIsCalled_AddsDependenc serviceCollection.Setup(p => p.GetEnumerator()).Returns(serviceDescriptors.GetEnumerator()); var registrar = new DatabaseRegistrar(); - var returnedServiceCollection = registrar.Configure(serviceCollection.Object, DatabaseType.EntityFramework, "DataSource=file::memory:?cache=shared", new Mock().Object); + var configInMemory = new Dictionary { + { "top:InformaticsGatewayDatabase","DataSource=file::memory:?cache=shared"}, + }; + + IConfiguration configuration = new ConfigurationBuilder().AddInMemoryCollection(configInMemory).Build(); + + var loggerMock = new Mock(); + var loggerFactoryMock = new Mock(); + loggerFactoryMock.Setup(f => f.CreateLogger(It.IsAny())).Returns(loggerMock.Object); + + var returnedServiceCollection = registrar.Configure( + serviceCollection.Object, + DatabaseType.EntityFramework, + configuration.GetSection("top"), + configuration.GetSection("top"), loggerFactoryMock.Object); Assert.Same(serviceCollection.Object, returnedServiceCollection); @@ -54,11 +70,24 @@ public void GivenMongoDatabaseType_WhenConfigureIsCalled_AddsDependencies() serviceCollection.Setup(p => p.GetEnumerator()).Returns(serviceDescriptors.GetEnumerator()); var registrar = new DatabaseRegistrar(); - var returnedServiceCollection = registrar.Configure(serviceCollection.Object, DatabaseType.MongoDb, "DataSource=file::memory:?cache=shared", new Mock().Object); + var configInMemory = new Dictionary { + { "top:InformaticsGatewayDatabase","DataSource=file::memory:?cache=shared"}, + }; + + var loggerMock = new Mock(); + var loggerFactoryMock = new Mock(); + loggerFactoryMock.Setup(f => f.CreateLogger(It.IsAny())).Returns(loggerMock.Object); + + IConfiguration configuration = new ConfigurationBuilder().AddInMemoryCollection(configInMemory).Build(); + var returnedServiceCollection = registrar.Configure( + serviceCollection.Object, + DatabaseType.MongoDb, + configuration.GetSection("top"), + configuration.GetSection("top"), + loggerFactoryMock.Object); Assert.Same(serviceCollection.Object, returnedServiceCollection); - serviceCollection.Verify(p => p.Add(It.IsAny()), Times.Exactly(2)); serviceCollection.Verify(p => p.Add(It.Is(p => p.ServiceType == typeof(IDatabaseMigrationManagerForPlugIns) && p.ImplementationType == typeof(MongoDbTypes.MigrationManager))), Times.Once()); serviceCollection.Verify(p => p.Add(It.Is(p => p.ServiceType == typeof(IRemoteAppExecutionRepository) && p.ImplementationType == typeof(MongoDbTypes.RemoteAppExecutionRepository))), Times.Once()); } diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs old mode 100644 new mode 100755 index 1ba57f920..ebdc4b4f2 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.EntityFramework; using Moq; using Xunit; @@ -33,7 +33,7 @@ public class RemoteAppExecutionRepositoryTest private readonly Mock _serviceScopeFactory; private readonly Mock> _logger; - private readonly IOptions _options; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -45,7 +45,7 @@ public RemoteAppExecutionRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory = new Mock(); _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _options = Options.Create(new DatabaseOptions()); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -56,7 +56,7 @@ public RemoteAppExecutionRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs old mode 100644 new mode 100755 diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs old mode 100644 new mode 100755 index 34ef85388..d6e82104a --- a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.MongoDb; using MongoDB.Driver; using Moq; @@ -33,8 +33,8 @@ public class RemoteAppExecutionRepositoryTest private readonly MongoDatabaseFixture _databaseFixture; private readonly Mock _serviceScopeFactory; - private readonly Mock> _logger; - private readonly IOptions _options; + private readonly Mock _logger; + private readonly IOptions _options; private readonly Mock _serviceScope; private readonly IServiceProvider _serviceProvider; @@ -45,8 +45,8 @@ public RemoteAppExecutionRepositoryTest(MongoDatabaseFixture databaseFixture) _databaseFixture.InitDatabaseWithRemoteAppExecutions(); _serviceScopeFactory = new Mock(); - _logger = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); + _logger = new Mock(); + _options = _databaseFixture.Options; _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -57,8 +57,7 @@ public RemoteAppExecutionRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; - _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; } [Fact] @@ -82,7 +81,7 @@ public async Task GivenARemoteAppExecution_WhenAddingToDatabase_ExpectItToBeSave record.OriginalValues.Add(DicomTag.AccessionNumber.ToString(), Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16)); record.OriginalValues.Add(DicomTag.StudyDescription.ToString(), Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16)); - var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(record).ConfigureAwait(false); var collection = _databaseFixture.Database.GetCollection(nameof(RemoteAppExecution)); @@ -99,7 +98,7 @@ public async Task GivenARemoteAppExecution_WhenAddingToDatabase_ExpectItToBeSave [Fact] public async Task GivenARemoteAppExecution_WhenRemoveIsCalled_ExpectItToDeleted() { - var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var record = _databaseFixture.RemoteAppExecutions.First(); var expected = await store.GetAsync(record.SopInstanceUid).ConfigureAwait(false); @@ -116,7 +115,7 @@ public async Task GivenARemoteAppExecution_WhenRemoveIsCalled_ExpectItToDeleted( [Fact] public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithSopInstanceUid_ExpectItToBeReturned() { - var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); var actual = await store.GetAsync(expected.SopInstanceUid).ConfigureAwait(false); @@ -135,7 +134,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithSopInstanceUi [Fact] public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithStudyAndSeriesUids_ExpectItToBeReturned() { - var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, expected.SeriesInstanceUid).ConfigureAwait(false); @@ -154,7 +153,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithStudyAndSerie [Fact] public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithRandomSeries_ExpectItToBeReturned() { - var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, DicomUIDGenerator.GenerateDerivedFromUUID().UID).ConfigureAwait(false); diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json old mode 100644 new mode 100755 index 72f1be0f6..0b7eadaf0 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -247,6 +247,14 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -372,6 +380,18 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, "Microsoft.Extensions.Primitives": { "type": "Transitive", "resolved": "6.0.0", @@ -1574,14 +1594,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } @@ -1595,7 +1615,8 @@ "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", "MongoDB.Driver": "[2.21.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json old mode 100644 new mode 100755 index 7987e2e28..f55ec8cb2 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -83,6 +83,19 @@ "System.Text.Json": "6.0.0" } }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, "MongoDB.Driver": { "type": "Direct", "requested": "[2.21.0, )", @@ -232,6 +245,14 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -567,14 +588,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs old mode 100644 new mode 100755 index 313ab7719..78a5240e7 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -82,7 +82,8 @@ public static void Init(ISpecFlowOutputHelper outputHelper) s_storescu = new DicomCStoreDataClient(Configurations.Instance, s_options.Value, outputHelper); s_informaticsGatewayClient = new InformaticsGatewayClient(HttpClientFactory.Create(), scope.ServiceProvider.GetRequiredService>()); s_informaticsGatewayClient.ConfigureServiceUris(new Uri(Configurations.Instance.InformaticsGatewayOptions.ApiEndpoint)); - + s_options.Value.Dicom.Scu.MaximumNumberOfAssociations = 1; + s_options.Value.DicomWeb.MaximumNumberOfConnection = 1; var serviceLocator = scope.ServiceProvider.GetRequiredService(); s_informaticsGatewayHost.Start(); @@ -146,7 +147,7 @@ private static IDatabaseDataProvider GetDatabase(IServiceProvider serviceProvide else if (dbType == DatabaseManager.DbType_MongoDb) { var connectionString = config.GetSection("ConnectionStrings:InformaticsGatewayDatabase").Value; - var databaseName = config.GetSection("ConnectionStrings:DatabaseName").Value; + var databaseName = config.GetSection("ConnectionStrings:DatabaseOptions:DatabaseName").Value; return new MongoDBDataProvider(outputHelper, Configurations.Instance, connectionString, databaseName); } diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs old mode 100644 new mode 100755 index f5c96b6ff..7335e4faa --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -28,6 +28,8 @@ using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; using Monai.Deploy.Messaging.RabbitMQ; +using Polly; +using Polly.Timeout; namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions { @@ -139,6 +141,7 @@ public async Task AStudyThatIsExportedToTheTestHost() [When(@"the study is received and sent back to Informatics Gateway")] public async Task TheStudyIsReceivedAndSentBackToInformaticsGateway() { + // setup DICOM Source try { @@ -190,6 +193,24 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit } } + var timeoutPolicy = Policy.TimeoutAsync(30, TimeoutStrategy.Pessimistic); + await timeoutPolicy + .ExecuteAsync( + async () => { await SendRequest(); } + ); + + // Clear workflow request messages + _receivedWorkflowRequestMessages.ClearMessages(); + + _dataProvider.DimseRsponse.Should().Be(DicomStatus.Success); + + // Wait for workflow request events + (await _receivedWorkflowRequestMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedWorkflowRequestMessages.Messages, 1); + } + + private async Task SendRequest() + { // Wait for export completed event (await _receivedExportCompletedMessages.WaitforAsync(1, DicomScpWaitTimeSpan)).Should().BeTrue(); @@ -215,15 +236,6 @@ await storeScu.SendAsync( host, port, MonaiAeTitle); - - // Clear workflow request messages - _receivedWorkflowRequestMessages.ClearMessages(); - - _dataProvider.DimseRsponse.Should().Be(DicomStatus.Success); - - // Wait for workflow request events - (await _receivedWorkflowRequestMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); - _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedWorkflowRequestMessages.Messages, 1); } [Then(@"ensure the original study and the received study are the same")] diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json old mode 100644 new mode 100755 index 20a508424..4268c4f29 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -2,10 +2,24 @@ "MonaiDeployAuthentication": { "BypassAuthentication": true }, + "plugins": { + "remoteApp": { + "ReplaceTags": "AccessionNumber, StudyDescription, SeriesDescription, PatientAddress, PatientAge, PatientName" + } + }, "ConnectionStrings": { "Type": "mongodb", "InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", - "DatabaseName": "InformaticsGateway" + "DatabaseOptions": { + "DatabaseName": "InformaticsGateway", + "retries": { + "delays": [ + "750", + "1201", + "2500" + ] + } + } }, "InformaticsGateway": { "dicom": { @@ -68,11 +82,6 @@ "maximumNumberOfConnections": 10, "clientTimeout": 60000, "sendAck": true - }, - "plugins": { - "remoteApp": { - "ReplaceTags": "AccessionNumber, StudyDescription, SeriesDescription, PatientAddress, PatientAge, PatientName" - } } }, "Kestrel": { diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json old mode 100644 new mode 100755 index 20a6e26b9..e3521b080 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -226,6 +226,16 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, + "AideDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0034", + "contentHash": "BIDkrOEagPLrPWAgHcz1AQfrZAUkZG8mhwCJZjLszM5htrHItVihJc9nlqmSry7n/WOQ7nXouxScgZMlMSCYBQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -413,6 +423,15 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -425,6 +444,17 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -500,6 +530,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -542,6 +600,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -1941,6 +2048,24 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AideDicomTools": "[0.1.1-rc0034, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.Extensions.Configuration": "[6.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.3, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -2059,6 +2184,7 @@ "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", From 0b4530ead46f6d3ae6e13eb3101a1d9eb0326da1 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 5 Oct 2023 15:01:36 +0100 Subject: [PATCH 11/75] fix silly mistake Signed-off-by: Neil South --- .../Test/Services/Common/InputDataPluginEngineFactoryTest.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs index 792c33039..d643ad4ea 100755 --- a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs @@ -57,13 +57,12 @@ public void RegisteredPlugIns_WhenCalled_ReturnsListOfPlugIns() _output.WriteLine($"result now = {JsonSerializer.Serialize(result)}"); - Assert.Equal(3, result.Length); - Assert.Collection(result, p => VerifyPlugIn(p, typeof(DicomReidentifier)), p => VerifyPlugIn(p, typeof(TestInputDataPlugInAddWorkflow)), - p => VerifyPlugIn(p, typeof(TestInputDataPlugInResumeWorkflow)), p => VerifyPlugIn(p, typeof(TestInputDataPlugInModifyDicomFile)), + p => VerifyPlugIn(p, typeof(TestInputDataPlugInResumeWorkflow)), + p => VerifyPlugIn(p, typeof(TestInputDataPlugInVirtualAE))); _logger.VerifyLogging($"{typeof(IInputDataPlugIn).Name} data plug-in found {typeof(TestInputDataPlugInAddWorkflow).GetCustomAttribute()?.Name}: {typeof(TestInputDataPlugInAddWorkflow).GetShortTypeAssemblyName()}.", LogLevel.Information, Times.Once()); From ce3e322025df4fbae6f0e794b2fbeb43a589e3c1 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 5 Oct 2023 16:14:53 +0100 Subject: [PATCH 12/75] changes in responce to comments Signed-off-by: Neil South --- .../Api => Configuration}/DatabaseOptions.cs | 3 +- .../InferenceRequestRepositoryBase.cs | 1 + src/Database/Api/StorageMetadataWrapper.cs | 1 - src/Database/DatabaseManager.cs | 5 +- .../DestinationApplicationEntityRepository.cs | 2 +- .../DicomAssociationInfoRepository.cs | 2 +- .../InferenceRequestRepository.cs | 2 +- .../MonaiApplicationEntityRepository.cs | 2 +- .../Repositories/PayloadRepository.cs | 2 +- .../SourceApplicationEntityRepository.cs | 2 +- .../StorageMetadataWrapperRepository.cs | 1 + .../VirtualApplicationEntityRepository.cs | 2 +- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../DicomAssociationInfoRepositoryTest.cs | 2 +- .../Test/InferenceRequestRepositoryTest.cs | 2 +- .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../Test/PayloadRepositoryTest.cs | 2 +- .../SourceApplicationEntityRepositoryTest.cs | 2 +- .../StorageMetadataWrapperRepositoryTest.cs | 1 + .../VirtualApplicationEntityRepositoryTest.cs | 2 +- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../DicomAssociationInfoRepositoryTest.cs | 2 +- .../InferenceRequestRepositoryTest.cs | 2 +- .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../Integration.Test/MongoDatabaseFixture.cs | 2 +- .../Integration.Test/PayloadRepositoryTest.cs | 2 +- .../SourceApplicationEntityRepositoryTest.cs | 2 +- .../StorageMetadataWrapperRepositoryTest.cs | 1 + .../VirtualApplicationEntityRepositoryTest.cs | 2 +- .../DestinationApplicationEntityRepository.cs | 1 + .../DicomAssociationInfoRepository.cs | 2 +- .../InferenceRequestRepository.cs | 2 +- .../MonaiApplicationEntityRepository.cs | 1 + .../MongoDB/Repositories/PayloadRepository.cs | 1 + .../SourceApplicationEntityRepository.cs | 1 + .../StorageMetadataWrapperRepository.cs | 1 + .../VirtualApplicationEntityRepository.cs | 1 + .../InputDataPluginEngineFactoryTest.cs | 2 - .../Connectors/PayloadAssemblerTest.cs | 2 +- .../Database/DatabaseRegistrar.cs | 1 + .../RemoteAppExecutionRepository.cs | 2 +- .../MongoDb/RemoteAppExecutionRepository.cs | 1 + .../RemoteAppExecution/DicomDeidentifier.cs | 73 +++++++++---------- .../RemoteAppExecutionRepositoryTest.cs | 2 +- .../Database/MongoDb/MongoDatabaseFixture.cs | 2 +- .../RemoteAppExecutionRepositoryTest.cs | 2 +- 46 files changed, 79 insertions(+), 75 deletions(-) rename src/{Database/Api => Configuration}/DatabaseOptions.cs (90%) diff --git a/src/Database/Api/DatabaseOptions.cs b/src/Configuration/DatabaseOptions.cs similarity index 90% rename from src/Database/Api/DatabaseOptions.cs rename to src/Configuration/DatabaseOptions.cs index 26a35eb94..dcd573850 100755 --- a/src/Database/Api/DatabaseOptions.cs +++ b/src/Configuration/DatabaseOptions.cs @@ -15,9 +15,8 @@ */ using Microsoft.Extensions.Configuration; -using Monai.Deploy.InformaticsGateway.Configuration; -namespace Monai.Deploy.InformaticsGateway.Database.Api +namespace Monai.Deploy.InformaticsGateway.Configuration { public class DatabaseOptions { diff --git a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs index ce298d06c..157f703b8 100755 --- a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs +++ b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs @@ -19,6 +19,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs index 559124b36..326cce2cf 100755 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -27,7 +27,6 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api /// public class StorageMetadataWrapper : MongoDBEntityBase { - //private readonly JsonSerializerOptions _options; [JsonPropertyName("correlationId")] public string CorrelationId { get; set; } = string.Empty; diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index 34676aa7d..2efe60d8d 100755 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -24,6 +24,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Database.EntityFramework; @@ -68,7 +69,6 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, IFileSystem fileSystem, ILoggerFactory loggerFactory) { - var logger = loggerFactory.CreateLogger("DatabaseManager"); if (connectionStringConfigurationSection is null) { @@ -96,7 +96,6 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi return services; case DbType_MongoDb: - var terst = connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]; services.AddSingleton(s => new MongoClient(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey])); services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(MongoDB.Repositories.DestinationApplicationEntityRepository)); @@ -155,6 +154,7 @@ internal static Type[] FindMatchingTypesFromAssemblies(Assembly[] assemblies) return matchingTypes.ToArray(); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("SonarLint", "S3885", Justification = "assembly.Load does not full register the contents, but assembly.LoadFrom does, this is need to load .dlls from the plug-ins folder that plugins use")] internal static Assembly[] LoadAssemblyFromPlugInsDirectory(IFileSystem fileSystem) { Guard.Against.Null(fileSystem, nameof(fileSystem)); @@ -169,6 +169,7 @@ internal static Assembly[] LoadAssemblyFromPlugInsDirectory(IFileSystem fileSyst foreach (var plugin in plugins) { + assemblies.Add(Assembly.LoadFrom(plugin)); } return assemblies.ToArray(); diff --git a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs index cc71e7820..459631ac3 100755 --- a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs index f0546aba4..b144ac2c5 100755 --- a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs index 61a16475e..035a1d0e8 100755 --- a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs +++ b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs @@ -22,7 +22,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs index 9ebbf8818..f97696edf 100755 --- a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Repositories/PayloadRepository.cs b/src/Database/EntityFramework/Repositories/PayloadRepository.cs index 180594610..0a7eb0cb3 100755 --- a/src/Database/EntityFramework/Repositories/PayloadRepository.cs +++ b/src/Database/EntityFramework/Repositories/PayloadRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs index 9c53d9216..c0829f724 100755 --- a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs index 3e8db63a6..096dc04c3 100755 --- a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs +++ b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs @@ -22,6 +22,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs index 0d2cb0a8d..548a245f3 100755 --- a/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/VirtualApplicationEntityRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Polly; diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs index 64a4472f8..60170d4a2 100755 --- a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -18,8 +18,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs index 127e3fab5..8a3d6eb7d 100755 --- a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs index f97463920..f87b372d7 100755 --- a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs index a16a4b894..609cfecdf 100755 --- a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs b/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs index 776faf090..89ac81d42 100755 --- a/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Monai.Deploy.Messaging.Events; using Moq; diff --git a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs index 237d45a2d..cf4917eb3 100755 --- a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs index 05946a5ed..1974a5824 100755 --- a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs @@ -22,6 +22,7 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Monai.Deploy.Messaging.Events; using Moq; diff --git a/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs index 69967261d..4b5e0bab8 100755 --- a/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs index 875dc1fc9..f4628ef67 100755 --- a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs index 11aefe0af..3dd049a1f 100755 --- a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs index 6a947c37f..98a6fd50e 100755 --- a/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs index 226ca6e95..e8da9cec8 100755 --- a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs index e55753a8c..f8645bead 100755 --- a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs +++ b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs @@ -17,7 +17,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.MongoDB; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs index ef3965958..bddbb6fd7 100755 --- a/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using Monai.Deploy.Messaging.Events; diff --git a/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs index d23a37722..68fdc02c6 100755 --- a/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs index 88094129c..20b1eb101 100755 --- a/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs @@ -21,6 +21,7 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using Monai.Deploy.Messaging.Events; diff --git a/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs index 3f79783ce..bc43fe6dc 100755 --- a/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs index 8b4fee8c8..b00d3e7d3 100755 --- a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs @@ -20,6 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs index 6093a39fa..f81a18d6f 100755 --- a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs b/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs index d0d58028b..ecfb1a71c 100755 --- a/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs +++ b/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using MongoDB.Driver; diff --git a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs index 4a60cbc16..87cc1ace1 100755 --- a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs @@ -20,6 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/PayloadRepository.cs b/src/Database/MongoDB/Repositories/PayloadRepository.cs index 24c5cb807..463e5f744 100755 --- a/src/Database/MongoDB/Repositories/PayloadRepository.cs +++ b/src/Database/MongoDB/Repositories/PayloadRepository.cs @@ -19,6 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs index bbad7fa62..2adc525b2 100755 --- a/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs @@ -20,6 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs index 8b66bccb1..d52d7d696 100755 --- a/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs +++ b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs @@ -21,6 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs index 4e82c6142..a112ea53a 100755 --- a/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/VirtualApplicationEntityRepository.cs @@ -20,6 +20,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs index d643ad4ea..385bfb97a 100755 --- a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs @@ -21,7 +21,6 @@ using System.Reflection; using System.Text.Json; using Microsoft.Extensions.Logging; -using Microsoft.VisualStudio.TestPlatform.Utilities; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution; @@ -62,7 +61,6 @@ public void RegisteredPlugIns_WhenCalled_ReturnsListOfPlugIns() p => VerifyPlugIn(p, typeof(TestInputDataPlugInAddWorkflow)), p => VerifyPlugIn(p, typeof(TestInputDataPlugInModifyDicomFile)), p => VerifyPlugIn(p, typeof(TestInputDataPlugInResumeWorkflow)), - p => VerifyPlugIn(p, typeof(TestInputDataPlugInVirtualAE))); _logger.VerifyLogging($"{typeof(IInputDataPlugIn).Name} data plug-in found {typeof(TestInputDataPlugInAddWorkflow).GetCustomAttribute()?.Name}: {typeof(TestInputDataPlugInAddWorkflow).GetShortTypeAssemblyName()}.", LogLevel.Information, Times.Once()); diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs index 35f235795..064d39052 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs @@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.SharedTest; diff --git a/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs b/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs index 5f1692e35..49f71b4b4 100755 --- a/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs @@ -19,6 +19,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database diff --git a/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs b/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs index f5b34550c..786080a79 100755 --- a/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/RemoteAppExecutionRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Polly; using Polly.Retry; diff --git a/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs b/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs index 217de356d..a4b4eaa56 100755 --- a/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/MongoDb/RemoteAppExecutionRepository.cs @@ -18,6 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using MongoDB.Driver; diff --git a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs index df05b40ce..e5c1f667f 100755 --- a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs @@ -53,59 +53,54 @@ public DicomDeidentifier( public async Task<(DicomFile dicomFile, ExportRequestDataMessage exportRequestDataMessage)> ExecuteAsync(DicomFile dicomFile, ExportRequestDataMessage exportRequestDataMessage) { - try - { - Guard.Against.Null(dicomFile, nameof(dicomFile)); - Guard.Against.Null(exportRequestDataMessage, nameof(exportRequestDataMessage)); - var tags = Utilities.GetTagArrayFromStringArray(_options.RemoteAppConfigurations[SR.ConfigKey_ReplaceTags]); - var studyInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); - var seriesInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID); + Guard.Against.Null(dicomFile, nameof(dicomFile)); + Guard.Against.Null(exportRequestDataMessage, nameof(exportRequestDataMessage)); + + var tags = Utilities.GetTagArrayFromStringArray(_options.RemoteAppConfigurations[SR.ConfigKey_ReplaceTags]); + var studyInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); + var seriesInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID); - var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService(); + var scope = _serviceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); - var existing = await repository.GetAsync(exportRequestDataMessage.WorkflowInstanceId, exportRequestDataMessage.ExportTaskId, studyInstanceUid, seriesInstanceUid).ConfigureAwait(false); + var existing = await repository.GetAsync(exportRequestDataMessage.WorkflowInstanceId, exportRequestDataMessage.ExportTaskId, studyInstanceUid, seriesInstanceUid).ConfigureAwait(false); - var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid); + var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid); - newRecord.OriginalValues.Add(DicomTag.StudyInstanceUID.ToString(), studyInstanceUid); - newRecord.OriginalValues.Add(DicomTag.SeriesInstanceUID.ToString(), seriesInstanceUid); - newRecord.OriginalValues.Add(DicomTag.SOPInstanceUID.ToString(), dicomFile.Dataset.GetSingleValue(DicomTag.SOPInstanceUID)); + newRecord.OriginalValues.Add(DicomTag.StudyInstanceUID.ToString(), studyInstanceUid); + newRecord.OriginalValues.Add(DicomTag.SeriesInstanceUID.ToString(), seriesInstanceUid); + newRecord.OriginalValues.Add(DicomTag.SOPInstanceUID.ToString(), dicomFile.Dataset.GetSingleValue(DicomTag.SOPInstanceUID)); - dicomFile.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, newRecord.StudyInstanceUid); - dicomFile.Dataset.AddOrUpdate(DicomTag.SeriesInstanceUID, newRecord.SeriesInstanceUid); - dicomFile.Dataset.AddOrUpdate(DicomTag.SOPInstanceUID, newRecord.SopInstanceUid); + dicomFile.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, newRecord.StudyInstanceUid); + dicomFile.Dataset.AddOrUpdate(DicomTag.SeriesInstanceUID, newRecord.SeriesInstanceUid); + dicomFile.Dataset.AddOrUpdate(DicomTag.SOPInstanceUID, newRecord.SopInstanceUid); - foreach (var tag in tags) + foreach (var tag in tags) + { + if (tag.Equals(DicomTag.StudyInstanceUID) || + tag.Equals(DicomTag.SeriesInstanceUID) || + tag.Equals(DicomTag.SOPInstanceUID)) { - if (tag.Equals(DicomTag.StudyInstanceUID) || - tag.Equals(DicomTag.SeriesInstanceUID) || - tag.Equals(DicomTag.SOPInstanceUID)) - { - continue; - } + continue; + } - if (dicomFile.Dataset.TryGetString(tag, out var value)) + if (dicomFile.Dataset.TryGetString(tag, out var value)) + { + newRecord.OriginalValues.Add(tag.ToString(), value); + var newValue = Utilities.GetTagProxyValue(tag); + if (newValue != null) { - newRecord.OriginalValues.Add(tag.ToString(), value); - var newValue = Utilities.GetTagProxyValue(tag); - if (newValue != null) - { - dicomFile.Dataset.AddOrUpdate(tag, newValue); - _logger.ValueChanged(tag.ToString(), value, newValue); - } + dicomFile.Dataset.AddOrUpdate(tag, newValue); + _logger.ValueChanged(tag.ToString(), value, newValue); } } + } - await repository.AddAsync(newRecord).ConfigureAwait(false); + await repository.AddAsync(newRecord).ConfigureAwait(false); + + return (dicomFile, exportRequestDataMessage); - return (dicomFile, exportRequestDataMessage); - } - catch (Exception) - { - throw; - } } } } diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs index ebdc4b4f2..0a4088c1e 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.EntityFramework; using Moq; using Xunit; diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs index 119cf18bd..e9bc9249d 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/MongoDatabaseFixture.cs @@ -16,7 +16,7 @@ using FellowOakDicom; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.MongoDb; using MongoDB.Driver; using Xunit; diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs index d6e82104a..34724230b 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database.MongoDb; using MongoDB.Driver; using Moq; From ebb0a5134ad8da816e3b0e03512ecc82897dbb0f Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 5 Oct 2023 16:50:20 +0100 Subject: [PATCH 13/75] remove aide namespace from nlog Signed-off-by: Neil South --- src/InformaticsGateway/nlog.config | 1 - 1 file changed, 1 deletion(-) diff --git a/src/InformaticsGateway/nlog.config b/src/InformaticsGateway/nlog.config index 104b755c9..4b106748b 100755 --- a/src/InformaticsGateway/nlog.config +++ b/src/InformaticsGateway/nlog.config @@ -71,7 +71,6 @@ limitations under the License. - From 90c1a4006c4db994b57231acc4408f3394f8e068 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 6 Oct 2023 16:24:00 +0100 Subject: [PATCH 14/75] attempt to fix export deadlocks Signed-off-by: Neil South --- .../Services/Export/ExportServiceBase.cs | 39 +++++++--- .../Features/RemoteAppExecutionPlugIn.feature | 6 ++ ...emoteAppExecutionPlugInsStepDefinitions.cs | 74 ++++++++++++++++++- 3 files changed, 105 insertions(+), 14 deletions(-) mode change 100644 => 100755 tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index d32f7ec3d..9525b6174 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -145,6 +145,7 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) if (Interlocked.Read(ref _activeWorkers) >= Concurrency) { _logger.ExceededMaxmimumNumberOfWorkers(ServiceName, _activeWorkers); + await Task.Delay(200).ConfigureAwait(false); // small delay to stop instantly dead lettering the next message. _messageSubscriber.Reject(eventArgs.Message); return; } @@ -166,16 +167,34 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) var outputDataEngineBLock = new TransformBlock( async (exportDataRequest) => { - if (exportDataRequest.IsFailed) return exportDataRequest; - return await ExecuteOutputDataEngineCallback(exportDataRequest).ConfigureAwait(false); + try + { + if (exportDataRequest.IsFailed) return exportDataRequest; + return await ExecuteOutputDataEngineCallback(exportDataRequest).ConfigureAwait(false); + } + catch (Exception e) + { + exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"failed to execute plugin {e.Message}"); + return exportDataRequest; + } }, executionOptions); var exportActionBlock = new TransformBlock( async (exportDataRequest) => { - if (exportDataRequest.IsFailed) return exportDataRequest; - return await ExportDataBlockCallback(exportDataRequest, _cancellationTokenSource.Token).ConfigureAwait(false); + try + { + if (exportDataRequest.IsFailed) return exportDataRequest; + return await ExportDataBlockCallback(exportDataRequest, _cancellationTokenSource.Token).ConfigureAwait(false); + } + catch (Exception e) + { + + exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"Failed during export {e.Message}"); + return exportDataRequest; + } + }, executionOptions); @@ -328,12 +347,12 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) _configuration.Export.Retries.RetryDelays, (exception, timeSpan, retryCount, context) => { - _logger.ErrorAcknowledgingMessageWithRetry(exception, timeSpan, retryCount); + _logger.ErrorPublishingExportCompleteEventWithRetry(exception, timeSpan, retryCount); }) .Execute(() => { - _logger.SendingAcknowledgement(); - _messageSubscriber.Acknowledge(jsonMessage); + _logger.PublishingExportCompleteEvent(); + _messagePublisher.Publish(_configuration.Messaging.Topics.ExportComplete, jsonMessage.ToMessage()); }); Policy @@ -342,12 +361,12 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) _configuration.Export.Retries.RetryDelays, (exception, timeSpan, retryCount, context) => { - _logger.ErrorPublishingExportCompleteEventWithRetry(exception, timeSpan, retryCount); + _logger.ErrorAcknowledgingMessageWithRetry(exception, timeSpan, retryCount); }) .Execute(() => { - _logger.PublishingExportCompleteEvent(); - _messagePublisher.Publish(_configuration.Messaging.Topics.ExportComplete, jsonMessage.ToMessage()); + _logger.SendingAcknowledgement(); + _messageSubscriber.Acknowledge(jsonMessage); }); lock (SyncRoot) diff --git a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature old mode 100644 new mode 100755 index bfb40fd59..283db5da4 --- a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature +++ b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature @@ -25,3 +25,9 @@ re-identifying data sent and received by the MIG respectively. Given a study that is exported to the test host When the study is received and sent back to Informatics Gateway Then ensure the original study and the received study are the same + + @messaging_workflow_request @messaging + Scenario: End-to-end test of plug-ins with one failing + Given a study that is exported to the test host with a bad plugin + When the study is received and sent back to Informatics Gateway + Then ensure the original study and the received study are the same diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index 7335e4faa..dbc2409ff 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -138,6 +138,72 @@ public async Task AStudyThatIsExportedToTheTestHost() await _messagePublisher.Publish("md.export.request.monaiscu", message.ToMessage()); } + [Given(@"a study that is exported to the test host with a bad plugin")] + public async Task AStudyThatIsExportedToTheTestHostBadPlugin() + { + // Register a new DICOM destination + DestinationApplicationEntity destination; + try + { + destination = await _informaticsGatewayClient.DicomDestinations.Create(new DestinationApplicationEntity + { + Name = _dicomServer.FeatureScpAeTitle, + AeTitle = _dicomServer.FeatureScpAeTitle, + HostIp = _configuration.InformaticsGatewayOptions.Host, + Port = _dicomServer.FeatureScpPort + }, CancellationToken.None); + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && ex.ProblemDetails.Detail.Contains("already exists")) + { + destination = await _informaticsGatewayClient.DicomDestinations.GetAeTitle(_dicomServer.FeatureScpAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + _dicomDestination = destination.Name; + + // Generate a study with multiple series + //_dataProvider.GenerateDicomData("MG", 1, 1); + _dataProvider.GenerateDicomData("CT", 1); + _dataProvider.InjectRandomData(DicomTags); + _originalDicomFiles = new Dictionary(_dataProvider.DicomSpecs.Files); + + await _dataSinkMinio.SendAsync(_dataProvider); + + // send 2 messagees the first on should fail, teh second one should not + string pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; + pluginName = pluginName.Replace("DicomDeidentifier", "fail"); + + for (int i = 0; i < 2; ++i) + { + + // Emit a export request event + _exportRequestEvent = new ExportRequestEvent + { + CorrelationId = Guid.NewGuid().ToString(), + Destinations = new[] { _dicomDestination }, + ExportTaskId = Guid.NewGuid().ToString(), + Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = Guid.NewGuid().ToString(), + }; + _exportRequestEvent.PluginAssemblies.Add(pluginName); + var message = new JsonMessage( + _exportRequestEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + _exportRequestEvent.CorrelationId, + string.Empty); + + _receivedExportCompletedMessages.ClearMessages(); + await _messagePublisher.Publish("md.export.request.monaiscu", message.ToMessage()); + pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; + } + } + [When(@"the study is received and sent back to Informatics Gateway")] public async Task TheStudyIsReceivedAndSentBackToInformaticsGateway() { @@ -193,10 +259,10 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit } } - var timeoutPolicy = Policy.TimeoutAsync(30, TimeoutStrategy.Pessimistic); + var timeoutPolicy = Policy.TimeoutAsync(40, TimeoutStrategy.Pessimistic); await timeoutPolicy .ExecuteAsync( - async () => { await SendRequest(); } + async () => { await SendRequest(2); } ); // Clear workflow request messages @@ -209,10 +275,10 @@ await timeoutPolicy _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedWorkflowRequestMessages.Messages, 1); } - private async Task SendRequest() + private async Task SendRequest(int exportCount = 1) { // Wait for export completed event - (await _receivedExportCompletedMessages.WaitforAsync(1, DicomScpWaitTimeSpan)).Should().BeTrue(); + (await _receivedExportCompletedMessages.WaitforAsync(exportCount, DicomScpWaitTimeSpan)).Should().BeTrue(); foreach (var key in _dataProvider.DicomSpecs.FileHashes.Keys) { From ea43489ff573f62b84e0c708119795198b6217c8 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 12 Oct 2023 15:48:23 +0100 Subject: [PATCH 15/75] adding artifactReceieved Signed-off-by: Neil South --- ...Monai.Deploy.InformaticsGateway.Api.csproj | 4 +- src/Api/MonaiApplicationEntity.cs | 5 + src/Api/Test/packages.lock.json | 6 +- src/Api/packages.lock.json | 6 +- src/CLI/Test/packages.lock.json | 10 +- src/CLI/packages.lock.json | 8 +- src/Client/Test/packages.lock.json | 6 +- src/Client/packages.lock.json | 6 +- .../MessageBrokerConfigurationKeys.cs | 15 +- src/Configuration/Test/packages.lock.json | 8 +- src/Configuration/packages.lock.json | 6 +- src/Database/Api/Test/packages.lock.json | 10 +- src/Database/Api/packages.lock.json | 8 +- .../EntityFramework/Test/packages.lock.json | 6 +- .../EntityFramework/packages.lock.json | 6 +- .../Integration.Test/packages.lock.json | 10 +- src/Database/MongoDB/packages.lock.json | 10 +- src/Database/packages.lock.json | 6 +- .../Logging/Log.700.PayloadService.cs | 9 ++ .../PayloadNotificationActionHandler.cs | 54 +++++++- .../Services/Http/MonaiAeTitleController.cs | 1 + .../Services/Scp/ApplicationEntityHandler.cs | 12 +- .../Services/Scp/ApplicationEntityManager.cs | 1 - .../PayloadNotificationActionHandlerTest.cs | 56 ++++++++ .../Http/MonaiAeTitleControllerTest.cs | 36 +++++ .../Test/packages.lock.json | 6 +- src/InformaticsGateway/packages.lock.json | 6 +- .../Test/packages.lock.json | 6 +- .../RemoteAppExecution/packages.lock.json | 6 +- tests/Integration.Test/packages.lock.json | 131 +----------------- 30 files changed, 253 insertions(+), 207 deletions(-) mode change 100644 => 100755 src/Api/Monai.Deploy.InformaticsGateway.Api.csproj mode change 100644 => 100755 src/Api/MonaiApplicationEntity.cs mode change 100644 => 100755 src/Api/Test/packages.lock.json mode change 100644 => 100755 src/Api/packages.lock.json mode change 100644 => 100755 src/CLI/Test/packages.lock.json mode change 100644 => 100755 src/CLI/packages.lock.json mode change 100644 => 100755 src/Client/packages.lock.json mode change 100644 => 100755 src/Configuration/MessageBrokerConfigurationKeys.cs mode change 100644 => 100755 src/Configuration/Test/packages.lock.json mode change 100644 => 100755 src/Configuration/packages.lock.json mode change 100644 => 100755 src/Database/Api/Test/packages.lock.json mode change 100644 => 100755 src/Database/Api/packages.lock.json mode change 100644 => 100755 src/Database/EntityFramework/Test/packages.lock.json mode change 100644 => 100755 src/Database/EntityFramework/packages.lock.json mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/packages.lock.json mode change 100644 => 100755 src/Database/MongoDB/packages.lock.json mode change 100644 => 100755 src/Database/packages.lock.json mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.700.PayloadService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj old mode 100644 new mode 100755 index 05397b6d1..eb6594c42 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -33,7 +33,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/src/Api/MonaiApplicationEntity.cs b/src/Api/MonaiApplicationEntity.cs old mode 100644 new mode 100755 index 9e2929147..f29dd6350 --- a/src/Api/MonaiApplicationEntity.cs +++ b/src/Api/MonaiApplicationEntity.cs @@ -112,6 +112,11 @@ public class MonaiApplicationEntity : MongoDBEntityBase /// public DateTime? DateTimeUpdated { get; set; } + /// + /// Gets or set if this AeTitle is for data from an external app. + /// + public bool FromExternalApp { get; set; } = false; + public MonaiApplicationEntity() { SetDefaultValues(); diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json old mode 100644 new mode 100755 index a7a444fc4..6ffa25ba3 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1251,7 +1251,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json old mode 100644 new mode 100755 index 2ab5eaf2c..72292c71c --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -35,9 +35,9 @@ }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "requested": "[1.1.0-ai-230-0014, )", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json old mode 100644 new mode 100755 index 251afc0cd..608b0ca74 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1521,7 +1521,7 @@ "Crayon": "[2.0.69, )", "Docker.DotNet": "[3.125.15, )", "Microsoft.Extensions.Http": "[6.0.0, )", - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "System.CommandLine.Hosting": "[0.4.0-alpha.22272.1, )", @@ -1534,7 +1534,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1542,7 +1542,7 @@ "monai.deploy.informaticsgateway.client": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )" } }, diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json old mode 100644 new mode 100755 index f8d0493fc..39027b610 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -515,7 +515,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -523,7 +523,7 @@ "monai.deploy.informaticsgateway.client": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )" } }, diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index ebc99b32c..8d3ba64e2 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1829,7 +1829,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json old mode 100644 new mode 100755 index d1cd8c1c0..ea7713053 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -248,7 +248,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/MessageBrokerConfigurationKeys.cs b/src/Configuration/MessageBrokerConfigurationKeys.cs old mode 100644 new mode 100755 index 897e25eb6..846a24c5f --- a/src/Configuration/MessageBrokerConfigurationKeys.cs +++ b/src/Configuration/MessageBrokerConfigurationKeys.cs @@ -28,17 +28,24 @@ public class MessageBrokerConfigurationKeys public string WorkflowRequest { get; set; } = "md.workflow.request"; /// - /// Gets or sets the topic for publishing workflow requests. - /// Defaults to `md_workflow_request`. + /// Gets or sets the topic for publishing export complete requests. + /// Defaults to `md_export_complete`. /// [ConfigurationKeyName("exportComplete")] public string ExportComplete { get; set; } = "md.export.complete"; /// - /// Gets or sets the topic for publishing workflow requests. - /// Defaults to `md_workflow_request`. + /// Gets or sets the topic for publishing export requests. + /// Defaults to `md_export_request`. /// [ConfigurationKeyName("exportRequestPrefix")] public string ExportRequestPrefix { get; set; } = "md.export.request"; + + /// + /// Gets or sets the topic for publishing artifact recieved events. + /// Defaults to `md_workflow_artifactrecieved`. + /// + [ConfigurationKeyName("artifactrecieved")] + public string ArtifactRecieved { get; set; } = "md.workflow.artifactrecieved"; } } diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json old mode 100644 new mode 100755 index f583c4d3f..2d012506f --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1264,7 +1264,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1279,7 +1279,7 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json old mode 100644 new mode 100755 index f8c0c969a..fe289762a --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -248,7 +248,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json old mode 100644 new mode 100755 index 22b241ec1..2007fe974 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1238,7 +1238,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1253,14 +1253,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json old mode 100644 new mode 100755 index 1f2fdb0fb..ab3c52533 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -254,7 +254,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -269,7 +269,7 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json old mode 100644 new mode 100755 index a123be361..3ec317f7f --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1452,7 +1452,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json old mode 100644 new mode 100755 index 591508214..86fdcb7cd --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -456,7 +456,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json old mode 100644 new mode 100755 index 9e54f0f84..f9fd04196 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1379,7 +1379,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1394,14 +1394,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json old mode 100644 new mode 100755 index 943ad83ee..cbdca91e7 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -357,7 +357,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -372,14 +372,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json old mode 100644 new mode 100755 index e984ce0d6..9ccefd418 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,7 +570,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs old mode 100644 new mode 100755 index c09270e2f..600f6f14f --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -148,5 +148,14 @@ public static partial class Log [LoggerMessage(EventId = 747, Level = LogLevel.Error, Message = "Error posting payload to publish queue.")] public static partial void ErrorPostingJobToPublishPayloadsQueue(this ILogger logger); + + [LoggerMessage(EventId = 748, Level = LogLevel.Debug, Message = "Generating artifact recieeved request message for payload {payloadId}...")] + public static partial void GenerateArtifactReceievedRequest(this ILogger logger, Guid payloadId); + + [LoggerMessage(EventId = 749, Level = LogLevel.Information, Message = "Publishing artifact recieved request message ID={messageId}...")] + public static partial void PublishingArtifactRecievedRequest(this ILogger logger, string messageId); + + [LoggerMessage(EventId = 750, Level = LogLevel.Information, Message = "Artifact recieved published to {queue}, message ID={messageId}. Payload took {durationSeconds} seconds to complete.")] + public static partial void ArtifactRecievedPublished(this ILogger logger, string queue, string messageId, double durationSeconds); } } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 16d9a7fe4..cb789e088 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -23,13 +23,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; @@ -72,7 +72,7 @@ public async Task NotifyAsync(Payload payload, ActionBlock notification try { - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "Payload", payload.PayloadId }, { "CorrelationId", payload.CorrelationId } }); + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "Payload", payload.PayloadId }, { "CorrelationId", payload.CorrelationId } }); await NotifyPayloadReady(payload).ConfigureAwait(false); await DeletePayload(payload, cancellationToken).ConfigureAwait(false); } @@ -104,6 +104,18 @@ private async Task NotifyPayloadReady(Payload payload) { Guard.Against.Null(payload, nameof(payload)); + if (payload.DataTrigger.FromExternalApp) + { + await SendArtifactRecievedEvent(payload).ConfigureAwait(false); + } + else + { + await SendWorkflowRequestEvent(payload).ConfigureAwait(false); + } + } + + private async Task SendWorkflowRequestEvent(Payload payload) + { _logger.GenerateWorkflowRequest(payload.PayloadId); var workflowRequest = new WorkflowRequestEvent @@ -138,6 +150,42 @@ await messageBrokerPublisherService.Publish( _logger.WorkflowRequestPublished(_options.Value.Messaging.Topics.WorkflowRequest, message.MessageId, payload.Elapsed.TotalSeconds); } + private async Task SendArtifactRecievedEvent(Payload payload) + { + _logger.GenerateArtifactReceievedRequest(payload.PayloadId); + + var artifiactRecievedEvent = new ArtifactsReceivedEvent + { + Bucket = _options.Value.Storage.StorageServiceBucketName, + PayloadId = payload.PayloadId, + Workflows = payload.GetWorkflows(), + FileCount = payload.Count, + CorrelationId = payload.CorrelationId, + Timestamp = payload.DateTimeCreated, + DataTrigger = payload.DataTrigger, + WorkflowInstanceId = payload.WorkflowInstanceId, + TaskId = payload.TaskId, + }; + artifiactRecievedEvent.DataOrigins.AddRange(payload.DataOrigins); + + artifiactRecievedEvent.Artifacts = payload.Files.Select(f => new Artifact { Type = f.DataOrigin.ArtifactType, Path = f.File.UploadPath }).ToList(); + + var message = new JsonMessage( + artifiactRecievedEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + payload.CorrelationId, + string.Empty); + + _logger.PublishingArtifactRecievedRequest(message.MessageId); + + var messageBrokerPublisherService = _scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IMessageBrokerPublisherService)); + await messageBrokerPublisherService.Publish( + _options.Value.Messaging.Topics.ArtifactRecieved, + message.ToMessage()).ConfigureAwait(false); + + _logger.ArtifactRecievedPublished(_options.Value.Messaging.Topics.ArtifactRecieved, message.MessageId, payload.Elapsed.TotalSeconds); + } + private async Task UpdatePayloadState(Payload payload, CancellationToken cancellationToken = default) { Guard.Against.Null(payload, nameof(payload)); @@ -189,4 +237,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs old mode 100644 new mode 100755 index 22810f4a3..0ea3b190d --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -163,6 +163,7 @@ public async Task> Edit(MonaiApplicationEnt applicationEntity.Workflows = item.Workflows ?? new List(); applicationEntity.PlugInAssemblies = item.PlugInAssemblies ?? new List(); applicationEntity.SetAuthor(User, EditMode.Update); + applicationEntity.FromExternalApp = item.FromExternalApp; await ValidateUpdateAsync(applicationEntity).ConfigureAwait(false); diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index f41d63966..0791c757a 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -19,6 +19,7 @@ using System.Linq; using System.Threading.Tasks; using Ardalis.GuardClauses; +using FellowOakDicom; using FellowOakDicom.Network; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -31,6 +32,7 @@ using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.Services.Storage; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; namespace Monai.Deploy.InformaticsGateway.Services.Scp @@ -113,9 +115,17 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string dicomInfo.SetWorkflows(_configuration.Workflows.ToArray()); } + var modality = request.File.Dataset.GetSingleValue(DicomTag.Modality); + + if (ArtifactTypes.Validate(modality) && Enum.TryParse(modality, out ArtifactType parsedArtifactType)) + { + dicomInfo.DataOrigin.ArtifactType = parsedArtifactType; + } + dicomInfo.DataOrigin.FromExternalApp = _configuration.FromExternalApp; + var result = await _pluginEngine.ExecutePlugInsAsync(request.File, dicomInfo).ConfigureAwait(false); - using var scope = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); + using var scope = _logger.BeginScope(new Api.LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); dicomInfo = (result.Item2 as DicomFileStorageMetadata)!; var dicomFile = result.Item1; diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs index 778266cd2..00287b529 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Concurrent; -using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; using FellowOakDicom.Network; diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs index b23c95e67..9b47e8d36 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs @@ -196,5 +196,61 @@ public async Task GivenAPayload_WhenMessageIsPublished_ExpectPayloadToBeDeleted( _messageBrokerPublisherService.Verify(p => p.Publish(It.IsAny(), It.IsAny()), Times.AtLeastOnce()); _repository.Verify(p => p.RemoveAsync(payload, _cancellationTokenSource.Token), Times.AtLeastOnce()); } + + [Fact] + public async Task GivenAPayload_ExpectMessageIsPublished() + { + var notifyAction = new ActionBlock(payload => + { + }); + + var correlationId = Guid.NewGuid(); + var payload = new Payload("key", correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 0) + { + RetryCount = 3, + State = Payload.PayloadState.Notify, + Files = new List + { + new DicomFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Messaging.Events.DataService.DIMSE, "calling", "called"), + new FhirFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Api.Rest.FhirStorageFormat.Json, Messaging.Events.DataService.FHIR, "origin"), + }, + }; + + var handler = new PayloadNotificationActionHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var defaultKeys = new MessageBrokerConfigurationKeys(); + + await handler.NotifyAsync(payload, notifyAction, _cancellationTokenSource.Token); + + _messageBrokerPublisherService.Verify(p => p.Publish(defaultKeys.WorkflowRequest, It.IsAny()), Times.AtLeastOnce()); + } + + [Fact] + public async Task GivenAPayload_WithExternalAppSet_ExpectMessageIsPublished() + { + var notifyAction = new ActionBlock(payload => + { + }); + + var correlationId = Guid.NewGuid(); + var payload = new Payload("key", correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 0) + { + RetryCount = 3, + State = Payload.PayloadState.Notify, + Files = new List + { + new DicomFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Messaging.Events.DataService.DIMSE, "calling", "called"), + new FhirFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Api.Rest.FhirStorageFormat.Json, Messaging.Events.DataService.FHIR, "origin"), + } + }; + + payload.DataTrigger.FromExternalApp = true; + + var handler = new PayloadNotificationActionHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var defaultKeys = new MessageBrokerConfigurationKeys(); + + await handler.NotifyAsync(payload, notifyAction, _cancellationTokenSource.Token); + + _messageBrokerPublisherService.Verify(p => p.Publish(defaultKeys.ArtifactRecieved, It.IsAny()), Times.AtLeastOnce()); + } } } diff --git a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs old mode 100644 new mode 100755 index 5804056e5..146cfe708 --- a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs @@ -488,7 +488,43 @@ public async Task Update_ShallReturnBadRequestWithBadAeTitle() Assert.Equal($"'{aeTitle}' is not a valid AE Title (source: MonaiApplicationEntity).", problem.Detail); Assert.Equal((int)HttpStatusCode.BadRequest, problem.Status); } + [RetryFact(5, 250, DisplayName = "Update - Shall return problem on validation failure")] + public async Task Update_Shall_Update_FromExternalApp() + { + var aeTitle = "LONG"; + var entity = new MonaiApplicationEntity + { + AeTitle = aeTitle, + Name = "AET", + Grouping = "0020,000E", + Timeout = 100, + Workflows = new List { "1", "2", "3" }, + AllowedSopClasses = new List { "1.2.3" }, + IgnoredSopClasses = new List { "a.b.c" }, + FromExternalApp = false + }; + var entityEdited = new MonaiApplicationEntity + { + AeTitle = aeTitle, + Name = "AET", + Grouping = "0020,000E", + Timeout = 100, + Workflows = new List { "1", "2", "3" }, + AllowedSopClasses = new List { "1.2.3" }, + IgnoredSopClasses = new List { "a.b.c" }, + FromExternalApp = true + }; + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + var result = await _controller.Edit(entityEdited); + + var objectResult = result.Result as ObjectResult; + Assert.NotNull(objectResult); + var entityFormController = objectResult.Value as MonaiApplicationEntity; + Assert.NotNull(entityFormController); + Assert.Equal(entity.FromExternalApp, entityFormController.FromExternalApp); + } #endregion Update #region Delete diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index a49d0862e..851e16a00 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -807,8 +807,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -2066,7 +2066,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 4a0a986ed..5fd763f30 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -546,8 +546,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1683,7 +1683,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 0b7eadaf0..c3636766e 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -449,8 +449,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1579,7 +1579,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index f55ec8cb2..8f8b45686 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -573,7 +573,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index e3521b080..7993c244c 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -226,16 +226,6 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0034", - "contentHash": "BIDkrOEagPLrPWAgHcz1AQfrZAUkZG8mhwCJZjLszM5htrHItVihJc9nlqmSry7n/WOQ7nXouxScgZMlMSCYBQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -423,15 +413,6 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -444,17 +425,6 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -530,34 +500,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -600,55 +542,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -773,8 +666,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.1.0-ai-230-0014", + "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -2048,24 +1941,6 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0034, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -2092,7 +1967,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } From 727c8f437c4f5c52ee8169e11d72cac7436e7121 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 12 Oct 2023 17:39:04 +0100 Subject: [PATCH 16/75] adding integration tests Signed-off-by: Neil South --- .../Services/Scp/ApplicationEntityHandler.cs | 15 +++-- .../Drivers/DicomInstanceGenerator.cs | 7 ++- .../Features/DicomDimseScp.feature | 11 ++++ tests/Integration.Test/Hooks/TestHooks.cs | 10 ++++ .../DicomDimseScpServicesStepDefinitions.cs | 55 +++++++++++++++++++ 5 files changed, 89 insertions(+), 9 deletions(-) mode change 100644 => 100755 tests/Integration.Test/Drivers/DicomInstanceGenerator.cs mode change 100644 => 100755 tests/Integration.Test/Features/DicomDimseScp.feature mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index 0791c757a..87a7d2b1b 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -114,13 +114,16 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string { dicomInfo.SetWorkflows(_configuration.Workflows.ToArray()); } - - var modality = request.File.Dataset.GetSingleValue(DicomTag.Modality); - - if (ArtifactTypes.Validate(modality) && Enum.TryParse(modality, out ArtifactType parsedArtifactType)) + if (request.File.Dataset.Contains(DicomTag.Modality)) { - dicomInfo.DataOrigin.ArtifactType = parsedArtifactType; + var modality = request.File.Dataset.GetSingleValue(DicomTag.Modality); + + if (ArtifactTypes.Validate(modality) && Enum.TryParse(modality, out ArtifactType parsedArtifactType)) + { + dicomInfo.DataOrigin.ArtifactType = parsedArtifactType; + } } + dicomInfo.DataOrigin.FromExternalApp = _configuration.FromExternalApp; var result = await _pluginEngine.ExecutePlugInsAsync(request.File, dicomInfo).ConfigureAwait(false); @@ -135,7 +138,7 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string _logger.QueueInstanceUsingDicomTag(dicomTag); var key = dicomFile.Dataset.GetSingleValue(dicomTag); - var payloadId = await _payloadAssembler.Queue(key, dicomInfo, new DataOrigin { DataService = DataService.DIMSE, Source = callingAeTitle, Destination = calledAeTitle }, _configuration.Timeout).ConfigureAwait(false); + var payloadId = await _payloadAssembler.Queue(key, dicomInfo, dicomInfo.DataOrigin, _configuration.Timeout).ConfigureAwait(false); dicomInfo.PayloadId = payloadId.ToString(); _uploadQueue.Queue(dicomInfo); diff --git a/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs b/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs old mode 100644 new mode 100755 index 539d95476..9ae0e210b --- a/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs +++ b/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs @@ -64,7 +64,7 @@ public DicomInstanceGenerator GenerateNewSeries() return this; } - public DicomFile GenerateNewInstance(long size, string sopClassUid = "1.2.840.10008.5.1.4.1.1.11.1") + public DicomFile GenerateNewInstance(long size, string modality, string sopClassUid = "1.2.840.10008.5.1.4.1.1.11.1") { var dataset = new DicomDataset(); _baseDataset.CopyTo(dataset); @@ -78,7 +78,8 @@ public DicomFile GenerateNewInstance(long size, string sopClassUid = "1.2.840.10 .AddOrUpdate(DicomTag.BitsAllocated, 8) .AddOrUpdate(DicomTag.BitsStored, 8) .AddOrUpdate(DicomTag.HighBit, 7) - .AddOrUpdate(DicomTag.SamplesPerPixel, 1); + .AddOrUpdate(DicomTag.SamplesPerPixel, 1) + .AddOrUpdate(DicomTag.Modality, modality); var frames = Math.Max(1, size / Rows / Columns); var pixelData = DicomPixelData.Create(dataset, true); @@ -119,7 +120,7 @@ public DicomDataSpecs Generate(string patientId, int studiesPerPatient, int seri for (var instance = 0; instance < instancesPerSeries; instance++) { var size = _random.NextLong(studySpec.SizeMinBytes, studySpec.SizeMaxBytes); - dicomFile = generator.GenerateNewInstance(size); + dicomFile = generator.GenerateNewInstance(size, modality); files.Add(dicomFile.GenerateFileName(), dicomFile); } } diff --git a/tests/Integration.Test/Features/DicomDimseScp.feature b/tests/Integration.Test/Features/DicomDimseScp.feature old mode 100644 new mode 100755 index 7741e62ed..ac1779374 --- a/tests/Integration.Test/Features/DicomDimseScp.feature +++ b/tests/Integration.Test/Features/DicomDimseScp.feature @@ -86,3 +86,14 @@ Feature: DICOM DIMSE SCP Services | modality | study_count | series_count | seconds | workflow_requests | | MG | 1 | 3 | 3 | 1 | | MG | 1 | 3 | 6 | 3 | + + @messaging_workflow_request @messaging + Scenario Outline: Respond to C-STORE-RQ and group data by Study Instance UID from external App + Given a called AE Title named 'C-STORE-MA' that groups by '0020,000D' for 5 seconds from external app + And a DICOM client configured with 300 seconds timeout + And a DICOM client configured to send data over 1 associations and wait 3 between each association + And 1 MG studies with 3 series per study + When C-STORE-RQ are sent to 'Informatics Gateway' with AET 'C-STORE-MA' from 'TEST-RUNNER' + Then a successful response should be received + And 1 Artifact Recieved sent to ea message broker + And studies are uploaded to storage service diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 78a5240e7..0b9c2f48a 100755 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -40,6 +40,7 @@ public sealed class TestHooks private static RabbitMQConnectionFactory s_rabbitMqConnectionFactory; private static RabbitMQMessagePublisherService s_rabbitMqPublisher; private static RabbitMqConsumer s_rabbitMqConsumer_WorkflowRequest; + private static RabbitMqConsumer s_rabbitMqConsumer_ArtifactRecieved; private static RabbitMqConsumer s_rabbitMqConsumer_ExportComplete; private static IDatabaseDataProvider s_database; private static DicomScp s_dicomServer; @@ -129,6 +130,13 @@ private static void SetupRabbitMq(ISpecFlowOutputHelper outputHelper, IServiceSc s_rabbitMqConnectionFactory); s_rabbitMqConsumer_ExportComplete = new RabbitMqConsumer(rabbitMqSubscriber_ExportComplete, s_options.Value.Messaging.Topics.ExportComplete, outputHelper); + + var rabbitMqSubscriber_ArtifactRecieved = new RabbitMQMessageSubscriberService( + Options.Create(s_options.Value.Messaging), + scope.ServiceProvider.GetRequiredService>(), + s_rabbitMqConnectionFactory); + + s_rabbitMqConsumer_ArtifactRecieved = new RabbitMqConsumer(rabbitMqSubscriber_ArtifactRecieved, s_options.Value.Messaging.Topics.ArtifactRecieved, outputHelper); } private static IDatabaseDataProvider GetDatabase(IServiceProvider serviceProvider, ISpecFlowOutputHelper outputHelper) @@ -164,6 +172,7 @@ public void SetUp(ScenarioContext scenarioContext, ISpecFlowOutputHelper outputH _objectContainer.RegisterInstanceAs(s_rabbitMqPublisher, "MessagingPublisher"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_WorkflowRequest, "WorkflowRequestSubscriber"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ExportComplete, "ExportCompleteSubscriber"); + _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ArtifactRecieved, "ArtifactRecievedSubscriber"); _objectContainer.RegisterInstanceAs(s_dataProvider, "DataProvider"); _objectContainer.RegisterInstanceAs(s_assertions, "Assertions"); _objectContainer.RegisterInstanceAs(s_storescu, "StoreSCU"); @@ -183,6 +192,7 @@ public static void Shtudown() s_rabbitMqConsumer_WorkflowRequest.Dispose(); s_rabbitMqConsumer_ExportComplete.Dispose(); + s_rabbitMqConsumer_ArtifactRecieved.Dispose(); s_rabbitMqConnectionFactory.Dispose(); } diff --git a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs old mode 100644 new mode 100755 index 3c8cc1e2f..c08d6bc6e --- a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs @@ -24,6 +24,8 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions { @@ -38,6 +40,7 @@ public class DicomDimseScpServicesStepDefinitions private readonly Configurations _configuration; private readonly InformaticsGatewayClient _informaticsGatewayClient; private readonly RabbitMqConsumer _receivedMessages; + private readonly RabbitMqConsumer _receivedMessagesArtifactRecieved; private readonly DataProvider _dataProvider; private readonly Assertions _assertions; @@ -50,6 +53,7 @@ public DicomDimseScpServicesStepDefinitions( _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _receivedMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _receivedMessagesArtifactRecieved = objectContainer.Resolve("ArtifactRecievedSubscriber"); _dataProvider = objectContainer.Resolve("DataProvider"); _assertions = objectContainer.Resolve("Assertions"); _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); @@ -132,6 +136,43 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit } } } + [Given(@"a called AE Title named '([^']*)' that groups by '([^']*)' for (.*) seconds from external app")] + public async Task GivenACalledAETitleNamedThatGroupsByForSecondsFromExternalApp(string calledAeTitle, string grouping, uint groupingTimeout) + { + Guard.Against.NullOrWhiteSpace(calledAeTitle, nameof(calledAeTitle)); + Guard.Against.NullOrWhiteSpace(grouping, nameof(grouping)); + Guard.Against.NegativeOrZero(groupingTimeout, nameof(groupingTimeout)); + + _dataProvider.StudyGrouping = grouping; + try + { + await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntity + { + AeTitle = calledAeTitle, + Name = calledAeTitle, + Grouping = grouping, + Timeout = groupingTimeout, + Workflows = new List(DummyWorkflows), + PlugInAssemblies = new List() { typeof(Monai.Deploy.InformaticsGateway.Test.PlugIns.TestInputDataPlugInModifyDicomFile).AssemblyQualifiedName }, + FromExternalApp = true + }, CancellationToken.None); + + _dataProvider.Workflows = DummyWorkflows; + _dataProvider.Destination = calledAeTitle; + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && + ex.ProblemDetails.Detail.Contains("already exists")) + { + await _informaticsGatewayClient.MonaiScpAeTitle.GetAeTitle(calledAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + } [Given(@"a DICOM client configured with (.*) seconds timeout")] public void GivenADICOMClientConfiguredWithSecondsTimeout(int timeout) @@ -205,5 +246,19 @@ public async Task ThenWorkflowRequestSentToMessageBrokerAsync(int workflowCount) (await _receivedMessages.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DIMSE, _receivedMessages.Messages, workflowCount); } + + [Then(@"(.*) Artifact Recieved sent to ea message broker")] + public async Task ThenArtifactRecievedSentToEaMessageBroker(int workflowCount) + { + Guard.Against.NegativeOrZero(workflowCount, nameof(workflowCount)); + + (await _receivedMessagesArtifactRecieved.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DIMSE, _receivedMessagesArtifactRecieved.Messages, workflowCount); + + var firstMessage = _receivedMessagesArtifactRecieved.Messages.First().ConvertTo(); + + Assert.Equal(3, firstMessage.Artifacts.Count); + Assert.NotEqual(ArtifactType.Unset, firstMessage.Artifacts.First().Type); + } } } From be5ff1da6ca2fcbda46e1ad27cf1d1eb8c023158 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 13 Oct 2023 11:52:44 +0100 Subject: [PATCH 17/75] fixing tests Signed-off-by: Neil South --- src/Api/MonaiApplicationEntity.cs | 5 --- .../PayloadNotificationActionHandler.cs | 2 +- .../Services/Http/MonaiAeTitleController.cs | 1 - .../Services/Scp/ApplicationEntityHandler.cs | 2 - .../Test/Plug-ins/TestInputDataPlugIns.cs | 2 + .../PayloadNotificationActionHandlerTest.cs | 13 ++++--- .../Http/MonaiAeTitleControllerTest.cs | 37 ------------------- .../Common/RabbitConnectionFactory.cs | 4 ++ .../Drivers/DicomInstanceGenerator.cs | 9 ++++- .../Features/RemoteAppExecutionPlugIn.feature | 4 +- .../DicomDimseScpServicesStepDefinitions.cs | 1 - ...emoteAppExecutionPlugInsStepDefinitions.cs | 19 ++++++---- 12 files changed, 34 insertions(+), 65 deletions(-) mode change 100644 => 100755 src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs mode change 100644 => 100755 tests/Integration.Test/Common/RabbitConnectionFactory.cs diff --git a/src/Api/MonaiApplicationEntity.cs b/src/Api/MonaiApplicationEntity.cs index f29dd6350..9e2929147 100755 --- a/src/Api/MonaiApplicationEntity.cs +++ b/src/Api/MonaiApplicationEntity.cs @@ -112,11 +112,6 @@ public class MonaiApplicationEntity : MongoDBEntityBase /// public DateTime? DateTimeUpdated { get; set; } - /// - /// Gets or set if this AeTitle is for data from an external app. - /// - public bool FromExternalApp { get; set; } = false; - public MonaiApplicationEntity() { SetDefaultValues(); diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index cb789e088..3cfbdefe2 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -104,7 +104,7 @@ private async Task NotifyPayloadReady(Payload payload) { Guard.Against.Null(payload, nameof(payload)); - if (payload.DataTrigger.FromExternalApp) + if (payload.WorkflowInstanceId.IsNullOrEmpty() is false && payload.TaskId.IsNullOrEmpty() is false) { await SendArtifactRecievedEvent(payload).ConfigureAwait(false); } diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs index 0ea3b190d..22810f4a3 100755 --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -163,7 +163,6 @@ public async Task> Edit(MonaiApplicationEnt applicationEntity.Workflows = item.Workflows ?? new List(); applicationEntity.PlugInAssemblies = item.PlugInAssemblies ?? new List(); applicationEntity.SetAuthor(User, EditMode.Update); - applicationEntity.FromExternalApp = item.FromExternalApp; await ValidateUpdateAsync(applicationEntity).ConfigureAwait(false); diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index 87a7d2b1b..a858a84d1 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -124,8 +124,6 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string } } - dicomInfo.DataOrigin.FromExternalApp = _configuration.FromExternalApp; - var result = await _pluginEngine.ExecutePlugInsAsync(request.File, dicomInfo).ConfigureAwait(false); using var scope = _logger.BeginScope(new Api.LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); diff --git a/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs b/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs old mode 100644 new mode 100755 index 61640d386..d26a9ccf1 --- a/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs +++ b/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs @@ -62,6 +62,8 @@ public class TestInputDataPlugInModifyDicomFile : IInputDataPlugIn public Task<(DicomFile dicomFile, FileStorageMetadata fileMetadata)> ExecuteAsync(DicomFile dicomFile, FileStorageMetadata fileMetadata) { dicomFile.Dataset.Add(ExpectedTag, ExpectedValue); + fileMetadata.WorkflowInstanceId = "WorkflowInstanceId"; + fileMetadata.TaskId = "TaskId"; return Task.FromResult((dicomFile, fileMetadata)); } } diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs index 9b47e8d36..788031117 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs @@ -205,7 +205,7 @@ public async Task GivenAPayload_ExpectMessageIsPublished() }); var correlationId = Guid.NewGuid(); - var payload = new Payload("key", correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 0) + var payload = new Payload("key", correlationId.ToString(), Guid.NewGuid().ToString(), null, new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 0) { RetryCount = 3, State = Payload.PayloadState.Notify, @@ -237,13 +237,14 @@ public async Task GivenAPayload_WithExternalAppSet_ExpectMessageIsPublished() RetryCount = 3, State = Payload.PayloadState.Notify, Files = new List - { - new DicomFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Messaging.Events.DataService.DIMSE, "calling", "called"), - new FhirFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Api.Rest.FhirStorageFormat.Json, Messaging.Events.DataService.FHIR, "origin"), - } + { + new DicomFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Messaging.Events.DataService.DIMSE, "calling", "called"), + new FhirFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Api.Rest.FhirStorageFormat.Json, Messaging.Events.DataService.FHIR, "origin"), + }, + WorkflowInstanceId = "WorkflowInstanceId", + TaskId = "TaskId" }; - payload.DataTrigger.FromExternalApp = true; var handler = new PayloadNotificationActionHandler(_serviceScopeFactory.Object, _logger.Object, _options); var defaultKeys = new MessageBrokerConfigurationKeys(); diff --git a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs index 146cfe708..24238c409 100755 --- a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs @@ -488,43 +488,6 @@ public async Task Update_ShallReturnBadRequestWithBadAeTitle() Assert.Equal($"'{aeTitle}' is not a valid AE Title (source: MonaiApplicationEntity).", problem.Detail); Assert.Equal((int)HttpStatusCode.BadRequest, problem.Status); } - [RetryFact(5, 250, DisplayName = "Update - Shall return problem on validation failure")] - public async Task Update_Shall_Update_FromExternalApp() - { - var aeTitle = "LONG"; - var entity = new MonaiApplicationEntity - { - AeTitle = aeTitle, - Name = "AET", - Grouping = "0020,000E", - Timeout = 100, - Workflows = new List { "1", "2", "3" }, - AllowedSopClasses = new List { "1.2.3" }, - IgnoredSopClasses = new List { "a.b.c" }, - FromExternalApp = false - }; - - var entityEdited = new MonaiApplicationEntity - { - AeTitle = aeTitle, - Name = "AET", - Grouping = "0020,000E", - Timeout = 100, - Workflows = new List { "1", "2", "3" }, - AllowedSopClasses = new List { "1.2.3" }, - IgnoredSopClasses = new List { "a.b.c" }, - FromExternalApp = true - }; - - _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); - var result = await _controller.Edit(entityEdited); - - var objectResult = result.Result as ObjectResult; - Assert.NotNull(objectResult); - var entityFormController = objectResult.Value as MonaiApplicationEntity; - Assert.NotNull(entityFormController); - Assert.Equal(entity.FromExternalApp, entityFormController.FromExternalApp); - } #endregion Update #region Delete diff --git a/tests/Integration.Test/Common/RabbitConnectionFactory.cs b/tests/Integration.Test/Common/RabbitConnectionFactory.cs old mode 100644 new mode 100755 index 36e6881c2..6da3afa35 --- a/tests/Integration.Test/Common/RabbitConnectionFactory.cs +++ b/tests/Integration.Test/Common/RabbitConnectionFactory.cs @@ -68,10 +68,12 @@ public static void DeleteAllQueues(InformaticsGatewayConfiguration configuration { DeleteQueue(configuration.Messaging, configuration.Messaging.Topics.WorkflowRequest); DeleteQueue(configuration.Messaging, configuration.Messaging.Topics.ExportComplete); + DeleteQueue(configuration.Messaging, configuration.Messaging.Topics.ArtifactRecieved); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.Dicom.Scu.AgentName}"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.DicomWeb.AgentName}"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.WorkflowRequest}-dead-letter"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportComplete}-dead-letter"); + DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ArtifactRecieved}-dead-letter"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.Dicom.Scu.AgentName}-dead-letter"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.DicomWeb.AgentName}-dead-letter"); } @@ -81,9 +83,11 @@ public static void PurgeAllQueues(MessageBrokerConfiguration configuration) PurgeQueue(configuration, configuration.Topics.WorkflowRequest); PurgeQueue(configuration, configuration.Topics.ExportComplete); PurgeQueue(configuration, configuration.Topics.ExportRequestPrefix); + PurgeQueue(configuration, configuration.Topics.ArtifactRecieved); PurgeQueue(configuration, $"{configuration.Topics.WorkflowRequest}-dead-letter"); PurgeQueue(configuration, $"{configuration.Topics.ExportComplete}-dead-letter"); PurgeQueue(configuration, $"{configuration.Topics.ExportRequestPrefix}-dead-letter"); + PurgeQueue(configuration, $"{configuration.Topics.ArtifactRecieved}-dead-letter"); } } } diff --git a/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs b/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs index 9ae0e210b..9ce35d3bf 100755 --- a/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs +++ b/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs @@ -78,8 +78,13 @@ public DicomFile GenerateNewInstance(long size, string modality, string sopClass .AddOrUpdate(DicomTag.BitsAllocated, 8) .AddOrUpdate(DicomTag.BitsStored, 8) .AddOrUpdate(DicomTag.HighBit, 7) - .AddOrUpdate(DicomTag.SamplesPerPixel, 1) - .AddOrUpdate(DicomTag.Modality, modality); + .AddOrUpdate(DicomTag.SamplesPerPixel, 1); + + + if (modality.Any(char.IsLower) is false) + { + dataset.AddOrUpdate(DicomTag.Modality, modality); + } var frames = Math.Max(1, size / Rows / Columns); var pixelData = DicomPixelData.Create(dataset, true); diff --git a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature index 283db5da4..00f91acb8 100755 --- a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature +++ b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature @@ -23,11 +23,11 @@ re-identifying data sent and received by the MIG respectively. @messaging_workflow_request @messaging Scenario: End-to-end test of plug-ins Given a study that is exported to the test host - When the study is received and sent back to Informatics Gateway + When the study is received and sent back to Informatics Gateway with 1 messages Then ensure the original study and the received study are the same @messaging_workflow_request @messaging Scenario: End-to-end test of plug-ins with one failing Given a study that is exported to the test host with a bad plugin - When the study is received and sent back to Informatics Gateway + When the study is received and sent back to Informatics Gateway with 2 messages Then ensure the original study and the received study are the same diff --git a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs index c08d6bc6e..61944b7e9 100755 --- a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs @@ -154,7 +154,6 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit Timeout = groupingTimeout, Workflows = new List(DummyWorkflows), PlugInAssemblies = new List() { typeof(Monai.Deploy.InformaticsGateway.Test.PlugIns.TestInputDataPlugInModifyDicomFile).AssemblyQualifiedName }, - FromExternalApp = true }, CancellationToken.None); _dataProvider.Workflows = DummyWorkflows; diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index dbc2409ff..a33478409 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -53,6 +53,7 @@ public class RemoteAppExecutionPlugInsStepDefinitions private readonly DataProvider _dataProvider; private readonly RabbitMqConsumer _receivedExportCompletedMessages; private readonly RabbitMqConsumer _receivedWorkflowRequestMessages; + private readonly RabbitMqConsumer _receivedArtifactRecievedMessages; private readonly RabbitMQMessagePublisherService _messagePublisher; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private Dictionary _originalDicomFiles; @@ -71,6 +72,7 @@ public RemoteAppExecutionPlugInsStepDefinitions( _dataProvider = objectContainer.Resolve("DataProvider"); _receivedExportCompletedMessages = objectContainer.Resolve("ExportCompleteSubscriber"); _receivedWorkflowRequestMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _receivedArtifactRecievedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); _messagePublisher = objectContainer.Resolve("MessagingPublisher"); _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); _assertions = objectContainer.Resolve("Assertions"); @@ -204,8 +206,8 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() } } - [When(@"the study is received and sent back to Informatics Gateway")] - public async Task TheStudyIsReceivedAndSentBackToInformaticsGateway() + [When(@"the study is received and sent back to Informatics Gateway with (.*) messages")] + public async Task TheStudyIsReceivedAndSentBackToInformaticsGateway(int exportCount = 1) { // setup DICOM Source @@ -262,17 +264,18 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit var timeoutPolicy = Policy.TimeoutAsync(40, TimeoutStrategy.Pessimistic); await timeoutPolicy .ExecuteAsync( - async () => { await SendRequest(2); } + async () => { await SendRequest(exportCount); } ); // Clear workflow request messages _receivedWorkflowRequestMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); _dataProvider.DimseRsponse.Should().Be(DicomStatus.Success); // Wait for workflow request events - (await _receivedWorkflowRequestMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); - _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedWorkflowRequestMessages.Messages, 1); + (await _receivedArtifactRecievedMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedArtifactRecievedMessages.Messages, 1); } private async Task SendRequest(int exportCount = 1) @@ -307,12 +310,12 @@ await storeScu.SendAsync( [Then(@"ensure the original study and the received study are the same")] public async Task EnsureTheOriginalStudyAndTheReceivedStudyAreTheSameAsync() { - var workflowRequestEvent = _receivedWorkflowRequestMessages.Messages[0].ConvertTo(); - _exportRequestEvent.CorrelationId.Should().Be(_receivedWorkflowRequestMessages.Messages[0].CorrelationId); + var workflowRequestEvent = _receivedArtifactRecievedMessages.Messages[0].ConvertTo(); + _exportRequestEvent.CorrelationId.Should().Be(_receivedArtifactRecievedMessages.Messages[0].CorrelationId); _exportRequestEvent.CorrelationId.Should().Be(workflowRequestEvent.CorrelationId); _exportRequestEvent.WorkflowInstanceId.Should().Be(workflowRequestEvent.WorkflowInstanceId); _exportRequestEvent.ExportTaskId.Should().Be(workflowRequestEvent.TaskId); - await _assertions.ShouldRestoreAllDicomMetaata(_receivedWorkflowRequestMessages.Messages, _originalDicomFiles, DefaultDicomTags.ToArray()).ConfigureAwait(false); + await _assertions.ShouldRestoreAllDicomMetaata(_receivedArtifactRecievedMessages.Messages, _originalDicomFiles, DefaultDicomTags.ToArray()).ConfigureAwait(false); } } } From 510da6d34cbd98cf7cb46dff3854d2f8956757d8 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 13 Oct 2023 16:56:01 +0100 Subject: [PATCH 18/75] upped messaging version Signed-off-by: Neil South --- .../Monai.Deploy.InformaticsGateway.Api.csproj | 2 +- src/Api/Test/packages.lock.json | 6 +++--- src/Api/packages.lock.json | 6 +++--- src/CLI/Test/packages.lock.json | 6 +++--- src/CLI/packages.lock.json | 6 +++--- src/Client/Test/packages.lock.json | 14 +++++++------- src/Client/packages.lock.json | 6 +++--- src/Configuration/Test/packages.lock.json | 6 +++--- src/Configuration/packages.lock.json | 6 +++--- src/Database/Api/Test/packages.lock.json | 6 +++--- src/Database/Api/packages.lock.json | 6 +++--- .../EntityFramework/Test/packages.lock.json | 6 +++--- src/Database/EntityFramework/packages.lock.json | 6 +++--- .../MongoDB/Integration.Test/packages.lock.json | 6 +++--- src/Database/MongoDB/packages.lock.json | 6 +++--- src/Database/packages.lock.json | 6 +++--- .../Monai.Deploy.InformaticsGateway.csproj | 2 +- src/InformaticsGateway/Test/packages.lock.json | 14 +++++++------- src/InformaticsGateway/packages.lock.json | 14 +++++++------- .../RemoteAppExecution/Test/packages.lock.json | 6 +++--- .../RemoteAppExecution/packages.lock.json | 6 +++--- ...oy.InformaticsGateway.Integration.Test.csproj | 2 +- tests/Integration.Test/packages.lock.json | 16 ++++++++-------- 23 files changed, 80 insertions(+), 80 deletions(-) mode change 100644 => 100755 tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index eb6594c42..bbb14d40f 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -55,7 +55,7 @@ - + diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 6ffa25ba3..8ac40d66e 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1251,7 +1251,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 72292c71c..ba7c8de2e 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -35,9 +35,9 @@ }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.1.0-ai-230-0014, )", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "requested": "[1.0.3, )", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 608b0ca74..07e3405f1 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1534,7 +1534,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 39027b610..7aa8d43a8 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -515,7 +515,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 8d3ba64e2..d6603d275 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "resolved": "1.0.3", + "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.3", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1816,7 +1816,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.3, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1829,7 +1829,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index ea7713053..3a40a7b97 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -248,7 +248,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 2d012506f..486d66b98 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1264,7 +1264,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index fe289762a..ee562eaa6 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -248,7 +248,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index 2007fe974..b920f161c 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1238,7 +1238,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index ab3c52533..0b9f5e19d 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -254,7 +254,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 3ec317f7f..8da5e9e8c 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1452,7 +1452,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 86fdcb7cd..6fa2d9727 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -456,7 +456,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index f9fd04196..7b594d6e3 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1379,7 +1379,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index cbdca91e7..fe69f96ef 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -357,7 +357,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 9ccefd418..c31839040 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,7 +570,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index 84c22832a..d204f09a0 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 851e16a00..e2af07655 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -807,8 +807,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -818,10 +818,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "resolved": "1.0.3", + "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.3", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -2053,7 +2053,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.3, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2066,7 +2066,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 5fd763f30..652c1ab65 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -20,11 +20,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "requested": "[1.0.3, )", + "resolved": "1.0.3", + "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.3", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -546,8 +546,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1683,7 +1683,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index c3636766e..2ded5398f 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -449,8 +449,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1579,7 +1579,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 8f8b45686..ab5480f3b 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -573,7 +573,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj old mode 100644 new mode 100755 index a53f89786..dca65f1c1 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index 7993c244c..6f5baf69d 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -132,11 +132,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "requested": "[1.0.3, )", + "resolved": "1.0.3", + "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.3", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -666,8 +666,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.1.0-ai-230-0014", - "contentHash": "dEDesjzmELbMTqejYB+grvWwqzAdO6rm2KtfaKvk8nnUumP5g387NzC2TxoGZ0CQK1NXPT2Kj0Mf3v6XrrknkQ==", + "resolved": "1.0.3", + "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1954,7 +1954,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.3, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1967,7 +1967,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.1.0-ai-230-0014, )", + "Monai.Deploy.Messaging": "[1.0.3, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } From ca4fec8bc682b4f5eb7d6c994240e6a7518b35e1 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 13 Oct 2023 18:11:54 +0100 Subject: [PATCH 19/75] fixup tests Signed-off-by: Neil South --- doc/dependency_decisions.yml | 8 ++++---- .../Integration.Test/Features/DicomWebStow.feature | 8 ++++---- .../DicomWebStowServiceStepDefinitions.cs | 13 ++++++++++++- 3 files changed, 20 insertions(+), 9 deletions(-) mode change 100644 => 100755 doc/dependency_decisions.yml mode change 100644 => 100755 tests/Integration.Test/Features/DicomWebStow.feature mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml old mode 100644 new mode 100755 index c44f250f2..77525fb3f --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -774,15 +774,15 @@ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.1 - :when: 2022-08-16 23:06:21.051573547 Z + - 1.0.3 + :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Messaging.RabbitMQ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.1 - :when: 2022-08-16 23:06:21.511789690 Z + - 1.0.3 + :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Storage - :who: mocsharp diff --git a/tests/Integration.Test/Features/DicomWebStow.feature b/tests/Integration.Test/Features/DicomWebStow.feature old mode 100644 new mode 100755 index 2d892cd4b..0e2687954 --- a/tests/Integration.Test/Features/DicomWebStow.feature +++ b/tests/Integration.Test/Features/DicomWebStow.feature @@ -24,7 +24,7 @@ Feature: DICOMweb STOW-RS Service Scenario: Triggers a new workflow request via DICOMWeb STOW-RS Given studies with 'stow_none' grouping When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | @@ -35,7 +35,7 @@ Feature: DICOMweb STOW-RS Service Scenario: Triggers a new workflow with given study instance UID request via DICOMWeb STOW-RS Given studies with 'stow_study' grouping When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' with StudyInstanceUid - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | @@ -47,7 +47,7 @@ Feature: DICOMweb STOW-RS Service Given studies with 'stow_none' grouping And a workflow named 'MyWorkflow' When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | @@ -59,7 +59,7 @@ Feature: DICOMweb STOW-RS Service Given studies with 'stow_study' grouping And a workflow named 'MyWorkflow' When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' with StudyInstanceUid - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | diff --git a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs old mode 100644 new mode 100755 index f792febc9..243dc4636 --- a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs @@ -32,12 +32,13 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class DicomWebStowServiceStepDefinitions { - internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromSeconds(30); internal static readonly string[] DummyWorkflows = new string[] { "WorkflowA", "WorkflowB" }; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly InformaticsGatewayClient _informaticsGatewayClient; private readonly Configurations _configurations; private readonly RabbitMqConsumer _receivedMessages; + private readonly RabbitMqConsumer _artifactReceivedMessages; private readonly DataProvider _dataProvider; private readonly IDataClient _dataSink; private readonly Assertions _assertions; @@ -48,6 +49,7 @@ public DicomWebStowServiceStepDefinitions(ObjectContainer objectContainer, Confi _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); _receivedMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _artifactReceivedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); _dataProvider = objectContainer.Resolve("DataProvider"); _dataSink = objectContainer.Resolve("DicomWebClient"); _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); @@ -167,5 +169,14 @@ public async Task ThenWorkflowRequestSentToMessageBrokerAsync(int workflowCount) (await _receivedMessages.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DicomWeb, _receivedMessages.Messages, workflowCount); } + + [Then(@"(.*) workflow requests received from receieved artifact message broker")] + public async Task ThenWorkflowRequestsReceivedFromReceievedArtifactMessageBroker(int workflowCount) + { + Guard.Against.NegativeOrZero(workflowCount, nameof(workflowCount)); + + (await _artifactReceivedMessages.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DicomWeb, _artifactReceivedMessages.Messages, workflowCount); + } } } From 1e09fd32185c9ec9f3b9a5eeba3e3ea31bb75ba5 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 13 Oct 2023 18:33:57 +0100 Subject: [PATCH 20/75] fix another test Signed-off-by: Neil South --- tests/Integration.Test/Features/DicomDimseScp.feature | 2 +- .../StepDefinitions/DicomDimseScpServicesStepDefinitions.cs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/Integration.Test/Features/DicomDimseScp.feature b/tests/Integration.Test/Features/DicomDimseScp.feature index ac1779374..672245a50 100755 --- a/tests/Integration.Test/Features/DicomDimseScp.feature +++ b/tests/Integration.Test/Features/DicomDimseScp.feature @@ -43,7 +43,7 @@ Feature: DICOM DIMSE SCP Services And studies When a C-STORE-RQ is sent to 'Informatics Gateway' with AET '' from 'TEST-RUNNER' Then a successful response should be received - And workflow requests sent to message broker + And Artifact Recieved sent to ea message broker And studies are uploaded to storage service with data input plugins Examples: diff --git a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs index 61944b7e9..061ec296c 100755 --- a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs @@ -247,7 +247,7 @@ public async Task ThenWorkflowRequestSentToMessageBrokerAsync(int workflowCount) } [Then(@"(.*) Artifact Recieved sent to ea message broker")] - public async Task ThenArtifactRecievedSentToEaMessageBroker(int workflowCount) + public async Task ThenArtifactRecievedSentToEaMessageBrokerExpect(int workflowCount) { Guard.Against.NegativeOrZero(workflowCount, nameof(workflowCount)); @@ -256,7 +256,6 @@ public async Task ThenArtifactRecievedSentToEaMessageBroker(int workflowCount) var firstMessage = _receivedMessagesArtifactRecieved.Messages.First().ConvertTo(); - Assert.Equal(3, firstMessage.Artifacts.Count); Assert.NotEqual(ArtifactType.Unset, firstMessage.Artifacts.First().Type); } } From 4a366904e46f0e89e189c252ac4af8884d2adbbd Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 13 Oct 2023 19:59:42 +0100 Subject: [PATCH 21/75] more fixing tests Signed-off-by: Neil South --- .../StepDefinitions/DicomWebStowServiceStepDefinitions.cs | 1 + tests/Integration.Test/StepDefinitions/FhirDefinitions.cs | 4 +++- .../RemoteAppExecutionPlugInsStepDefinitions.cs | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/FhirDefinitions.cs diff --git a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs index 243dc4636..6c4be9cde 100755 --- a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs @@ -101,6 +101,7 @@ public void GivenNStudies(int studyCount, string modality, string grouping) _dataProvider.GenerateDicomData(modality, studyCount); _dataProvider.StudyGrouping = grouping; _receivedMessages.ClearMessages(); + _artifactReceivedMessages.ClearMessages(); } [Given(@"a workflow named '(.*)'")] diff --git a/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs b/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs old mode 100644 new mode 100755 index 88c574d41..98d72bc3b --- a/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs @@ -29,9 +29,10 @@ public class FhirDefinitions internal enum FileFormat { Xml, Json }; - internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromMinutes(3); + internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromSeconds(120); private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly RabbitMqConsumer _receivedMessages; + private readonly RabbitMqConsumer _artifactReceivedMessages; private readonly DataProvider _dataProvider; private readonly Assertions _assertions; private readonly IDataClient _dataSink; @@ -45,6 +46,7 @@ public FhirDefinitions(ObjectContainer objectContainer) _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); _receivedMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _artifactReceivedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); _dataProvider = objectContainer.Resolve("DataProvider"); _assertions = objectContainer.Resolve("Assertions"); _dataSink = objectContainer.Resolve("FhirClient"); diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index a33478409..fe7af4bab 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -137,6 +137,7 @@ public async Task AStudyThatIsExportedToTheTestHost() string.Empty); _receivedExportCompletedMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); await _messagePublisher.Publish("md.export.request.monaiscu", message.ToMessage()); } From 62f8cde3360a085f4bf99cf7cc7da7946186b038 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 16 Oct 2023 09:17:36 +0100 Subject: [PATCH 22/75] fixing test to use proper que Signed-off-by: Neil South --- tests/Integration.Test/Features/DicomDimseScp.feature | 4 ++-- .../StepDefinitions/DicomDimseScpServicesStepDefinitions.cs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/Integration.Test/Features/DicomDimseScp.feature b/tests/Integration.Test/Features/DicomDimseScp.feature index 672245a50..102ca3619 100755 --- a/tests/Integration.Test/Features/DicomDimseScp.feature +++ b/tests/Integration.Test/Features/DicomDimseScp.feature @@ -61,7 +61,7 @@ Feature: DICOM DIMSE SCP Services And studies with series per study When a C-STORE-RQ is sent to 'Informatics Gateway' with AET '' from 'TEST-RUNNER' Then a successful response should be received - And workflow requests sent to message broker + And Artifact Recieved sent to ea message broker And studies are uploaded to storage service Examples: @@ -79,7 +79,7 @@ Feature: DICOM DIMSE SCP Services And studies with series per study When C-STORE-RQ are sent to 'Informatics Gateway' with AET 'C-STORE-MA' from 'TEST-RUNNER' Then a successful response should be received - And workflow requests sent to message broker + And Artifact Recieved sent to ea message broker And studies are uploaded to storage service Examples: diff --git a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs index 061ec296c..739947582 100755 --- a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs @@ -33,7 +33,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class DicomDimseScpServicesStepDefinitions { - internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromSeconds(120); internal static readonly string[] DummyWorkflows = new string[] { "WorkflowA", "WorkflowB" }; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly ObjectContainer _objectContainer; @@ -98,11 +98,15 @@ public void GivenXStudiesWithYSeriesPerStudy(int studyCount, string modality, in _dataProvider.GenerateDicomData(modality, studyCount, seriesPerStudy); _receivedMessages.ClearMessages(); + _receivedMessagesArtifactRecieved.ClearMessages(); } [Given(@"a called AE Title named '([^']*)' that groups by '([^']*)' for (.*) seconds")] public async Task GivenACalledAETitleNamedThatGroupsByForSeconds(string calledAeTitle, string grouping, uint groupingTimeout) { + _receivedMessages.ClearMessages(); + _receivedMessagesArtifactRecieved.ClearMessages(); + Guard.Against.NullOrWhiteSpace(calledAeTitle, nameof(calledAeTitle)); Guard.Against.NullOrWhiteSpace(grouping, nameof(grouping)); Guard.Against.NegativeOrZero(groupingTimeout, nameof(groupingTimeout)); From a959781f6f48c9c8dd3ba3617de43242bb497210 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 19 Oct 2023 12:17:35 +0100 Subject: [PATCH 23/75] testing config Signed-off-by: Neil South --- docker-compose/configs/orthanc.json | 16 +++++++++++++++- src/InformaticsGateway/appsettings.json | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docker-compose/configs/orthanc.json b/docker-compose/configs/orthanc.json index 7023954b0..de6192aff 100644 --- a/docker-compose/configs/orthanc.json +++ b/docker-compose/configs/orthanc.json @@ -191,7 +191,21 @@ "STORESCP", "127.0.0.1", 104 + ], + "mig-local-1104": [ + "STORESCP", + "host.docker.internal", + 1104 + ], + + "mig-local-ip-1104": [ + "STORESCP", + "192.168.0.230", + 1104 ] + + + /** * By default, the Orthanc SCP accepts all DICOM commands (C-ECHO, * C-STORE, C-FIND, C-MOVE) issued by the registered remote SCU @@ -512,4 +526,4 @@ "StowMaxSize": 10, // For STOW-RS client, the maximum size of the body in one single HTTP query (in MB, 0 = no limit) "QidoCaseSensitive": true // For QIDO-RS server, whether search is case sensitive (since release 0.5) } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/appsettings.json b/src/InformaticsGateway/appsettings.json index a367a22c5..a47b82df3 100755 --- a/src/InformaticsGateway/appsettings.json +++ b/src/InformaticsGateway/appsettings.json @@ -95,7 +95,7 @@ "storageRootPath": "/payloads", "temporaryBucketName": "monaideploy", "serviceAssemblyName": "Monai.Deploy.Storage.MinIO.MinIoStorageService, Monai.Deploy.Storage.MinIO", - "watermarkPercent": 75, + "watermarkPercent": 95, "reserveSpaceGB": 5, "settings": { "endpoint": "localhost:9000", From 1d2aff5e2a681cc9974035c00aaf1048073500a3 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 23 Oct 2023 16:18:36 +0100 Subject: [PATCH 24/75] change to use existing payloadId for external apps Signed-off-by: Neil South --- docker-compose/configs/orthanc.json | 6 +++--- src/Api/ExportRequestDataMessage.cs | 5 +++++ .../Monai.Deploy.InformaticsGateway.Api.csproj | 2 +- src/Api/Storage/Payload.cs | 18 ++++++++++++++++-- src/Api/Test/packages.lock.json | 6 +++--- src/Api/packages.lock.json | 6 +++--- src/CLI/Test/packages.lock.json | 6 +++--- src/CLI/packages.lock.json | 6 +++--- src/Client.Common/Test/packages.lock.json | 0 src/Client.Common/packages.lock.json | 0 src/Client/Test/packages.lock.json | 14 +++++++------- src/Client/packages.lock.json | 6 +++--- src/Common/Test/packages.lock.json | 0 src/Common/packages.lock.json | 0 src/Configuration/Test/packages.lock.json | 6 +++--- src/Configuration/packages.lock.json | 6 +++--- src/Database/Api/Test/packages.lock.json | 6 +++--- src/Database/Api/packages.lock.json | 6 +++--- .../EntityFramework/Test/packages.lock.json | 6 +++--- .../EntityFramework/packages.lock.json | 6 +++--- .../Integration.Test/packages.lock.json | 6 +++--- src/Database/MongoDB/packages.lock.json | 6 +++--- src/Database/packages.lock.json | 6 +++--- src/DicomWebClient/CLI/packages.lock.json | 0 src/DicomWebClient/Test/packages.lock.json | 0 src/DicomWebClient/packages.lock.json | 0 .../Monai.Deploy.InformaticsGateway.csproj | 2 +- .../Properties/launchSettings.json | 3 ++- .../Services/Connectors/PayloadAssembler.cs | 8 ++++---- .../Export/ExportRequestEventDetails.cs | 1 + src/InformaticsGateway/Test/packages.lock.json | 14 +++++++------- src/InformaticsGateway/packages.lock.json | 14 +++++++------- src/Monai.Deploy.InformaticsGateway.sln | 14 ++++++++++++++ .../RemoteAppExecution/DicomDeidentifier.cs | 6 +++++- .../RemoteAppExecution/DicomReidentifier.cs | 1 + .../RemoteAppExecution/RemoteAppExecution.cs | 2 ++ .../Test/DicomDeidentifierTest.cs | 1 + .../RemoteAppExecution/Test/packages.lock.json | 6 +++--- .../RemoteAppExecution/packages.lock.json | 6 +++--- ....InformaticsGateway.Integration.Test.csproj | 2 +- .../DicomWebStowServiceStepDefinitions.cs | 2 +- ...RemoteAppExecutionPlugInsStepDefinitions.cs | 4 +++- tests/Integration.Test/packages.lock.json | 16 ++++++++-------- 43 files changed, 138 insertions(+), 93 deletions(-) mode change 100644 => 100755 docker-compose/configs/orthanc.json mode change 100644 => 100755 src/Api/Storage/Payload.cs mode change 100644 => 100755 src/Client.Common/Test/packages.lock.json mode change 100644 => 100755 src/Client.Common/packages.lock.json mode change 100644 => 100755 src/Common/Test/packages.lock.json mode change 100644 => 100755 src/Common/packages.lock.json mode change 100644 => 100755 src/DicomWebClient/CLI/packages.lock.json mode change 100644 => 100755 src/DicomWebClient/Test/packages.lock.json mode change 100644 => 100755 src/DicomWebClient/packages.lock.json mode change 100644 => 100755 src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs diff --git a/docker-compose/configs/orthanc.json b/docker-compose/configs/orthanc.json old mode 100644 new mode 100755 index de6192aff..ef34c7020 --- a/docker-compose/configs/orthanc.json +++ b/docker-compose/configs/orthanc.json @@ -198,9 +198,9 @@ 1104 ], - "mig-local-ip-1104": [ - "STORESCP", - "192.168.0.230", + "mig-local-1104StartMWMExtApp": [ + "StartMWMExtApp", + "host.docker.internal", 1104 ] diff --git a/src/Api/ExportRequestDataMessage.cs b/src/Api/ExportRequestDataMessage.cs index e7dfec0fe..891b1a8d8 100755 --- a/src/Api/ExportRequestDataMessage.cs +++ b/src/Api/ExportRequestDataMessage.cs @@ -58,6 +58,11 @@ public string CorrelationId get { return _exportRequest.CorrelationId; } } + public string? FilePayloadId + { + get { return _exportRequest.PayloadId; } + } + public string[] Destinations { get { return _exportRequest.Destinations; } diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index bbb14d40f..3ba16192b 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -55,7 +55,7 @@ - + diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs old mode 100644 new mode 100755 index c9fbbc50b..d88ffce7c --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -89,7 +89,6 @@ public TimeSpan Elapsed public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); - Files = new List(); DataOrigins = new HashSet(); _lastReceived = new Stopwatch(); @@ -107,6 +106,21 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str DataTrigger = dataTrigger; } + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null) : + this(key, correlationId, workflowInstanceId, taskId, dataTrigger, timeout) + { + Guard.Against.NullOrWhiteSpace(key, nameof(key)); + + if (payloadId is null) + { + PayloadId = Guid.NewGuid(); + } + else + { + PayloadId = Guid.Parse(payloadId); + } + } + public void Add(FileStorageMetadata value) { Guard.Against.Null(value, nameof(value)); @@ -158,4 +172,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 8ac40d66e..fdd279606 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1251,7 +1251,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index ba7c8de2e..8d6ba8a0b 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -35,9 +35,9 @@ }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.3, )", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "requested": "[1.0.4-rc0004, )", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 07e3405f1..1ddfc18a2 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1534,7 +1534,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 7aa8d43a8..88e5facc0 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -515,7 +515,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client.Common/Test/packages.lock.json b/src/Client.Common/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index d6603d275..0fcef1276 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", + "resolved": "1.0.4-rc0004", + "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.3", + "Monai.Deploy.Messaging": "1.0.4-rc0004", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1816,7 +1816,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.3, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4-rc0004, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1829,7 +1829,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index 3a40a7b97..2f837a0de 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -248,7 +248,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Common/Test/packages.lock.json b/src/Common/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 486d66b98..81d86eb48 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1264,7 +1264,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index ee562eaa6..cf3c45948 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -248,7 +248,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index b920f161c..c2ddf9bfc 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1238,7 +1238,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index 0b9f5e19d..a442a5e9d 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -254,7 +254,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 8da5e9e8c..4e711738d 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1452,7 +1452,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 6fa2d9727..fc740c1ef 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -456,7 +456,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index 7b594d6e3..7979ff107 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1379,7 +1379,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index fe69f96ef..01e986593 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -357,7 +357,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index c31839040..f11e75ad3 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,7 +570,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/DicomWebClient/Test/packages.lock.json b/src/DicomWebClient/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index d204f09a0..3a5cc4a0b 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/InformaticsGateway/Properties/launchSettings.json b/src/InformaticsGateway/Properties/launchSettings.json index c9ff339fa..f5636e031 100755 --- a/src/InformaticsGateway/Properties/launchSettings.json +++ b/src/InformaticsGateway/Properties/launchSettings.json @@ -9,7 +9,8 @@ "InformaticsGateway__messaging__publisherSettings__username": "rabbitmq", "InformaticsGateway__messaging__publisherSettings__password": "rabbitmq", "InformaticsGateway__messaging__subscriberSettings__username": "rabbitmq", - "InformaticsGateway__messaging__subscriberSettings__password": "rabbitmq" + "InformaticsGateway__messaging__subscriberSettings__password": "rabbitmq", + "Kestrel__EndPoints__Http__Url": "http://+:5000" } } } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index b498cd082..ce1e0ce2e 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -103,7 +103,7 @@ public async Task Queue(string bucket, FileStorageMetadata file, DataOrigi using var _ = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", file.CorrelationId } }); - var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout).ConfigureAwait(false); + var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, file.PayloadId).ConfigureAwait(false); payload.Add(file); _logger.FileAddedToBucket(payload.Key, payload.Count); return payload.PayloadId; @@ -200,13 +200,13 @@ private async Task QueueBucketForNotification(string key, Payload payload) } } - private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout) + private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? payloadId = null) { return await _payloads.GetOrAdd(key, x => new AsyncLazy(async () => { var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); - var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout); + var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, payloadId); await repository.AddAsync(newPayload).ConfigureAwait(false); _logger.BucketCreated(key, timeout); return newPayload; @@ -219,4 +219,4 @@ public void Dispose() _timer.Stop(); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs b/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs old mode 100644 new mode 100755 index 6b4477f6f..ee3e4012c --- a/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs +++ b/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs @@ -34,6 +34,7 @@ public ExportRequestEventDetails(ExportRequestEvent exportRequest) DeliveryTag = exportRequest.DeliveryTag; MessageId = exportRequest.MessageId; WorkflowInstanceId = exportRequest.WorkflowInstanceId; + PayloadId = exportRequest.PayloadId; PluginAssemblies.AddRange(exportRequest.PluginAssemblies); ErrorMessages.AddRange(exportRequest.ErrorMessages); diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index e2af07655..43ca151c7 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -807,8 +807,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -818,10 +818,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", + "resolved": "1.0.4-rc0004", + "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.3", + "Monai.Deploy.Messaging": "1.0.4-rc0004", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -2053,7 +2053,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.3, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4-rc0004, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2066,7 +2066,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 652c1ab65..4ce3e5e1a 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -20,11 +20,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.3, )", - "resolved": "1.0.3", - "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", + "requested": "[1.0.4-rc0004, )", + "resolved": "1.0.4-rc0004", + "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.3", + "Monai.Deploy.Messaging": "1.0.4-rc0004", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -546,8 +546,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1683,7 +1683,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Monai.Deploy.InformaticsGateway.sln b/src/Monai.Deploy.InformaticsGateway.sln index d851e6255..4a8706171 100644 --- a/src/Monai.Deploy.InformaticsGateway.sln +++ b/src/Monai.Deploy.InformaticsGateway.sln @@ -62,6 +62,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGateway.Test.PlugIns", "InformaticsGateway\Test\Plug-ins\Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj", "{6C83469B-4B8A-416E-ACA7-09454D721352}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.Messaging", "..\..\monai-deploy-messaging\src\Messaging\Monai.Deploy.Messaging.csproj", "{32A3AB42-5770-443C-A3C1-802575C4C08B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -408,6 +410,18 @@ Global {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x64.Build.0 = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.ActiveCfg = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.Build.0 = Release|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x64.ActiveCfg = Debug|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x64.Build.0 = Debug|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x86.ActiveCfg = Debug|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x86.Build.0 = Debug|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|Any CPU.Build.0 = Release|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x64.ActiveCfg = Release|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x64.Build.0 = Release|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x86.ActiveCfg = Release|Any CPU + {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs index e5c1f667f..908da3313 100755 --- a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs @@ -61,12 +61,16 @@ public DicomDeidentifier( var studyInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); var seriesInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID); + + var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); var existing = await repository.GetAsync(exportRequestDataMessage.WorkflowInstanceId, exportRequestDataMessage.ExportTaskId, studyInstanceUid, seriesInstanceUid).ConfigureAwait(false); - var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid); + var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid) + { PayloadId = exportRequestDataMessage.FilePayloadId }; + newRecord.OriginalValues.Add(DicomTag.StudyInstanceUID.ToString(), studyInstanceUid); newRecord.OriginalValues.Add(DicomTag.SeriesInstanceUID.ToString(), seriesInstanceUid); diff --git a/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs old mode 100644 new mode 100755 index 88e32e9c0..56634fcf6 --- a/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs @@ -62,6 +62,7 @@ public DicomReidentifier( fileMetadata.WorkflowInstanceId = remoteAppExecution.WorkflowInstanceId; fileMetadata.TaskId = remoteAppExecution.ExportTaskId; fileMetadata.ChangeCorrelationId(_logger, remoteAppExecution.CorrelationId); + fileMetadata.PayloadId = remoteAppExecution.PayloadId; return (dicomFile, fileMetadata); } diff --git a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs old mode 100644 new mode 100755 index f01521b8a..52f2be710 --- a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs +++ b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs @@ -43,6 +43,8 @@ public class RemoteAppExecution /// public string ExportTaskId { get; set; } = string.Empty; + public string? PayloadId { get; set; } + /// /// Gets or sets the correlation ID of the original request. /// diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs old mode 100644 new mode 100755 index 04527c4bf..285771f4a --- a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs @@ -259,6 +259,7 @@ private ExportRequestEvent GenerateExportRequest() => CorrelationId = Guid.NewGuid().ToString(), ExportTaskId = Guid.NewGuid().ToString(), WorkflowInstanceId = Guid.NewGuid().ToString(), + PayloadId = null }; } } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 2ded5398f..180d3caa9 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -449,8 +449,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1579,7 +1579,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index ab5480f3b..808d39f0c 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -573,7 +573,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index dca65f1c1..d737ca45d 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs index 6c4be9cde..4ce427a54 100755 --- a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs @@ -32,7 +32,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class DicomWebStowServiceStepDefinitions { - internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromSeconds(30); + internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromSeconds(130); internal static readonly string[] DummyWorkflows = new string[] { "WorkflowA", "WorkflowB" }; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly InformaticsGatewayClient _informaticsGatewayClient; diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index fe7af4bab..644e53b7b 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -126,6 +126,7 @@ public async Task AStudyThatIsExportedToTheTestHost() Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), MessageId = Guid.NewGuid().ToString(), WorkflowInstanceId = Guid.NewGuid().ToString(), + PayloadId = Guid.NewGuid().ToString(), }; _exportRequestEvent.PluginAssemblies.Add(typeof(DicomDeidentifier).AssemblyQualifiedName); @@ -193,6 +194,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), MessageId = Guid.NewGuid().ToString(), WorkflowInstanceId = Guid.NewGuid().ToString(), + PayloadId = Guid.NewGuid().ToString(), }; _exportRequestEvent.PluginAssemblies.Add(pluginName); var message = new JsonMessage( @@ -262,7 +264,7 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit } } - var timeoutPolicy = Policy.TimeoutAsync(40, TimeoutStrategy.Pessimistic); + var timeoutPolicy = Policy.TimeoutAsync(240, TimeoutStrategy.Pessimistic); await timeoutPolicy .ExecuteAsync( async () => { await SendRequest(exportCount); } diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index 6f5baf69d..989068895 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -132,11 +132,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.3, )", - "resolved": "1.0.3", - "contentHash": "UVD42tVcx4o9d+6pXlKwc6qv642wYVvXgnEI63ueu5Fi4+fPJwUyf1FRb1S6plzWj5YA7XE+jd1aGsCb97mwkg==", + "requested": "[1.0.4-rc0004, )", + "resolved": "1.0.4-rc0004", + "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.3", + "Monai.Deploy.Messaging": "1.0.4-rc0004", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -666,8 +666,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "DoQrTyztAGmOafiPNhxZ44D50Qcbqv4W94N9LxofyhW2NgSqMOKMbS+6FcomMsCKlLC1E3dyoYdZF8GFunwKUw==", + "resolved": "1.0.4-rc0004", + "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1954,7 +1954,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.3, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4-rc0004, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1967,7 +1967,7 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.3, )", + "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } From b472dfadd8c19577eaacb6e853b9329408252510 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 23 Oct 2023 17:31:07 +0100 Subject: [PATCH 25/75] removed direct ref to messaging Signed-off-by: Neil South --- src/Monai.Deploy.InformaticsGateway.sln | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/Monai.Deploy.InformaticsGateway.sln b/src/Monai.Deploy.InformaticsGateway.sln index 4a8706171..d851e6255 100644 --- a/src/Monai.Deploy.InformaticsGateway.sln +++ b/src/Monai.Deploy.InformaticsGateway.sln @@ -62,8 +62,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGateway.Test.PlugIns", "InformaticsGateway\Test\Plug-ins\Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj", "{6C83469B-4B8A-416E-ACA7-09454D721352}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.Messaging", "..\..\monai-deploy-messaging\src\Messaging\Monai.Deploy.Messaging.csproj", "{32A3AB42-5770-443C-A3C1-802575C4C08B}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -410,18 +408,6 @@ Global {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x64.Build.0 = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.ActiveCfg = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.Build.0 = Release|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x64.ActiveCfg = Debug|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x64.Build.0 = Debug|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x86.ActiveCfg = Debug|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Debug|x86.Build.0 = Debug|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|Any CPU.Build.0 = Release|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x64.ActiveCfg = Release|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x64.Build.0 = Release|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x86.ActiveCfg = Release|Any CPU - {32A3AB42-5770-443C-A3C1-802575C4C08B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 92ebf7e1023b798e04964d5d041bcc5977da0fd1 Mon Sep 17 00:00:00 2001 From: Neil South Date: Tue, 24 Oct 2023 11:11:19 +0100 Subject: [PATCH 26/75] adding new message lib Signed-off-by: Neil South --- doc/dependency_decisions.yml | 2 + ...Monai.Deploy.InformaticsGateway.Api.csproj | 3 +- src/Api/Test/packages.lock.json | 40 ++++++++++++++++--- src/Api/packages.lock.json | 40 ++++++++++++++++--- src/CLI/Test/packages.lock.json | 40 ++++++++++++++++--- src/CLI/packages.lock.json | 40 ++++++++++++++++--- src/Client/Test/packages.lock.json | 15 +++---- src/Client/packages.lock.json | 40 ++++++++++++++++--- src/Configuration/Test/packages.lock.json | 40 ++++++++++++++++--- src/Configuration/packages.lock.json | 40 ++++++++++++++++--- src/Database/Api/Test/packages.lock.json | 40 ++++++++++++++++--- src/Database/Api/packages.lock.json | 40 ++++++++++++++++--- .../EntityFramework/Test/packages.lock.json | 34 ++++++++++++---- .../EntityFramework/packages.lock.json | 34 ++++++++++++---- .../Integration.Test/packages.lock.json | 30 +++++++++++--- src/Database/MongoDB/packages.lock.json | 30 +++++++++++--- src/Database/packages.lock.json | 30 +++++++++++--- .../Monai.Deploy.InformaticsGateway.csproj | 2 +- .../Test/packages.lock.json | 15 +++---- src/InformaticsGateway/packages.lock.json | 15 +++---- .../Test/packages.lock.json | 30 +++++++++++--- .../RemoteAppExecution/packages.lock.json | 30 +++++++++++--- ...InformaticsGateway.Integration.Test.csproj | 2 +- tests/Integration.Test/packages.lock.json | 17 ++++---- 24 files changed, 533 insertions(+), 116 deletions(-) diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 77525fb3f..bee058ae7 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -775,6 +775,7 @@ :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - 1.0.3 + - 1.0.4 :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Messaging.RabbitMQ @@ -782,6 +783,7 @@ :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - 1.0.3 + - 1.0.4 :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Storage diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index 3ba16192b..ed19368f5 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -55,7 +55,8 @@ - + + diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index fdd279606..edc489b7e 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -258,6 +258,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -339,6 +349,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -684,6 +708,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1126,8 +1155,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1251,7 +1280,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 8d6ba8a0b..898a7a74c 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -35,9 +35,9 @@ }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.4-rc0004, )", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "requested": "[1.0.4, )", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -45,6 +45,17 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Direct", + "requested": "[1.0.4, )", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Direct", "requested": "[0.2.18, )", @@ -194,6 +205,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -212,6 +237,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -244,8 +274,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.common": { "type": "Project", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 1ddfc18a2..15a8c0324 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -506,6 +506,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -587,6 +597,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -959,6 +983,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1401,8 +1430,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1534,7 +1563,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 88e5facc0..f45d6d7b6 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -408,6 +408,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -433,6 +443,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -469,6 +493,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -501,8 +530,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -515,7 +544,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 0fcef1276..36843f9e7 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4-rc0004", + "Monai.Deploy.Messaging": "1.0.4", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1816,7 +1816,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1829,7 +1829,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index 2f837a0de..8ecf03f09 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -164,6 +164,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -189,6 +199,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -207,6 +231,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -239,8 +268,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -248,7 +277,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 81d86eb48..d87a39e6c 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -266,6 +266,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -347,6 +357,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -697,6 +721,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1139,8 +1168,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1264,7 +1293,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index cf3c45948..a05767d6a 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -164,6 +164,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -189,6 +199,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -207,6 +231,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -239,8 +268,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -248,7 +277,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index c2ddf9bfc..dd4d34036 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -240,6 +240,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -326,6 +336,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -671,6 +695,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1113,8 +1142,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1238,7 +1267,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index a442a5e9d..9e1f1f4de 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -170,6 +170,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -195,6 +205,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -213,6 +237,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -245,8 +274,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -254,7 +283,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 4e711738d..e5a296772 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -401,6 +401,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -492,6 +502,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -882,8 +901,8 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, "System.Net.Http": { "type": "Transitive", @@ -1327,8 +1346,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1452,7 +1471,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index fc740c1ef..0d9e1c3e1 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -324,6 +324,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -354,6 +364,15 @@ "resolved": "5.2.4", "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", "resolved": "2.1.2", @@ -412,8 +431,8 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", @@ -447,8 +466,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -456,7 +475,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index 7979ff107..3a2a4784a 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -283,6 +283,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -415,6 +425,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -1249,8 +1268,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1379,7 +1398,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index 01e986593..cc8a764f1 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -204,6 +204,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -264,6 +274,15 @@ "resolved": "5.2.4", "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -343,8 +362,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "ZstdSharp.Port": { "type": "Transitive", @@ -357,7 +376,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index f11e75ad3..527ebfc3c 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -363,6 +363,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -439,6 +449,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -556,8 +575,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "ZstdSharp.Port": { "type": "Transitive", @@ -570,7 +589,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index 3a5cc4a0b..a57bcabc0 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 43ca151c7..d9bcbd3d0 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -807,8 +807,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -818,10 +818,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4-rc0004", + "Monai.Deploy.Messaging": "1.0.4", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -2053,7 +2053,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2066,7 +2066,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 4ce3e5e1a..4820b0c07 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -20,11 +20,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.4-rc0004, )", - "resolved": "1.0.4-rc0004", - "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", + "requested": "[1.0.4, )", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4-rc0004", + "Monai.Deploy.Messaging": "1.0.4", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -546,8 +546,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1683,7 +1683,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 180d3caa9..d16f2b9c1 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -449,8 +449,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -458,6 +458,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -590,6 +600,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -1449,8 +1468,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1579,7 +1598,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 808d39f0c..439940cdf 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -387,6 +387,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.4", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -442,6 +452,15 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -559,8 +578,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "ZstdSharp.Port": { "type": "Transitive", @@ -573,7 +592,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index d737ca45d..ca7854f19 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index 989068895..ea3e1fea5 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -132,11 +132,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.4-rc0004, )", - "resolved": "1.0.4-rc0004", - "contentHash": "eai16hRZ0Z7wqbsWaX5ISg4av2FlLLyDf3JpxEu+YelyAdhXLaaLZqRhDlQo6xqLih6x5Xtrnl71pwIWh9TT4Q==", + "requested": "[1.0.4, )", + "resolved": "1.0.4", + "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4-rc0004", + "Monai.Deploy.Messaging": "1.0.4", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -666,8 +666,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4-rc0004", - "contentHash": "FrNe2mwf7gj5aylCYQ0af5Adv8/xQRRPDPFBp1a/sZP1m9TlWtjjwheDR0HVWjTq4M8LUpKzvt55mhQJxHld7w==", + "resolved": "1.0.4", + "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1954,7 +1954,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1967,7 +1967,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4-rc0004, )", + "Monai.Deploy.Messaging": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } From ffc26e2908cb1da19cb3aa5b64a747dd5cf87196 Mon Sep 17 00:00:00 2001 From: Neil South Date: Tue, 24 Oct 2023 14:04:48 +0100 Subject: [PATCH 27/75] more logging Signed-off-by: Neil South --- src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs | 4 ++-- .../Services/Connectors/PayloadAssembler.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs b/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs index d6198ed90..e1ee29d93 100755 --- a/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs +++ b/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs @@ -27,8 +27,8 @@ public static partial class Log [LoggerMessage(EventId = 3002, Level = LogLevel.Information, Message = "[Startup] {count} pending payloads removed from database.")] public static partial void TotalNumberOfPayloadsRemoved(this ILogger logger, int count); - [LoggerMessage(EventId = 3003, Level = LogLevel.Information, Message = "File added to bucket {key}. Queue size: {count}")] - public static partial void FileAddedToBucket(this ILogger logger, string key, int count); + [LoggerMessage(EventId = 3003, Level = LogLevel.Information, Message = "File added to bucket {key}. Queue size: {count}. PayloadId {PayloadId}")] + public static partial void FileAddedToBucket(this ILogger logger, string key, int count, string PayloadId); [LoggerMessage(EventId = 3004, Level = LogLevel.Trace, Message = "Number of incomplete payloads waiting for processing: {count}.")] public static partial void BucketsActive(this ILogger logger, int count); diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index ce1e0ce2e..d09a98b8d 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -105,7 +105,7 @@ public async Task Queue(string bucket, FileStorageMetadata file, DataOrigi var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, file.PayloadId).ConfigureAwait(false); payload.Add(file); - _logger.FileAddedToBucket(payload.Key, payload.Count); + _logger.FileAddedToBucket(payload.Key, payload.Count, file.PayloadId ?? "null"); return payload.PayloadId; } From 523b057cf5bd1c9688886688c14d947b4d5629c4 Mon Sep 17 00:00:00 2001 From: Neil South Date: Tue, 24 Oct 2023 14:39:38 +0100 Subject: [PATCH 28/75] fix false logging message Signed-off-by: Neil South --- src/InformaticsGateway/Services/Storage/ObjectUploadService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 src/InformaticsGateway/Services/Storage/ObjectUploadService.cs diff --git a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs old mode 100644 new mode 100755 index 9a219f185..a276dca33 --- a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs +++ b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs @@ -256,7 +256,7 @@ await _storageService.PutObjectAsync( metadata, cancellationToken).ConfigureAwait(false); storageObjectMetadata.SetUploaded(_configuration.Value.Storage.TemporaryStorageBucket); // deletes local file and sets uploaded to true - _logger.UploadedFileToStoreage(storageObjectMetadata.TemporaryPath); + _logger.UploadedFileToStoreage(path); storageObjectMetadata.SetMoved(_configuration.Value.Storage.StorageServiceBucketName); // set bucket, date moved, and move complete }) .ConfigureAwait(false); From de9da144d7b62014b678a278eee33253b8aac144 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 2 Nov 2023 14:52:53 +0000 Subject: [PATCH 29/75] adding basic auth to swagger Signed-off-by: Neil South --- .../Services/Http/Startup.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) mode change 100644 => 100755 src/InformaticsGateway/Services/Http/Startup.cs diff --git a/src/InformaticsGateway/Services/Http/Startup.cs b/src/InformaticsGateway/Services/Http/Startup.cs old mode 100644 new mode 100755 index f498e3545..dfc6dc5e1 --- a/src/InformaticsGateway/Services/Http/Startup.cs +++ b/src/InformaticsGateway/Services/Http/Startup.cs @@ -90,6 +90,28 @@ public void ConfigureServices(IServiceCollection services) services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "MONAI Deploy Informatics Gateway", Version = "v1" }); + c.DescribeAllParametersInCamelCase(); + c.AddSecurityDefinition("basic", new OpenApiSecurityScheme + { + Scheme = "basic", + Name = "basic", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }); + c.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "basic", + }, + }, + System.Array.Empty() + }, + }); }); services.Configure(options => From f66320d2994eaeb06d8a607e06bb44468d574f7f Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 3 Nov 2023 16:41:39 +0000 Subject: [PATCH 30/75] fixing minio version for tests Signed-off-by: Neil South --- docker-compose/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index b20931435..fda72734a 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -35,7 +35,7 @@ services: - monaideploy minio: - image: "minio/minio:latest" + image: "minio/minio:RELEASE.2023-10-16T04-13-43Z" command: server --console-address ":9001" /data hostname: minio volumes: From d25bbc1c10e88309cbcbe9b016ae334b63dd0534 Mon Sep 17 00:00:00 2001 From: Neil South Date: Tue, 7 Nov 2023 14:29:45 +0000 Subject: [PATCH 31/75] fix for minio breaking integration tests Signed-off-by: Neil South --- docker-compose/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 docker-compose/docker-compose.yml diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml old mode 100644 new mode 100755 index b20931435..fda72734a --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -35,7 +35,7 @@ services: - monaideploy minio: - image: "minio/minio:latest" + image: "minio/minio:RELEASE.2023-10-16T04-13-43Z" command: server --console-address ":9001" /data hostname: minio volumes: From 206d333942b2166ea6a7497207ef04d08081ccd7 Mon Sep 17 00:00:00 2001 From: Neil South Date: Wed, 15 Nov 2023 14:17:39 +0000 Subject: [PATCH 32/75] more logging Signed-off-by: Neil South --- src/Client/Test/packages.lock.json | 137 ++++++++++++++++- .../Logging/Log.500.ExportService.cs | 3 + .../Logging/Log.700.PayloadService.cs | 3 + .../Monai.Deploy.InformaticsGateway.csproj | 1 + .../PayloadNotificationActionHandler.cs | 1 + .../Connectors/PayloadNotificationService.cs | 5 + .../Services/Export/ExportServiceBase.cs | 1 + .../Test/packages.lock.json | 137 ++++++++++++++++- src/InformaticsGateway/packages.lock.json | 139 ++++++++++++++++++ src/Monai.Deploy.InformaticsGateway.sln | 28 ++++ ...emoteAppExecutionPlugInsStepDefinitions.cs | 11 +- tests/Integration.Test/packages.lock.json | 128 +++++++++++++++- 12 files changed, 586 insertions(+), 8 deletions(-) mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.500.ExportService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 36843f9e7..a9784ddb6 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -44,6 +44,16 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, + "AideDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0062", + "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -284,6 +294,24 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -308,6 +336,17 @@ "System.Text.Json": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -383,6 +422,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -425,6 +492,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -1803,6 +1919,24 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AideDicomTools": "[0.1.1-rc0062, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.Extensions.Configuration": "[6.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.3, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -1820,7 +1954,8 @@ "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", - "Swashbuckle.AspNetCore": "[6.5.0, )" + "Swashbuckle.AspNetCore": "[6.5.0, )", + "monai-deploy-informatics-gateway-pseudonymisation": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.api": { diff --git a/src/InformaticsGateway/Logging/Log.500.ExportService.cs b/src/InformaticsGateway/Logging/Log.500.ExportService.cs old mode 100644 new mode 100755 index 5d2b826f6..1588b94eb --- a/src/InformaticsGateway/Logging/Log.500.ExportService.cs +++ b/src/InformaticsGateway/Logging/Log.500.ExportService.cs @@ -132,5 +132,8 @@ public static partial class Log [LoggerMessage(EventId = 536, Level = LogLevel.Error, Message = "Error executing data plug-ins.")] public static partial void ErrorExecutingDataPlugIns(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 537, Level = LogLevel.Error, Message = "Error executing OutputDataEngine plug-in.")] + public static partial void OutputDataEngineBlockException(this ILogger logger, Exception ex); } } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs index 600f6f14f..7720e70f4 100755 --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -157,5 +157,8 @@ public static partial class Log [LoggerMessage(EventId = 750, Level = LogLevel.Information, Message = "Artifact recieved published to {queue}, message ID={messageId}. Payload took {durationSeconds} seconds to complete.")] public static partial void ArtifactRecievedPublished(this ILogger logger, string queue, string messageId, double durationSeconds); + + [LoggerMessage(EventId = 751, Level = LogLevel.Debug, Message = "NotifyAsync for payload {payloadId}.")] + public static partial void PayloadNotifyAsync(this ILogger logger, Guid payloadId); } } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index a57bcabc0..d2eb7646b 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -66,6 +66,7 @@ + diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 3cfbdefe2..5dd3ebf81 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -62,6 +62,7 @@ public PayloadNotificationActionHandler(IServiceScopeFactory serviceScopeFactory public async Task NotifyAsync(Payload payload, ActionBlock notificationQueue, CancellationToken cancellationToken = default) { + _logger.PayloadNotifyAsync(payload.PayloadId); Guard.Against.Null(payload, nameof(payload)); Guard.Against.Null(notificationQueue, nameof(notificationQueue)); diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs old mode 100644 new mode 100755 index bd040ed48..45bc68268 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs @@ -155,6 +155,11 @@ private async Task NotificationHandler(Payload payload) try { + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { + { "Payload", payload.PayloadId }, + { "WorkflowInstanceId", payload.WorkflowInstanceId ?? "NotSet" }, + { "TaskId", payload.TaskId ?? "NotSet" }, + }); await _payloadNotificationActionHandler.NotifyAsync(payload, _publishQueue!, _cancellationTokenSource.Token).ConfigureAwait(false); } catch (PostPayloadException ex) diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index 9525b6174..4a2b2a0e3 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -174,6 +174,7 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) } catch (Exception e) { + _logger.OutputDataEngineBlockException(e); exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"failed to execute plugin {e.Message}"); return exportDataRequest; } diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index d9bcbd3d0..9a30e578a 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -95,6 +95,16 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, + "AideDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0062", + "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -518,6 +528,24 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -542,6 +570,17 @@ "System.Text.Json": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -617,6 +656,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -659,6 +726,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", "resolved": "2.2.0", @@ -2040,6 +2156,24 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AideDicomTools": "[0.1.1-rc0062, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.Extensions.Configuration": "[6.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.3, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -2057,7 +2191,8 @@ "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", - "Swashbuckle.AspNetCore": "[6.5.0, )" + "Swashbuckle.AspNetCore": "[6.5.0, )", + "monai-deploy-informatics-gateway-pseudonymisation": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.api": { diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 4820b0c07..743e6d5b1 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -76,6 +76,16 @@ "Swashbuckle.AspNetCore.SwaggerUI": "6.5.0" } }, + "AideDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0062", + "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -289,6 +299,24 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -313,6 +341,17 @@ "System.Text.Json": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -388,6 +427,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -430,6 +497,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -956,6 +1072,11 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.Diagnostics.Tools": { "type": "Transitive", "resolved": "4.3.0", @@ -1677,6 +1798,24 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AideDicomTools": "[0.1.1-rc0062, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.Extensions.Configuration": "[6.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.3, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { diff --git a/src/Monai.Deploy.InformaticsGateway.sln b/src/Monai.Deploy.InformaticsGateway.sln index d851e6255..5da23dc12 100644 --- a/src/Monai.Deploy.InformaticsGateway.sln +++ b/src/Monai.Deploy.InformaticsGateway.sln @@ -62,6 +62,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGateway.Test.PlugIns", "InformaticsGateway\Test\Plug-ins\Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj", "{6C83469B-4B8A-416E-ACA7-09454D721352}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "monai-deploy-informatics-gateway-pseudonymisation", "..\..\monai-deploy-informatics-gateway-pseudonymisation\monai-deploy-informatics-gateway-pseudonymisation.csproj", "{D28F9153-5929-460C-91D7-04A7E472DBD4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AideDicomTools", "..\..\AIDE-dicom-toolkit\src\AideDicomTools\AideDicomTools.csproj", "{1181130D-A1E4-431A-80F1-182E56FD8731}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -408,6 +412,30 @@ Global {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x64.Build.0 = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.ActiveCfg = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.Build.0 = Release|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x64.ActiveCfg = Debug|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x64.Build.0 = Debug|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x86.ActiveCfg = Debug|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x86.Build.0 = Debug|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|Any CPU.Build.0 = Release|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x64.ActiveCfg = Release|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x64.Build.0 = Release|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x86.ActiveCfg = Release|Any CPU + {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x86.Build.0 = Release|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x64.ActiveCfg = Debug|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x64.Build.0 = Debug|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x86.ActiveCfg = Debug|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x86.Build.0 = Debug|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|Any CPU.Build.0 = Release|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x64.ActiveCfg = Release|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x64.Build.0 = Release|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x86.ActiveCfg = Release|Any CPU + {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index 644e53b7b..e3904d4d2 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -24,6 +24,7 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.InformaticsGateway.PlugIns.Pseudonymisation; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; @@ -129,7 +130,7 @@ public async Task AStudyThatIsExportedToTheTestHost() PayloadId = Guid.NewGuid().ToString(), }; - _exportRequestEvent.PluginAssemblies.Add(typeof(DicomDeidentifier).AssemblyQualifiedName); + _exportRequestEvent.PluginAssemblies.Add(typeof(Pseudonymise).AssemblyQualifiedName); var message = new JsonMessage( _exportRequestEvent, @@ -178,8 +179,8 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() await _dataSinkMinio.SendAsync(_dataProvider); - // send 2 messagees the first on should fail, teh second one should not - string pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; + // send 2 messagees the first on should fail, the second one should not + string pluginName = typeof(Pseudonymis_Rehydrate).AssemblyQualifiedName; pluginName = pluginName.Replace("DicomDeidentifier", "fail"); for (int i = 0; i < 2; ++i) @@ -205,7 +206,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() _receivedExportCompletedMessages.ClearMessages(); await _messagePublisher.Publish("md.export.request.monaiscu", message.ToMessage()); - pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; + pluginName = typeof(Pseudonymise).AssemblyQualifiedName; } } @@ -247,7 +248,7 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit Name = MonaiAeTitle, Grouping = _dataProvider.StudyGrouping, Timeout = 3, - PlugInAssemblies = new List() { typeof(DicomReidentifier).AssemblyQualifiedName } + PlugInAssemblies = new List() { typeof(Pseudonymis_Rehydrate).AssemblyQualifiedName } }, CancellationToken.None); _dataProvider.Destination = MonaiAeTitle; } diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index ea3e1fea5..41f35727e 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -226,6 +226,16 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, + "AideDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0062", + "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -413,6 +423,15 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -425,6 +444,17 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -500,6 +530,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -542,6 +600,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -1941,6 +2048,24 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AideDicomTools": "[0.1.1-rc0062, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.Extensions.Configuration": "[6.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.3, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -1958,7 +2083,8 @@ "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", - "Swashbuckle.AspNetCore": "[6.5.0, )" + "Swashbuckle.AspNetCore": "[6.5.0, )", + "monai-deploy-informatics-gateway-pseudonymisation": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.api": { From 2bdc712b896b64385162133d84450535312fa7a5 Mon Sep 17 00:00:00 2001 From: Neil South Date: Wed, 15 Nov 2023 14:27:04 +0000 Subject: [PATCH 33/75] fixup solution Signed-off-by: Neil South --- src/Client/Test/packages.lock.json | 137 +----------------- .../Monai.Deploy.InformaticsGateway.csproj | 1 - .../Test/packages.lock.json | 137 +----------------- src/Monai.Deploy.InformaticsGateway.sln | 28 ---- ...emoteAppExecutionPlugInsStepDefinitions.cs | 10 +- tests/Integration.Test/packages.lock.json | 128 +--------------- 6 files changed, 8 insertions(+), 433 deletions(-) diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index a9784ddb6..36843f9e7 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -44,16 +44,6 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0062", - "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -294,24 +284,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -336,17 +308,6 @@ "System.Text.Json": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -422,34 +383,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -492,55 +425,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -1919,24 +1803,6 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0062, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -1954,8 +1820,7 @@ "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", - "Swashbuckle.AspNetCore": "[6.5.0, )", - "monai-deploy-informatics-gateway-pseudonymisation": "[1.0.0, )" + "Swashbuckle.AspNetCore": "[6.5.0, )" } }, "monai.deploy.informaticsgateway.api": { diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index d2eb7646b..a57bcabc0 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -66,7 +66,6 @@ - diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 9a30e578a..d9bcbd3d0 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -95,16 +95,6 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0062", - "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -528,24 +518,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -570,17 +542,6 @@ "System.Text.Json": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -656,34 +617,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -726,55 +659,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", "resolved": "2.2.0", @@ -2156,24 +2040,6 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0062, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -2191,8 +2057,7 @@ "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", - "Swashbuckle.AspNetCore": "[6.5.0, )", - "monai-deploy-informatics-gateway-pseudonymisation": "[1.0.0, )" + "Swashbuckle.AspNetCore": "[6.5.0, )" } }, "monai.deploy.informaticsgateway.api": { diff --git a/src/Monai.Deploy.InformaticsGateway.sln b/src/Monai.Deploy.InformaticsGateway.sln index 5da23dc12..d851e6255 100644 --- a/src/Monai.Deploy.InformaticsGateway.sln +++ b/src/Monai.Deploy.InformaticsGateway.sln @@ -62,10 +62,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGateway.Test.PlugIns", "InformaticsGateway\Test\Plug-ins\Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj", "{6C83469B-4B8A-416E-ACA7-09454D721352}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "monai-deploy-informatics-gateway-pseudonymisation", "..\..\monai-deploy-informatics-gateway-pseudonymisation\monai-deploy-informatics-gateway-pseudonymisation.csproj", "{D28F9153-5929-460C-91D7-04A7E472DBD4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AideDicomTools", "..\..\AIDE-dicom-toolkit\src\AideDicomTools\AideDicomTools.csproj", "{1181130D-A1E4-431A-80F1-182E56FD8731}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -412,30 +408,6 @@ Global {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x64.Build.0 = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.ActiveCfg = Release|Any CPU {6C83469B-4B8A-416E-ACA7-09454D721352}.Release|x86.Build.0 = Release|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x64.ActiveCfg = Debug|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x64.Build.0 = Debug|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x86.ActiveCfg = Debug|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Debug|x86.Build.0 = Debug|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|Any CPU.Build.0 = Release|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x64.ActiveCfg = Release|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x64.Build.0 = Release|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x86.ActiveCfg = Release|Any CPU - {D28F9153-5929-460C-91D7-04A7E472DBD4}.Release|x86.Build.0 = Release|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x64.ActiveCfg = Debug|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x64.Build.0 = Debug|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x86.ActiveCfg = Debug|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Debug|x86.Build.0 = Debug|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|Any CPU.Build.0 = Release|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x64.ActiveCfg = Release|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x64.Build.0 = Release|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x86.ActiveCfg = Release|Any CPU - {1181130D-A1E4-431A-80F1-182E56FD8731}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index e3904d4d2..02984c323 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -24,7 +24,7 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; -using Monai.Deploy.InformaticsGateway.PlugIns.Pseudonymisation; +//using Monai.Deploy.InformaticsGateway.PlugIns.Pseudonymisation; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; @@ -130,7 +130,7 @@ public async Task AStudyThatIsExportedToTheTestHost() PayloadId = Guid.NewGuid().ToString(), }; - _exportRequestEvent.PluginAssemblies.Add(typeof(Pseudonymise).AssemblyQualifiedName); + _exportRequestEvent.PluginAssemblies.Add(typeof(DicomDeidentifier).AssemblyQualifiedName); var message = new JsonMessage( _exportRequestEvent, @@ -180,7 +180,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() await _dataSinkMinio.SendAsync(_dataProvider); // send 2 messagees the first on should fail, the second one should not - string pluginName = typeof(Pseudonymis_Rehydrate).AssemblyQualifiedName; + string pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; pluginName = pluginName.Replace("DicomDeidentifier", "fail"); for (int i = 0; i < 2; ++i) @@ -206,7 +206,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() _receivedExportCompletedMessages.ClearMessages(); await _messagePublisher.Publish("md.export.request.monaiscu", message.ToMessage()); - pluginName = typeof(Pseudonymise).AssemblyQualifiedName; + pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; } } @@ -248,7 +248,7 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit Name = MonaiAeTitle, Grouping = _dataProvider.StudyGrouping, Timeout = 3, - PlugInAssemblies = new List() { typeof(Pseudonymis_Rehydrate).AssemblyQualifiedName } + PlugInAssemblies = new List() { typeof(DicomReidentifier).AssemblyQualifiedName } }, CancellationToken.None); _dataProvider.Destination = MonaiAeTitle; } diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index 41f35727e..ea3e1fea5 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -226,16 +226,6 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0062", - "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -423,15 +413,6 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -444,17 +425,6 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -530,34 +500,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -600,55 +542,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -2048,24 +1941,6 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0062, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -2083,8 +1958,7 @@ "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", - "Swashbuckle.AspNetCore": "[6.5.0, )", - "monai-deploy-informatics-gateway-pseudonymisation": "[1.0.0, )" + "Swashbuckle.AspNetCore": "[6.5.0, )" } }, "monai.deploy.informaticsgateway.api": { From a7df6ffa400ba20d9cb668c3ca86096cf8a91c60 Mon Sep 17 00:00:00 2001 From: Lillie Dae <61380713+lillie-dae@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:08:00 +0000 Subject: [PATCH 34/75] Ai 292 hl 7 configuration (#495) * changes for HL7Configuration endpoint Signed-off-by: Lillie Dae --------- Signed-off-by: Lillie Dae --- src/Api/Hl7ApplicationConfigEntity.cs | 143 ++++++++ src/Api/Test/BaseApplicationEntityTest.cs | 4 +- .../Test/DestinationApplicationEntityTest.cs | 4 +- .../Test/Hl7ApplicationConfigEntityTest.cs | 190 +++++++++++ src/Api/Test/MonaiApplicationEntityTest.cs | 4 +- .../IHl7ApplicationConfigRepository.cs | 35 ++ src/Database/DatabaseManager.cs | 2 + .../Hl7ApplicationConfigConfiguration.cs | 30 ++ .../InformaticsGatewayContext.cs | 4 + .../Hl7ApplicationConfigRepository.cs | 99 ++++++ .../Hl7ApplicationConfigRepository.cs | 149 ++++++++ .../Logging/Log.8000.HttpServices.cs | 7 + .../Services/DicomWeb/ContentTypes.cs | 1 + .../Http/Hl7ApplicationConfigController.cs | 172 ++++++++++ ...onai.Deploy.InformaticsGateway.Test.csproj | 1 + .../Hl7ApplicationConfigControllerTest.cs | 322 ++++++++++++++++++ .../Test/packages.lock.json | 22 ++ 17 files changed, 1183 insertions(+), 6 deletions(-) create mode 100644 src/Api/Hl7ApplicationConfigEntity.cs create mode 100644 src/Api/Test/Hl7ApplicationConfigEntityTest.cs create mode 100644 src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs create mode 100644 src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs create mode 100644 src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs create mode 100644 src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs create mode 100644 src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs create mode 100644 src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs new file mode 100644 index 000000000..faa75b272 --- /dev/null +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -0,0 +1,143 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Common; +using Newtonsoft.Json; + +namespace Monai.Deploy.InformaticsGateway.Api +{ + public class Hl7ApplicationConfigEntity : MongoDBEntityBase + { + /// + /// Gets or sets the sending identifier. + /// + [JsonProperty("sending_identifier")] + public StringKeyValuePair SendingId { get; set; } = new(); + + /// + /// Gets or sets the data link. + /// Value is either PatientId or StudyInstanceUid + /// + [JsonProperty("data_link")] + public DataKeyValuePair DataLink { get; set; } = new(); + + /// + /// Gets or sets the data mapping. + /// Value is a DICOM Tag + /// + [JsonProperty("data_mapping")] + public List DataMapping { get; set; } = new(); + + public IEnumerable Validate() + { + var errors = new List(); + if (string.IsNullOrWhiteSpace(SendingId.Key)) + errors.Add($"{nameof(SendingId.Key)} is missing."); + if (string.IsNullOrWhiteSpace(SendingId.Value)) + errors.Add($"{nameof(SendingId.Value)} is missing."); + + if (string.IsNullOrWhiteSpace(DataLink.Key)) + errors.Add($"{nameof(DataLink.Key)} is missing."); + + if (DataMapping.IsNullOrEmpty()) + errors.Add($"{nameof(DataMapping)} is missing values."); + + ValidateDataMapping(errors); + + return errors; + } + + private void ValidateDataMapping(List errors) + { + for (var idx = 0; idx < DataMapping.Count; idx++) + { + var dataMapKvp = DataMapping[idx]; + + if (string.IsNullOrWhiteSpace(dataMapKvp.Key) || dataMapKvp.Value.Length < 8) + { + if (string.IsNullOrWhiteSpace(dataMapKvp.Key)) + errors.Add($"{nameof(DataMapping)} is missing a name at index {idx}."); + + if (string.IsNullOrWhiteSpace(dataMapKvp.Value) || dataMapKvp.Value.Length < 8) + errors.Add($"{nameof(DataMapping)} ({dataMapKvp.Key}) @ index {idx} is not a valid DICOM Tag."); + + continue; + } + + try + { + DicomTag.Parse(dataMapKvp.Value); + } + catch (Exception e) + { + errors.Add($"DataMapping.Value is not a valid DICOM Tag. {e.Message}"); + } + } + } + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } + } + + //string key, string value + public class StringKeyValuePair : IKeyValuePair + { + [Key] + public string Key { get; set; } = string.Empty; + public string Value { get; set; } = string.Empty; + + public static implicit operator StringKeyValuePair(KeyValuePair kvp) + { + return new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }; + } + + public static List FromDictionary(Dictionary dictionary) => + dictionary.Select(kvp => new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }).ToList(); + + } + + public class DataKeyValuePair : IKeyValuePair + { + [Key] + public string Key { get; set; } = string.Empty; + public DataLinkType Value { get; set; } + + public static implicit operator DataKeyValuePair(KeyValuePair kvp) + { + return new DataKeyValuePair { Key = kvp.Key, Value = kvp.Value }; + } + } + + public interface IKeyValuePair + { + public TKey Key { get; set; } + public TValue Value { get; set; } + } + + public enum DataLinkType + { + PatientId, + StudyInstanceUid + } +} diff --git a/src/Api/Test/BaseApplicationEntityTest.cs b/src/Api/Test/BaseApplicationEntityTest.cs index ef9b14808..519137836 100644 --- a/src/Api/Test/BaseApplicationEntityTest.cs +++ b/src/Api/Test/BaseApplicationEntityTest.cs @@ -21,7 +21,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class BaseApplicationEntityTest { [Fact] - public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToSetName() + public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { var entity = new BaseApplicationEntity { @@ -35,7 +35,7 @@ public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValues } [Fact] - public void GivenABaseApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotSetName() + public void GivenABaseApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { var entity = new BaseApplicationEntity { diff --git a/src/Api/Test/DestinationApplicationEntityTest.cs b/src/Api/Test/DestinationApplicationEntityTest.cs index 9e8287842..d050b86c9 100644 --- a/src/Api/Test/DestinationApplicationEntityTest.cs +++ b/src/Api/Test/DestinationApplicationEntityTest.cs @@ -21,7 +21,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class MonaiApplicationEntityTest { [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToBeUsed() + public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToBeUsed() { var entity = new MonaiApplicationEntity { @@ -41,7 +41,7 @@ public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValue } [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotOverwrite() + public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotOverwrite() { var entity = new MonaiApplicationEntity { diff --git a/src/Api/Test/Hl7ApplicationConfigEntityTest.cs b/src/Api/Test/Hl7ApplicationConfigEntityTest.cs new file mode 100644 index 000000000..ae1a1bc2c --- /dev/null +++ b/src/Api/Test/Hl7ApplicationConfigEntityTest.cs @@ -0,0 +1,190 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Api.Test +{ + public class Hl7ApplicationConfigEntityTest + { + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenSendingIdKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair(string.Empty, "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.SendingId.Key)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenSendingIdValueIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", string.Empty), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.SendingId.Value)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataLinkKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair(string.Empty, DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataLink.Key)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary()) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} is missing values.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { string.Empty, "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} is missing a name at index 0.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", string.Empty } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} (DataMappingKey) @ index 0 is not a valid DICOM Tag.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsNotAValidDicomTag_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains("DataMapping.Value is not a valid DICOM Tag. Error parsing DICOM tag ['DataMappingValue']", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsAValidDicomTag_ExpectValidateToReturnNoErrors() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "0020,000D" } }) + }; + + var errors = entity.Validate(); + + Assert.Empty(errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsEmpty_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} (DataMappingKey) @ index 0 is not a valid DICOM Tag.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenToStringIsCalled_ExpectToStringToReturnExpectedValue() + { + var guid = Guid.NewGuid(); + var dt = DateTime.UtcNow; + var entity = new Hl7ApplicationConfigEntity + { + Id = guid, + DateTimeCreated = dt, + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "0020,000D" } }) + }; + + var result = entity.ToString(); + + var expected = JsonConvert.SerializeObject(entity); + Assert.Equal(expected, result); + } + } +} diff --git a/src/Api/Test/MonaiApplicationEntityTest.cs b/src/Api/Test/MonaiApplicationEntityTest.cs index d91dd1166..d84038628 100644 --- a/src/Api/Test/MonaiApplicationEntityTest.cs +++ b/src/Api/Test/MonaiApplicationEntityTest.cs @@ -21,7 +21,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class DestinationApplicationEntityTest { [Fact] - public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToSetName() + public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { var entity = new DestinationApplicationEntity { @@ -36,7 +36,7 @@ public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExepectSetDefaul } [Fact] - public void GivenADestinationApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotSetName() + public void GivenADestinationApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { var entity = new DestinationApplicationEntity { diff --git a/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs b/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..b381d4da6 --- /dev/null +++ b/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IHl7ApplicationConfigRepository + { + Task> GetAllAsync(CancellationToken cancellationToken = default); + + Task GetByIdAsync(string id); + + Task DeleteAsync(string id, CancellationToken cancellationToken = default); + + Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default); + + Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index 2efe60d8d..ec9fc73ca 100755 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -91,6 +91,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IPayloadRepository), typeof(EntityFramework.Repositories.PayloadRepository)); services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(EntityFramework.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(EntityFramework.Repositories.VirtualApplicationEntityRepository)); + services.AddScoped(typeof(IHl7ApplicationConfigRepository), typeof(EntityFramework.Repositories.Hl7ApplicationConfigRepository)); services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); return services; @@ -106,6 +107,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IPayloadRepository), typeof(MongoDB.Repositories.PayloadRepository)); services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(MongoDB.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(MongoDB.Repositories.VirtualApplicationEntityRepository)); + services.AddScoped(typeof(IHl7ApplicationConfigRepository), typeof(MongoDB.Repositories.Hl7ApplicationConfigRepository)); services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); diff --git a/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs new file mode 100644 index 000000000..41ad63ad3 --- /dev/null +++ b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs @@ -0,0 +1,30 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class Hl7ApplicationConfigConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(j => j.Id); + } + } +} diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index 52b410c39..7b1978802 100755 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -42,6 +42,9 @@ public InformaticsGatewayContext(DbContextOptions opt public virtual DbSet DicomAssociationHistories { get; set; } public virtual DbSet VirtualApplicationEntities { get; set; } + public virtual DbSet Hl7ApplicationConfig { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); @@ -54,6 +57,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.ApplyConfiguration(new StorageMetadataWrapperEntityConfiguration()); modelBuilder.ApplyConfiguration(new DicomAssociationInfoConfiguration()); modelBuilder.ApplyConfiguration(new VirtualApplicationEntityConfiguration()); + modelBuilder.ApplyConfiguration(new Hl7ApplicationConfigConfiguration()); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) diff --git a/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..7f6711ab4 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs @@ -0,0 +1,99 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class Hl7ApplicationConfigRepository : IHl7ApplicationConfigRepository + { + private readonly ILogger _logger; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + + public Hl7ApplicationConfigRepository(ILogger logger, + IOptions options, IServiceScopeFactory serviceScopeFactory) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + var scope = serviceScopeFactory.CreateScope(); + + _informaticsGatewayContext = scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public Task> GetAllAsync(CancellationToken cancellationToken = default) => + _retryPolicy.ExecuteAsync(() => _dataset.ToListAsync(cancellationToken)); + + public Task GetByIdAsync(string id) => + _retryPolicy.ExecuteAsync(() => _dataset.FirstOrDefaultAsync(x => x.Id.Equals(id))); + + public Task DeleteAsync(string id, CancellationToken cancellationToken) + { + return _retryPolicy.ExecuteAsync(async () => + { + var entity = await GetByIdAsync(id).ConfigureAwait(false); + if (entity is null) + { + throw new DatabaseException("Failed to delete entity."); + } + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }); + } + + public Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(configEntity, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }); + } + + public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(configEntity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + })!; + } + } +} diff --git a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..04cdc1df8 --- /dev/null +++ b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs @@ -0,0 +1,149 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class Hl7ApplicationConfigRepository : IHl7ApplicationConfigRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public Hl7ApplicationConfigRepository(IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(Hl7ApplicationConfigEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.DateTimeCreated); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + } + + public Task> GetAllAsync(CancellationToken cancellationToken = default) => + _retryPolicy.ExecuteAsync(() => + _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken)); + + public Task GetByIdAsync(string id) => + _retryPolicy.ExecuteAsync(() => _collection + .Find(x => x.Id.Equals(id)) + .FirstOrDefaultAsync())!; + + public Task DeleteAsync(string id, CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var entity = await GetByIdAsync(id).ConfigureAwait(false); + if (entity is null) + { + throw new DatabaseException("Failed to delete entity."); + } + + var result = await _collection + .DeleteOneAsync(Builders.Filter.Where(p => p.Id.Equals(id)), + cancellationToken: cancellationToken).ConfigureAwait(false); + + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + + return entity; + }); + } + + public Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(configEntity, cancellationToken: cancellationToken) + .ConfigureAwait(false); + return configEntity; + }); + } + + public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection + .ReplaceOneAsync(Builders.Filter.Where(p => p.Id.Equals(configEntity.Id)), + configEntity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + + return configEntity; + })!; + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs index 48fcdd325..aebdb7e23 100644 --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -179,5 +179,12 @@ public static partial class Log // [LoggerMessage(EventId = 8300, Level = LogLevel.Error, Message = "Unexpected error occurred in GET /dicom-associations API..")] public static partial void DicomAssociationsControllerGetError(this ILogger logger, Exception ex); + + /// + /// HL7 Application Configuration controller + /// + [LoggerMessage(EventId = 8400, Level = LogLevel.Error, Message = "Unexpected error occurred in PUT {endpoint} API.")] + public static partial void PutHl7ApplicationConfigException(this ILogger logger, string endpoint, Exception ex); + } } diff --git a/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs b/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs index 7bb731f23..4fc30edea 100644 --- a/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs +++ b/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs @@ -22,6 +22,7 @@ internal static class ContentTypes public const string ApplicationDicomJson = "application/dicom+json"; public const string ApplicationDicomXml = "application/dicom+xml"; public const string ApplicationOctetStream = "application/octet-stream"; + public const string ApplicationJson = "application/json"; public const string MultipartRelated = "multipart/related"; diff --git a/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs new file mode 100644 index 000000000..d49913ebe --- /dev/null +++ b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs @@ -0,0 +1,172 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.DicomWeb; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [ApiController] + [Route("configEntity/hl7-application")] + public class Hl7ApplicationConfigController : ApiControllerBase + { + private const string Endpoint = "configEntity/hl7-application"; + + private readonly ILogger _logger; + private readonly IHl7ApplicationConfigRepository _repository; + + public Hl7ApplicationConfigController(ILogger logger, + IHl7ApplicationConfigRepository repository) + { + _logger = logger; + _repository = repository; + } + + [HttpGet] + [Produces(ContentTypes.ApplicationJson)] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task Get() + { + var data = await _repository.GetAllAsync().ConfigureAwait(false); + return Ok(data); + } + + [HttpGet("{id}")] + [Produces(ContentTypes.ApplicationJson)] + [ProducesResponseType(typeof(Hl7ApplicationConfigEntity), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task Get(string id) + { + var data = await _repository.GetByIdAsync(id).ConfigureAwait(false); + if (data == null) + { + return NotFound(); + } + + return Ok(data); + } + + [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Delete(string id) + { + var data = await _repository.GetByIdAsync(id).ConfigureAwait(false); + if (data == null) + { + return NotFound(); + } + + try + { + var result = await _repository.DeleteAsync(id).ConfigureAwait(false); + return Ok(result); + } + catch (DatabaseException ex) + { + return Problem(title: "Database error removing HL7 Application Configuration.", statusCode: BadRequest, + detail: ex.Message); + } + catch (Exception ex) + { + return Problem(title: "Unknown error removing HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + + [HttpPut] + [Consumes(ContentTypes.ApplicationJson)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Put([FromBody] Hl7ApplicationConfigEntity configEntity) + { + if (configEntity == null) + { + return Problem(title: "Hl7ApplicationConfigEntity is null.", statusCode: BadRequest, detail: "Hl7ApplicationConfigEntity is null."); + } + + var errorMessages = configEntity.Validate().ToList(); + if (errorMessages.Any()) + { + var message = "Hl7ApplicationConfigEntity is invalid. " + string.Join(", ", errorMessages); + return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); + } + + configEntity.Id = Guid.NewGuid(); + try + { + await _repository.CreateAsync(configEntity).ConfigureAwait(false); + return Ok(configEntity.Id); + } + catch (Exception ex) + { + _logger.PutHl7ApplicationConfigException(Endpoint, ex); + return Problem(title: "Error adding new HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + + [HttpPost] + [Consumes(ContentTypes.ApplicationJson)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Post([FromBody] Hl7ApplicationConfigEntity configEntity) + { + if (configEntity == null) + { + return Problem(title: "Hl7ApplicationConfigEntity is null.", statusCode: BadRequest, detail: "Hl7ApplicationConfigEntity is null."); + } + + var errorMessages = configEntity.Validate().ToList(); + if (errorMessages.Any()) + { + var message = "Hl7ApplicationConfigEntity is invalid. " + string.Join(", ", errorMessages); + return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); + } + + try + { + var result = await _repository.UpdateAsync(configEntity).ConfigureAwait(false); + if (result is null) + { + return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, + detail: "configEntity not found."); + } + return Ok(result); + } + catch (DatabaseException ex) + { + return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, + detail: ex.Message); + } + catch (Exception ex) + { + return Problem(title: "Unknown error updating HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + } +} diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj index 9680120d1..0f1df6ef4 100755 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -36,6 +36,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs new file mode 100644 index 000000000..38d1bc89a --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs @@ -0,0 +1,322 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Http; +using Moq; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Http +{ + public class Hl7ApplicationConfigControllerTest + { + private readonly Mock> _logger; + private readonly Mock _loggerFactory; + private readonly Hl7ApplicationConfigController _controller; + private readonly Mock _repo; + + public Hl7ApplicationConfigControllerTest() + { + _loggerFactory = new Mock(); + _logger = new Mock>(); + _repo = new Mock(); + _loggerFactory.Setup(p => p.CreateLogger(It.IsAny())).Returns(_logger.Object); + + _controller = new Hl7ApplicationConfigController( + _logger.Object, _repo.Object); + } + + private static Hl7ApplicationConfigEntity ValidApplicationEntity(string dicomStr) + { + var validApplicationEntity = new Hl7ApplicationConfigEntity() + { + Id = Guid.Empty, + DataLink = KeyValuePair.Create("testKey", DataLinkType.PatientId), + DataMapping = new() { KeyValuePair.Create("datamapkey", dicomStr) }, + SendingId = KeyValuePair.Create("sendingidkey", "sendingidvalue"), + DateTimeCreated = DateTime.UtcNow + }; + return validApplicationEntity; + } + + #region GET Tests + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsOK() + { + _repo.Setup(r => r.GetAllAsync(It.IsAny())) + .ReturnsAsync(new List()); + var result = await _controller.Get(); + + var okResult = Assert.IsType(result); + var response = Assert.IsType>(okResult.Value); + Assert.Empty(response); + } + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsNotFound() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Get("test"); + + Assert.IsType(result); + } + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsOK2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Get("test"); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + #endregion + + #region DELETE Tests + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsNotFound() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Delete("test"); + + Assert.IsType(result); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsOK() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Delete("test"); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsInternalServerError() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Delete("test"); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsInternalServerError2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .Throws(new Exception()); + var result = await _controller.Delete("test"); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + + #region PUT Tests + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsOK() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Put(validApplicationEntity); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsBadRequest() + { + var result = await _controller.Put(null!); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsBadRequest2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Put(new Hl7ApplicationConfigEntity()); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsInternalServerError() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Put(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + + #region POST Tests + + [Theory] + [InlineData("(0001,0001)")] + [InlineData("0001,0001")] + [InlineData("(FFFE,E0DD)")] + [InlineData("FFFE,E0DD")] + public async Task Post_GiveExpectedInput_ReturnsOK(string dicomStr) + { + var validApplicationEntity = ValidApplicationEntity(dicomStr); + + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Post(validApplicationEntity); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Theory] + [InlineData("(001,0001)")] + [InlineData("(0001,00x1")] + [InlineData("x001,0001)")] + [InlineData("00001,00001)")] + public async Task Post_GivenInvalidDicomValueInput_ReturnsBadRequest(string dicomStr) + { + //valid Hl7ApplicationEntity + var validApplicationEntity = new Hl7ApplicationConfigEntity() + { + Id = Guid.Empty, + DataLink = KeyValuePair.Create("testKey", DataLinkType.PatientId), + DataMapping = new() { KeyValuePair.Create("datamapkey", dicomStr) }, + SendingId = KeyValuePair.Create("sendingidkey", "sendingidvalue"), + DateTimeCreated = DateTime.UtcNow + }; + + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Post(validApplicationEntity); + + var objResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsBadRequest() + { + var result = await _controller.Post(null!); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsBadRequest2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Post(new Hl7ApplicationConfigEntity()); + + var objectResult = Assert.IsType(result); + + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError3() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError2() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .Throws(new Exception()); + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + } +} diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index d9bcbd3d0..0ac894aaf 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -8,6 +8,15 @@ "resolved": "6.0.0", "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.11.0, )", + "resolved": "6.11.0", + "contentHash": "aBaagwdNtVKkug1F3imGXUlmoBd8ZUZX8oQ5niThaJhF79SpESe1Gzq7OFuZkQdKD5Pa4Mone+jrbas873AT4g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, "Microsoft.AspNetCore.Mvc.WebApiCompatShim": { "type": "Direct", "requested": "[2.2.0, )", @@ -1234,6 +1243,14 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, "System.Console": { "type": "Transitive", "resolved": "4.3.0", @@ -1819,6 +1836,11 @@ "System.Threading.Tasks": "4.3.0" } }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, "System.Security.Cryptography.X509Certificates": { "type": "Transitive", "resolved": "4.3.0", From 1e4b5a9a07ecb9edf2100f1e90cd10b0a59c6551 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 20 Nov 2023 16:51:52 +0000 Subject: [PATCH 35/75] new queue and new scp listenern Signed-off-by: Neil South --- doc/dependency_decisions.yml | 10 +- docker-compose/configs/orthanc.json | 16 +- docker-compose/docker-compose.yml | 2 +- src/Api/Hl7ApplicationConfigEntity.cs | 143 +++++ src/Api/{ => Models}/BaseApplicationEntity.cs | 3 +- .../DestinationApplicationEntity.cs | 2 +- src/Api/{ => Models}/DicomAssociationInfo.cs | 3 +- .../{ => Models}/ExportRequestDataMessage.cs | 7 +- src/Api/Models/ExternalAppDetails.cs | 39 ++ .../{ => Models}/MonaiApplicationEntity.cs | 3 +- ...Monai.Deploy.InformaticsGateway.Api.csproj | 5 +- src/Api/PlugIns/IOutputDataPlugin.cs | 1 + src/Api/PlugIns/IOutputDataPluginEngine.cs | 1 + src/Api/SourceApplicationEntity.cs | 2 + src/Api/Storage/DicomFileStorageMetadata.cs | 48 +- src/Api/Storage/FileStorageMetadata.cs | 5 +- src/Api/{ => Storage}/MongoDBEntityBase.cs | 2 +- src/Api/Storage/Payload.cs | 26 +- src/Api/Storage/StorageObjectMetadata.cs | 9 +- src/Api/Test/BaseApplicationEntityTest.cs | 5 +- .../Test/DestinationApplicationEntityTest.cs | 5 +- .../Test/Hl7ApplicationConfigEntityTest.cs | 190 ++++++ src/Api/Test/MonaiApplicationEntityTest.cs | 5 +- .../Storage/DicomFileStorageMetadataTest.cs | 37 +- src/Api/Test/packages.lock.json | 40 +- src/Api/VirtualApplicationEntity.cs | 1 + src/Api/packages.lock.json | 40 +- src/CLI/Commands/AetCommand.cs | 2 +- src/CLI/Commands/DestinationCommand.cs | 2 +- .../Services/ConfigurationOptionAccessor.cs | 20 + src/CLI/Test/AetCommandTest.cs | 2 +- src/CLI/Test/DestinationCommandTest.cs | 2 +- src/CLI/Test/packages.lock.json | 44 +- src/CLI/packages.lock.json | 42 +- src/Client.Common/Test/packages.lock.json | 0 src/Client.Common/packages.lock.json | 0 src/Client/IInformaticsGatewayClient.cs | 1 + src/Client/InformaticsGatewayClient.cs | 1 + src/Client/Services/AeTitle{T}Service.cs | 2 +- src/Client/Test/AeTitleServiceTest.cs | 1 + src/Client/Test/packages.lock.json | 15 +- src/Client/packages.lock.json | 40 +- src/Common/Test/packages.lock.json | 0 src/Common/packages.lock.json | 0 .../MessageBrokerConfigurationKeys.cs | 23 +- src/Configuration/ScpConfiguration.cs | 6 + .../Test/ValidationExtensionsTest.cs | 1 + src/Configuration/Test/packages.lock.json | 42 +- src/Configuration/ValidationExtensions.cs | 1 + src/Configuration/packages.lock.json | 40 +- ...IDestinationApplicationEntityRepository.cs | 2 +- .../IDicomAssociationInfoRepository.cs | 2 +- .../IExternalAppDeatilsRepository.cs | 31 + .../IHl7ApplicationConfigRepository.cs | 35 ++ .../IMonaiApplicationEntityRepository.cs | 2 +- .../InferenceRequestRepositoryBase.cs | 3 +- src/Database/Api/StorageMetadataWrapper.cs | 1 - src/Database/Api/Test/packages.lock.json | 44 +- src/Database/Api/packages.lock.json | 42 +- src/Database/DatabaseManager.cs | 4 + ...stinationApplicationEntityConfiguration.cs | 2 +- .../DicomAssociationInfoConfiguration.cs | 2 +- .../ExternalAppDetailsConfiguration.cs | 44 ++ .../Hl7ApplicationConfigConfiguration.cs | 30 + .../MonaiApplicationEntityConfiguration.cs | 2 +- .../InformaticsGatewayContext.cs | 7 + .../20231120161347_202311201611.Designer.cs | 431 +++++++++++++ .../Migrations/20231120161347_202311201611.cs | 50 ++ .../InformaticsGatewayContextModelSnapshot.cs | 57 +- .../DestinationApplicationEntityRepository.cs | 2 +- .../DicomAssociationInfoRepository.cs | 2 +- .../ExternalAppDetailsRepository.cs | 110 ++++ .../Hl7ApplicationConfigRepository.cs | 99 +++ .../MonaiApplicationEntityRepository.cs | 2 +- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../DicomAssociationInfoRepositoryTest.cs | 2 +- .../Test/ExternalAppDetailsRepositoryTest.cs | 116 ++++ .../Test/InMemoryDatabaseFixture.cs | 1 + .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../Test/SqliteDatabaseFixture.cs | 12 + .../EntityFramework/Test/packages.lock.json | 34 +- .../EntityFramework/packages.lock.json | 34 +- ...stinationApplicationEntityConfiguration.cs | 2 +- .../DicomAssociationInfoConfiguration.cs | 2 +- .../ExternalAppDetailsConfiguration.cs | 33 + .../MonaiApplicationEntityConfiguration.cs | 2 +- .../MongoDBEntityBaseConfiguration.cs | 2 +- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../DicomAssociationInfoRepositoryTest.cs | 2 +- .../ExternalAppDetailsRepositoryTest.cs | 136 ++++ .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../Integration.Test/MongoDatabaseFixture.cs | 12 + .../Integration.Test/packages.lock.json | 34 +- .../MongoDB/MongoDatabaseMigrationManager.cs | 1 + .../DestinationApplicationEntityRepository.cs | 2 +- .../DicomAssociationInfoRepository.cs | 2 +- .../ExternalAppDetailsRepository.cs | 139 ++++ .../Hl7ApplicationConfigRepository.cs | 149 +++++ .../MonaiApplicationEntityRepository.cs | 2 +- src/Database/MongoDB/packages.lock.json | 34 +- src/Database/packages.lock.json | 30 +- src/DicomWebClient/CLI/packages.lock.json | 0 src/DicomWebClient/Test/packages.lock.json | 0 src/DicomWebClient/packages.lock.json | 0 .../Common/DestinationNotSuppliedException.cs | 43 ++ .../Logging/Log.100.200.ScpService.cs | 9 +- .../Logging/Log.3000.PayloadAssembler.cs | 4 +- .../Logging/Log.4000.ObjectUploadService.cs | 4 +- .../Logging/Log.500.ExportService.cs | 3 + .../Logging/Log.5000.DataPlugins.cs | 3 + .../Logging/Log.700.PayloadService.cs | 15 + .../Logging/Log.8000.HttpServices.cs | 7 + .../Monai.Deploy.InformaticsGateway.csproj | 2 +- src/InformaticsGateway/Program.cs | 36 +- .../Properties/launchSettings.json | 5 +- .../Services/Common/OutputDataPluginEngine.cs | 2 +- .../Services/Common/ScpInputTypeEnum.cs | 24 + .../Connectors/DataRetrievalService.cs | 5 +- .../Services/Connectors/PayloadAssembler.cs | 10 +- .../PayloadNotificationActionHandler.cs | 53 +- .../Connectors/PayloadNotificationService.cs | 5 + .../Services/DicomWeb/ContentTypes.cs | 1 + .../Services/Export/DicomWebExportService.cs | 43 +- .../Export/ExportRequestEventDetails.cs | 20 +- .../Services/Export/ExportServiceBase.cs | 405 ++++++++---- .../Services/Export/ExtAppScuExportService.cs | 168 +++++ .../Services/Export/ExternalAppExeception.cs | 40 ++ .../Services/Export/ScuExportService.cs | 191 +----- .../Http/DestinationAeTitleController.cs | 1 + .../Http/DicomAssociationInfoController.cs | 2 +- .../Services/Http/HealthController.cs | 0 .../Http/Hl7ApplicationConfigController.cs | 172 +++++ .../Services/Http/MonaiAeTitleController.cs | 1 + .../Services/Http/Startup.cs | 22 + .../Services/Scp/ApplicationEntityHandler.cs | 72 ++- .../Services/Scp/ApplicationEntityManager.cs | 11 +- .../Services/Scp/ExternalAppScpService.cs | 94 +++ .../Scp/ExternalAppScpServiceInternal.cs | 71 +++ .../Services/Scp/IApplicationEntityHandler.cs | 5 +- .../Services/Scp/IApplicationEntityManager.cs | 3 +- .../Scp/IMonaiAeChangedNotificationService.cs | 2 +- .../Services/Scp/ScpService.cs | 86 +-- .../Services/Scp/ScpServiceBase.cs | 131 ++++ .../Services/Scp/ScpServiceInternal.cs | 181 +----- .../Services/Scp/ScpServiceInternalBase.cs | 207 ++++++ .../Services/Scu/ScuService.cs | 1 - .../Services/Storage/ObjectUploadService.cs | 4 +- ...onai.Deploy.InformaticsGateway.Test.csproj | 1 + .../Test/Plug-ins/TestInputDataPlugIns.cs | 2 + .../Test/Plug-ins/TestOutputDataPlugIns.cs | 2 +- .../Repositories/MonaiServiceLocatorTest.cs | 6 +- .../Common/OutputDataPluginEngineTest.cs | 2 +- .../PayloadNotificationActionHandlerTest.cs | 57 ++ .../Export/DicomWebExportServiceTest.cs | 2 +- .../Services/Export/ExportServiceBaseTest.cs | 56 +- .../Services/Export/ExtAppScuServiceTest.cs | 595 ++++++++++++++++++ .../Services/Export/ScuExportServiceTest.cs | 6 +- .../Http/DestinationAeTitleControllerTest.cs | 2 +- .../DicomAssociationInfoControllerTest.cs | 2 +- .../Hl7ApplicationConfigControllerTest.cs | 322 ++++++++++ .../Http/MonaiAeTitleControllerTest.cs | 3 +- .../Scp/ApplicationEntityHandlerTest.cs | 40 +- .../Scp/ApplicationEntityManagerTest.cs | 11 +- .../MonaiAeChangedNotificationServiceTest.cs | 2 +- .../Test/Services/Scp/ScpServiceTest.cs | 67 +- src/InformaticsGateway/Test/appsettings.json | 2 +- .../Test/packages.lock.json | 37 +- .../appsettings.Development.json | 5 +- src/InformaticsGateway/appsettings.Test.json | 2 +- src/InformaticsGateway/appsettings.json | 5 +- src/InformaticsGateway/packages.lock.json | 15 +- .../RemoteAppExecution/DicomDeidentifier.cs | 8 +- .../RemoteAppExecution/DicomReidentifier.cs | 1 + .../RemoteAppExecution/RemoteAppExecution.cs | 4 +- .../Test/DicomDeidentifierTest.cs | 3 +- .../Test/packages.lock.json | 30 +- .../RemoteAppExecution/packages.lock.json | 30 +- .../Integration.Test/Common/MinioDataSink.cs | 0 .../Common/RabbitConnectionFactory.cs | 4 + .../Drivers/DicomInstanceGenerator.cs | 10 +- .../Drivers/MongoDBDataProvider.cs | 1 + .../Features/DicomDimseScp.feature | 17 +- .../Features/DicomWebStow.feature | 8 +- .../Features/ExternalApp.feature | 27 + .../Features/RemoteAppExecutionPlugIn.feature | 5 +- tests/Integration.Test/Hooks/TestHooks.cs | 10 + ...InformaticsGateway.Integration.Test.csproj | 2 +- .../DicomDimseScpServicesStepDefinitions.cs | 60 +- .../DicomWebStowServiceStepDefinitions.cs | 14 +- .../ExportServicesStepDefinitions.cs | 2 +- .../ExteralAppStepDefinitions.cs | 258 ++++++++ .../StepDefinitions/FhirDefinitions.cs | 4 +- ...emoteAppExecutionPlugInsStepDefinitions.cs | 28 +- tests/Integration.Test/appsettings.json | 1 + tests/Integration.Test/packages.lock.json | 142 +---- 195 files changed, 5832 insertions(+), 979 deletions(-) mode change 100644 => 100755 doc/dependency_decisions.yml mode change 100644 => 100755 docker-compose/configs/orthanc.json mode change 100644 => 100755 docker-compose/docker-compose.yml create mode 100755 src/Api/Hl7ApplicationConfigEntity.cs rename src/Api/{ => Models}/BaseApplicationEntity.cs (96%) mode change 100644 => 100755 rename src/Api/{ => Models}/DestinationApplicationEntity.cs (95%) mode change 100644 => 100755 rename src/Api/{ => Models}/DicomAssociationInfo.cs (94%) mode change 100644 => 100755 rename src/Api/{ => Models}/ExportRequestDataMessage.cs (94%) create mode 100755 src/Api/Models/ExternalAppDetails.cs rename src/Api/{ => Models}/MonaiApplicationEntity.cs (98%) mode change 100644 => 100755 mode change 100644 => 100755 src/Api/Monai.Deploy.InformaticsGateway.Api.csproj mode change 100644 => 100755 src/Api/PlugIns/IOutputDataPlugin.cs mode change 100644 => 100755 src/Api/PlugIns/IOutputDataPluginEngine.cs mode change 100644 => 100755 src/Api/Storage/DicomFileStorageMetadata.cs mode change 100644 => 100755 src/Api/Storage/FileStorageMetadata.cs rename src/Api/{ => Storage}/MongoDBEntityBase.cs (95%) mode change 100644 => 100755 mode change 100644 => 100755 src/Api/Storage/Payload.cs mode change 100644 => 100755 src/Api/Test/BaseApplicationEntityTest.cs mode change 100644 => 100755 src/Api/Test/DestinationApplicationEntityTest.cs create mode 100644 src/Api/Test/Hl7ApplicationConfigEntityTest.cs mode change 100644 => 100755 src/Api/Test/MonaiApplicationEntityTest.cs mode change 100644 => 100755 src/Api/Test/Storage/DicomFileStorageMetadataTest.cs mode change 100644 => 100755 src/Api/Test/packages.lock.json mode change 100644 => 100755 src/Api/VirtualApplicationEntity.cs mode change 100644 => 100755 src/Api/packages.lock.json mode change 100644 => 100755 src/CLI/Commands/AetCommand.cs mode change 100644 => 100755 src/CLI/Commands/DestinationCommand.cs mode change 100644 => 100755 src/CLI/Services/ConfigurationOptionAccessor.cs mode change 100644 => 100755 src/CLI/Test/AetCommandTest.cs mode change 100644 => 100755 src/CLI/Test/DestinationCommandTest.cs mode change 100644 => 100755 src/CLI/Test/packages.lock.json mode change 100644 => 100755 src/CLI/packages.lock.json mode change 100644 => 100755 src/Client.Common/Test/packages.lock.json mode change 100644 => 100755 src/Client.Common/packages.lock.json mode change 100644 => 100755 src/Client/IInformaticsGatewayClient.cs mode change 100644 => 100755 src/Client/InformaticsGatewayClient.cs mode change 100644 => 100755 src/Client/Services/AeTitle{T}Service.cs mode change 100644 => 100755 src/Client/Test/AeTitleServiceTest.cs mode change 100644 => 100755 src/Client/packages.lock.json mode change 100644 => 100755 src/Common/Test/packages.lock.json mode change 100644 => 100755 src/Common/packages.lock.json mode change 100644 => 100755 src/Configuration/MessageBrokerConfigurationKeys.cs mode change 100644 => 100755 src/Configuration/ScpConfiguration.cs mode change 100644 => 100755 src/Configuration/Test/ValidationExtensionsTest.cs mode change 100644 => 100755 src/Configuration/Test/packages.lock.json mode change 100644 => 100755 src/Configuration/packages.lock.json mode change 100644 => 100755 src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs create mode 100755 src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs create mode 100644 src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs mode change 100644 => 100755 src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/Api/Test/packages.lock.json mode change 100644 => 100755 src/Database/Api/packages.lock.json mode change 100644 => 100755 src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs create mode 100755 src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs create mode 100644 src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs mode change 100644 => 100755 src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs create mode 100755 src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs mode change 100644 => 100755 src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs create mode 100755 src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs create mode 100644 src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs create mode 100755 src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/packages.lock.json mode change 100644 => 100755 src/Database/EntityFramework/packages.lock.json mode change 100644 => 100755 src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs create mode 100755 src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs create mode 100755 src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/packages.lock.json mode change 100644 => 100755 src/Database/MongoDB/MongoDatabaseMigrationManager.cs create mode 100755 src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs create mode 100644 src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs mode change 100644 => 100755 src/Database/MongoDB/packages.lock.json mode change 100644 => 100755 src/Database/packages.lock.json mode change 100644 => 100755 src/DicomWebClient/CLI/packages.lock.json mode change 100644 => 100755 src/DicomWebClient/Test/packages.lock.json mode change 100644 => 100755 src/DicomWebClient/packages.lock.json create mode 100755 src/InformaticsGateway/Common/DestinationNotSuppliedException.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.500.ExportService.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.700.PayloadService.cs create mode 100755 src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs create mode 100755 src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs create mode 100755 src/InformaticsGateway/Services/Export/ExternalAppExeception.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/HealthController.cs create mode 100644 src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/Startup.cs create mode 100755 src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs create mode 100755 src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/ScpService.cs create mode 100755 src/InformaticsGateway/Services/Scp/ScpServiceBase.cs create mode 100755 src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Storage/ObjectUploadService.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs create mode 100755 src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs create mode 100644 src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/appsettings.json mode change 100644 => 100755 src/InformaticsGateway/appsettings.Development.json mode change 100644 => 100755 src/InformaticsGateway/appsettings.Test.json mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs mode change 100644 => 100755 tests/Integration.Test/Common/MinioDataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/RabbitConnectionFactory.cs mode change 100644 => 100755 tests/Integration.Test/Drivers/DicomInstanceGenerator.cs mode change 100644 => 100755 tests/Integration.Test/Drivers/MongoDBDataProvider.cs mode change 100644 => 100755 tests/Integration.Test/Features/DicomDimseScp.feature mode change 100644 => 100755 tests/Integration.Test/Features/DicomWebStow.feature create mode 100755 tests/Integration.Test/Features/ExternalApp.feature mode change 100644 => 100755 tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs create mode 100755 tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/FhirDefinitions.cs diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml old mode 100644 new mode 100755 index c44f250f2..76a3d3473 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -774,15 +774,17 @@ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.1 - :when: 2022-08-16 23:06:21.051573547 Z + - 1.0.5-rc0006 + - 1.0.5 + :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Messaging.RabbitMQ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.1 - :when: 2022-08-16 23:06:21.511789690 Z + - 1.0.5-rc0006 + - 1.0.5 + :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Storage - :who: mocsharp diff --git a/docker-compose/configs/orthanc.json b/docker-compose/configs/orthanc.json old mode 100644 new mode 100755 index 7023954b0..ef34c7020 --- a/docker-compose/configs/orthanc.json +++ b/docker-compose/configs/orthanc.json @@ -191,7 +191,21 @@ "STORESCP", "127.0.0.1", 104 + ], + "mig-local-1104": [ + "STORESCP", + "host.docker.internal", + 1104 + ], + + "mig-local-1104StartMWMExtApp": [ + "StartMWMExtApp", + "host.docker.internal", + 1104 ] + + + /** * By default, the Orthanc SCP accepts all DICOM commands (C-ECHO, * C-STORE, C-FIND, C-MOVE) issued by the registered remote SCU @@ -512,4 +526,4 @@ "StowMaxSize": 10, // For STOW-RS client, the maximum size of the body in one single HTTP query (in MB, 0 = no limit) "QidoCaseSensitive": true // For QIDO-RS server, whether search is case sensitive (since release 0.5) } -} \ No newline at end of file +} diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml old mode 100644 new mode 100755 index b20931435..fda72734a --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -35,7 +35,7 @@ services: - monaideploy minio: - image: "minio/minio:latest" + image: "minio/minio:RELEASE.2023-10-16T04-13-43Z" command: server --console-address ":9001" /data hostname: minio volumes: diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs new file mode 100755 index 000000000..e621e9def --- /dev/null +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -0,0 +1,143 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Common; +using Newtonsoft.Json; + +namespace Monai.Deploy.InformaticsGateway.Api +{ + public class Hl7ApplicationConfigEntity : MongoDBEntityBase + { + /// + /// Gets or sets the sending identifier. + /// + [JsonProperty("sending_identifier")] + public StringKeyValuePair SendingId { get; set; } = new(); + + /// + /// Gets or sets the data link. + /// Value is either PatientId or StudyInstanceUid + /// + [JsonProperty("data_link")] + public DataKeyValuePair DataLink { get; set; } = new(); + + /// + /// Gets or sets the data mapping. + /// Value is a DICOM Tag + /// + [JsonProperty("data_mapping")] + public List DataMapping { get; set; } = new(); + + public IEnumerable Validate() + { + var errors = new List(); + if (string.IsNullOrWhiteSpace(SendingId.Key)) + errors.Add($"{nameof(SendingId.Key)} is missing."); + if (string.IsNullOrWhiteSpace(SendingId.Value)) + errors.Add($"{nameof(SendingId.Value)} is missing."); + + if (string.IsNullOrWhiteSpace(DataLink.Key)) + errors.Add($"{nameof(DataLink.Key)} is missing."); + + if (DataMapping.IsNullOrEmpty()) + errors.Add($"{nameof(DataMapping)} is missing values."); + + ValidateDataMapping(errors); + + return errors; + } + + private void ValidateDataMapping(List errors) + { + for (var idx = 0; idx < DataMapping.Count; idx++) + { + var dataMapKvp = DataMapping[idx]; + + if (string.IsNullOrWhiteSpace(dataMapKvp.Key) || dataMapKvp.Value.Length < 8) + { + if (string.IsNullOrWhiteSpace(dataMapKvp.Key)) + errors.Add($"{nameof(DataMapping)} is missing a name at index {idx}."); + + if (string.IsNullOrWhiteSpace(dataMapKvp.Value) || dataMapKvp.Value.Length < 8) + errors.Add($"{nameof(DataMapping)} ({dataMapKvp.Key}) @ index {idx} is not a valid DICOM Tag."); + + continue; + } + + try + { + DicomTag.Parse(dataMapKvp.Value); + } + catch (Exception e) + { + errors.Add($"DataMapping.Value is not a valid DICOM Tag. {e.Message}"); + } + } + } + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } + } + + //string key, string value + public class StringKeyValuePair : IKeyValuePair + { + [Key] + public string Key { get; set; } = string.Empty; + public string Value { get; set; } = string.Empty; + + public static implicit operator StringKeyValuePair(KeyValuePair kvp) + { + return new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }; + } + + public static List FromDictionary(Dictionary dictionary) => + dictionary.Select(kvp => new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }).ToList(); + + } + + public class DataKeyValuePair : IKeyValuePair + { + [Key] + public string Key { get; set; } = string.Empty; + public DataLinkType Value { get; set; } + + public static implicit operator DataKeyValuePair(KeyValuePair kvp) + { + return new DataKeyValuePair { Key = kvp.Key, Value = kvp.Value }; + } + } + + public interface IKeyValuePair + { + public TKey Key { get; set; } + public TValue Value { get; set; } + } + + public enum DataLinkType + { + PatientId, + StudyInstanceUid + } +} diff --git a/src/Api/BaseApplicationEntity.cs b/src/Api/Models/BaseApplicationEntity.cs old mode 100644 new mode 100755 similarity index 96% rename from src/Api/BaseApplicationEntity.cs rename to src/Api/Models/BaseApplicationEntity.cs index ba0199ee6..0de7a3e39 --- a/src/Api/BaseApplicationEntity.cs +++ b/src/Api/Models/BaseApplicationEntity.cs @@ -17,8 +17,9 @@ using System; using System.Security.Claims; +using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// DICOM Application Entity or AE. diff --git a/src/Api/DestinationApplicationEntity.cs b/src/Api/Models/DestinationApplicationEntity.cs old mode 100644 new mode 100755 similarity index 95% rename from src/Api/DestinationApplicationEntity.cs rename to src/Api/Models/DestinationApplicationEntity.cs index 6599591fa..4a7069edd --- a/src/Api/DestinationApplicationEntity.cs +++ b/src/Api/Models/DestinationApplicationEntity.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// Destination Application Entity diff --git a/src/Api/DicomAssociationInfo.cs b/src/Api/Models/DicomAssociationInfo.cs old mode 100644 new mode 100755 similarity index 94% rename from src/Api/DicomAssociationInfo.cs rename to src/Api/Models/DicomAssociationInfo.cs index d3a3eb775..e4f119ca6 --- a/src/Api/DicomAssociationInfo.cs +++ b/src/Api/Models/DicomAssociationInfo.cs @@ -16,8 +16,9 @@ using System; using System.Collections.Generic; +using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { public class DicomAssociationInfo : MongoDBEntityBase { diff --git a/src/Api/ExportRequestDataMessage.cs b/src/Api/Models/ExportRequestDataMessage.cs similarity index 94% rename from src/Api/ExportRequestDataMessage.cs rename to src/Api/Models/ExportRequestDataMessage.cs index e7dfec0fe..9fd79d578 100755 --- a/src/Api/ExportRequestDataMessage.cs +++ b/src/Api/Models/ExportRequestDataMessage.cs @@ -20,7 +20,7 @@ using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.Messaging.Events; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { public class ExportRequestDataMessage { @@ -58,6 +58,11 @@ public string CorrelationId get { return _exportRequest.CorrelationId; } } + public string? FilePayloadId + { + get { return _exportRequest.PayloadId; } + } + public string[] Destinations { get { return _exportRequest.Destinations; } diff --git a/src/Api/Models/ExternalAppDetails.cs b/src/Api/Models/ExternalAppDetails.cs new file mode 100755 index 000000000..6353bc648 --- /dev/null +++ b/src/Api/Models/ExternalAppDetails.cs @@ -0,0 +1,39 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.Models +{ + public class ExternalAppDetails : MongoDBEntityBase + { + public string StudyInstanceUid { get; set; } = string.Empty; + + public string StudyInstanceUidOutBound { get; set; } = string.Empty; + + public string WorkflowInstanceId { get; set; } = string.Empty; + + public string ExportTaskID { get; set; } = string.Empty; + + public string CorrelationId { get; set; } = string.Empty; + + public string? DestinationFolder { get; set; } + + public string PatientId { get; set; } = string.Empty; + + public string PatientIdOutBound { get; set; } = string.Empty; + } +} diff --git a/src/Api/MonaiApplicationEntity.cs b/src/Api/Models/MonaiApplicationEntity.cs old mode 100644 new mode 100755 similarity index 98% rename from src/Api/MonaiApplicationEntity.cs rename to src/Api/Models/MonaiApplicationEntity.cs index 9e2929147..8ec95e37d --- a/src/Api/MonaiApplicationEntity.cs +++ b/src/Api/Models/MonaiApplicationEntity.cs @@ -21,8 +21,9 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Security.Claims; using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// MONAI Application Entity diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj old mode 100644 new mode 100755 index 05397b6d1..6ede317d0 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -33,7 +33,7 @@ - + @@ -55,7 +55,8 @@ - + + diff --git a/src/Api/PlugIns/IOutputDataPlugin.cs b/src/Api/PlugIns/IOutputDataPlugin.cs old mode 100644 new mode 100755 index 47d36da12..8bd695108 --- a/src/Api/PlugIns/IOutputDataPlugin.cs +++ b/src/Api/PlugIns/IOutputDataPlugin.cs @@ -16,6 +16,7 @@ using System.Threading.Tasks; using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Api.PlugIns { diff --git a/src/Api/PlugIns/IOutputDataPluginEngine.cs b/src/Api/PlugIns/IOutputDataPluginEngine.cs old mode 100644 new mode 100755 index 07e62ccd0..080717a3d --- a/src/Api/PlugIns/IOutputDataPluginEngine.cs +++ b/src/Api/PlugIns/IOutputDataPluginEngine.cs @@ -16,6 +16,7 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Api.PlugIns { diff --git a/src/Api/SourceApplicationEntity.cs b/src/Api/SourceApplicationEntity.cs index 604bf2eae..b46a61b8c 100755 --- a/src/Api/SourceApplicationEntity.cs +++ b/src/Api/SourceApplicationEntity.cs @@ -15,6 +15,8 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; + namespace Monai.Deploy.InformaticsGateway.Api { /// diff --git a/src/Api/Storage/DicomFileStorageMetadata.cs b/src/Api/Storage/DicomFileStorageMetadata.cs old mode 100644 new mode 100755 index c6b0f4b39..9a01fda52 --- a/src/Api/Storage/DicomFileStorageMetadata.cs +++ b/src/Api/Storage/DicomFileStorageMetadata.cs @@ -36,7 +36,7 @@ public sealed record DicomFileStorageMetadata : FileStorageMetadata /// Gets or set the Study Instance UID of the DICOM instance. /// [JsonPropertyName("studyInstanceUid")] - public string StudyInstanceUid { get; init; } = default!; + public string StudyInstanceUid { get; set; } = default!; /// /// Gets or set the Series Instance UID of the DICOM instance. @@ -93,6 +93,15 @@ public DicomFileStorageMetadata(string associationId, string identifier, string StudyInstanceUid = studyInstanceUid; SeriesInstanceUid = seriesInstanceUid; SopInstanceUid = sopInstanceUid; + SetupFilePaths(associationId); + + DataOrigin.DataService = dataService; + DataOrigin.Source = callingAeTitle; + DataOrigin.Destination = calledAeTitle; + } + + private void SetupFilePaths(string associationId) + { File = new StorageObjectMetadata(FileExtension) { TemporaryPath = string.Join(PathSeparator, associationId, DataTypeDirectoryName, $"{Guid.NewGuid()}{FileExtension}"), @@ -106,16 +115,45 @@ public DicomFileStorageMetadata(string associationId, string identifier, string UploadPath = $"{File.UploadPath}{DicomJsonFileExtension}", ContentType = DicomJsonContentType, }; + } - DataOrigin.DataService = dataService; - DataOrigin.Source = callingAeTitle; - DataOrigin.Destination = calledAeTitle; + public void SetupGivenFilePaths(string? DestinationFolder) + { + if (DestinationFolder is null) + { + return; + } + + if (DestinationFolder.EndsWith('/')) + { + DestinationFolder = DestinationFolder.Remove(DestinationFolder.Length - 1); + } + + File = new StorageObjectMetadata(FileExtension) + { + TemporaryPath = string.Join(PathSeparator, DestinationFolder, $"Temp{PathSeparator}{Guid.NewGuid()}{FileExtension}"), + UploadPath = string.Join(PathSeparator, DestinationFolder, $"{SopInstanceUid}{FileExtension}"), + ContentType = DicomContentType, + DestinationFolderOverride = true, + }; + + JsonFile = new StorageObjectMetadata(DicomJsonFileExtension) + { + TemporaryPath = $"{File.TemporaryPath}{DicomJsonFileExtension}", + UploadPath = $"{File.UploadPath}{DicomJsonFileExtension}", + ContentType = DicomJsonContentType, + DestinationFolderOverride = true, + }; + + //DestinationFolderNeil = DestinationFolder; } + public void SetStudyInstanceUid(string newStudyInstanceUid) => StudyInstanceUid = newStudyInstanceUid; + public override void SetFailed() { base.SetFailed(); JsonFile.SetFailed(); } } -} \ No newline at end of file +} diff --git a/src/Api/Storage/FileStorageMetadata.cs b/src/Api/Storage/FileStorageMetadata.cs old mode 100644 new mode 100755 index 302612d07..62a530f1d --- a/src/Api/Storage/FileStorageMetadata.cs +++ b/src/Api/Storage/FileStorageMetadata.cs @@ -104,6 +104,9 @@ public abstract record FileStorageMetadata [JsonPropertyName("payloadId")] public string? PayloadId { get; set; } + // [JsonPropertyName("destinationFolder")] + //public string? DestinationFolderNeil { get; set; } + /// /// DO NOT USE /// This constructor is intended for JSON serializer. @@ -162,4 +165,4 @@ public static string IpAddress() return "127.0.0.1"; } } -} \ No newline at end of file +} diff --git a/src/Api/MongoDBEntityBase.cs b/src/Api/Storage/MongoDBEntityBase.cs old mode 100644 new mode 100755 similarity index 95% rename from src/Api/MongoDBEntityBase.cs rename to src/Api/Storage/MongoDBEntityBase.cs index 41b206a6e..1d2a38443 --- a/src/Api/MongoDBEntityBase.cs +++ b/src/Api/Storage/MongoDBEntityBase.cs @@ -16,7 +16,7 @@ using System; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Storage { public abstract class MongoDBEntityBase { diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs old mode 100644 new mode 100755 index c9fbbc50b..c390625a1 --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -86,10 +86,11 @@ public TimeSpan Elapsed public int FilesFailedToUpload { get => Files.Count(p => p.IsUploadFailed); } + public string DestinationFolder { get; set; } = string.Empty; + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); - Files = new List(); DataOrigins = new HashSet(); _lastReceived = new Stopwatch(); @@ -107,6 +108,22 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str DataTrigger = dataTrigger; } + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null, string? DestinationFolder = null) : + this(key, correlationId, workflowInstanceId, taskId, dataTrigger, timeout) + { + Guard.Against.NullOrWhiteSpace(key, nameof(key)); + + if (payloadId is null) + { + PayloadId = Guid.NewGuid(); + } + else + { + PayloadId = Guid.Parse(payloadId); + } + DestinationFolder ??= string.Empty; + } + public void Add(FileStorageMetadata value) { Guard.Against.Null(value, nameof(value)); @@ -118,6 +135,11 @@ public void Add(FileStorageMetadata value) DataOrigins.Add(value.DataOrigin); } + //if (string.IsNullOrWhiteSpace(value.DestinationFolderNeil) is false) + //{ + // DestinationFolder = value.DestinationFolderNeil; + //} + _lastReceived.Reset(); _lastReceived.Start(); } @@ -158,4 +180,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/Api/Storage/StorageObjectMetadata.cs b/src/Api/Storage/StorageObjectMetadata.cs index 93badfbf1..074463f2e 100755 --- a/src/Api/Storage/StorageObjectMetadata.cs +++ b/src/Api/Storage/StorageObjectMetadata.cs @@ -88,6 +88,9 @@ public class StorageObjectMetadata [JsonPropertyName("isMoveCompleted"), JsonInclude] public bool IsMoveCompleted { get; private set; } = default!; + [JsonPropertyName("destinationFolderOverride")] + public bool DestinationFolderOverride { get; set; } = false; + public StorageObjectMetadata(string fileExtension) { Guard.Against.NullOrWhiteSpace(fileExtension, nameof(fileExtension)); @@ -111,7 +114,11 @@ public string GetPayloadPath(Guid payloadId) { Guard.Against.Null(payloadId, nameof(payloadId)); - return $"{payloadId}{FileStorageMetadata.PathSeparator}{UploadPath}"; + if (DestinationFolderOverride is false) + { + return $"{payloadId}{FileStorageMetadata.PathSeparator}{UploadPath}"; + } + return $"{UploadPath}"; } public void SetUploaded(string bucketName) diff --git a/src/Api/Test/BaseApplicationEntityTest.cs b/src/Api/Test/BaseApplicationEntityTest.cs old mode 100644 new mode 100755 index ef9b14808..6fcfd032c --- a/src/Api/Test/BaseApplicationEntityTest.cs +++ b/src/Api/Test/BaseApplicationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test @@ -21,7 +22,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class BaseApplicationEntityTest { [Fact] - public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToSetName() + public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { var entity = new BaseApplicationEntity { @@ -35,7 +36,7 @@ public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValues } [Fact] - public void GivenABaseApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotSetName() + public void GivenABaseApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { var entity = new BaseApplicationEntity { diff --git a/src/Api/Test/DestinationApplicationEntityTest.cs b/src/Api/Test/DestinationApplicationEntityTest.cs old mode 100644 new mode 100755 index 9e8287842..ec1cfe9be --- a/src/Api/Test/DestinationApplicationEntityTest.cs +++ b/src/Api/Test/DestinationApplicationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test @@ -21,7 +22,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class MonaiApplicationEntityTest { [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToBeUsed() + public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToBeUsed() { var entity = new MonaiApplicationEntity { @@ -41,7 +42,7 @@ public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValue } [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotOverwrite() + public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotOverwrite() { var entity = new MonaiApplicationEntity { diff --git a/src/Api/Test/Hl7ApplicationConfigEntityTest.cs b/src/Api/Test/Hl7ApplicationConfigEntityTest.cs new file mode 100644 index 000000000..ae1a1bc2c --- /dev/null +++ b/src/Api/Test/Hl7ApplicationConfigEntityTest.cs @@ -0,0 +1,190 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Api.Test +{ + public class Hl7ApplicationConfigEntityTest + { + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenSendingIdKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair(string.Empty, "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.SendingId.Key)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenSendingIdValueIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", string.Empty), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.SendingId.Value)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataLinkKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair(string.Empty, DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataLink.Key)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary()) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} is missing values.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { string.Empty, "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} is missing a name at index 0.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", string.Empty } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} (DataMappingKey) @ index 0 is not a valid DICOM Tag.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsNotAValidDicomTag_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains("DataMapping.Value is not a valid DICOM Tag. Error parsing DICOM tag ['DataMappingValue']", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsAValidDicomTag_ExpectValidateToReturnNoErrors() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "0020,000D" } }) + }; + + var errors = entity.Validate(); + + Assert.Empty(errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsEmpty_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} (DataMappingKey) @ index 0 is not a valid DICOM Tag.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenToStringIsCalled_ExpectToStringToReturnExpectedValue() + { + var guid = Guid.NewGuid(); + var dt = DateTime.UtcNow; + var entity = new Hl7ApplicationConfigEntity + { + Id = guid, + DateTimeCreated = dt, + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "0020,000D" } }) + }; + + var result = entity.ToString(); + + var expected = JsonConvert.SerializeObject(entity); + Assert.Equal(expected, result); + } + } +} diff --git a/src/Api/Test/MonaiApplicationEntityTest.cs b/src/Api/Test/MonaiApplicationEntityTest.cs old mode 100644 new mode 100755 index d91dd1166..1712d2690 --- a/src/Api/Test/MonaiApplicationEntityTest.cs +++ b/src/Api/Test/MonaiApplicationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test @@ -21,7 +22,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class DestinationApplicationEntityTest { [Fact] - public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToSetName() + public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { var entity = new DestinationApplicationEntity { @@ -36,7 +37,7 @@ public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExepectSetDefaul } [Fact] - public void GivenADestinationApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotSetName() + public void GivenADestinationApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { var entity = new DestinationApplicationEntity { diff --git a/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs b/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs old mode 100644 new mode 100755 index 3753ddb59..836fd75c0 --- a/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs +++ b/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs @@ -89,5 +89,40 @@ public void GivenDicomFileStorageMetadata_WhenGetPayloadPathIsCalled_APayyloadPa Assert.Equal($"{payloadId}/{metadata.File.UploadPath}", metadata.File.GetPayloadPath(payloadId)); Assert.Equal($"{payloadId}/{metadata.JsonFile.UploadPath}", metadata.JsonFile.GetPayloadPath(payloadId)); } + + + [Fact] + public void StudyInstanceUid_Set_ValidValue() + { + // Arrange + var metadata = new DicomFileStorageMetadata(); + + // Act + metadata.StudyInstanceUid = "12345"; + + // Assert + Assert.Equal("12345", metadata.StudyInstanceUid); + } + + [Fact] + public void SeriesInstanceUid_Set_ValidValue() + { + // Arrange + var metadata = new DicomFileStorageMetadata { SeriesInstanceUid = "67890" }; + + // Assert + Assert.Equal("67890", metadata.SeriesInstanceUid); + } + + [Fact] + public void SopInstanceUid_Set_ValidValue() + { + // Arrange + var metadata = new DicomFileStorageMetadata { SopInstanceUid = "ABCDE" }; + + // Assert + Assert.Equal("ABCDE", metadata.SopInstanceUid); + } + } -} \ No newline at end of file +} diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json old mode 100644 new mode 100755 index a7a444fc4..697907692 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -258,6 +258,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -339,6 +349,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -684,6 +708,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1126,8 +1155,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1251,7 +1280,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/VirtualApplicationEntity.cs b/src/Api/VirtualApplicationEntity.cs old mode 100644 new mode 100755 index 9a6545999..4fd33ffd1 --- a/src/Api/VirtualApplicationEntity.cs +++ b/src/Api/VirtualApplicationEntity.cs @@ -20,6 +20,7 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Security.Claims; using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; namespace Monai.Deploy.InformaticsGateway.Api { diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json old mode 100644 new mode 100755 index 2ab5eaf2c..06bca97d4 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -35,9 +35,9 @@ }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "requested": "[1.0.5-rc0006, )", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -45,6 +45,17 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Direct", + "requested": "[1.0.5-rc0006, )", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Direct", "requested": "[0.2.18, )", @@ -194,6 +205,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -212,6 +237,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -244,8 +274,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.common": { "type": "Project", diff --git a/src/CLI/Commands/AetCommand.cs b/src/CLI/Commands/AetCommand.cs old mode 100644 new mode 100755 index 3c2f27c04..d47094b7c --- a/src/CLI/Commands/AetCommand.cs +++ b/src/CLI/Commands/AetCommand.cs @@ -26,7 +26,7 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/CLI/Commands/DestinationCommand.cs b/src/CLI/Commands/DestinationCommand.cs old mode 100644 new mode 100755 index 0205153f8..819cd18cf --- a/src/CLI/Commands/DestinationCommand.cs +++ b/src/CLI/Commands/DestinationCommand.cs @@ -26,7 +26,7 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/CLI/Services/ConfigurationOptionAccessor.cs b/src/CLI/Services/ConfigurationOptionAccessor.cs old mode 100644 new mode 100755 index c61ae761c..a086c6ece --- a/src/CLI/Services/ConfigurationOptionAccessor.cs +++ b/src/CLI/Services/ConfigurationOptionAccessor.cs @@ -30,6 +30,11 @@ public interface IConfigurationOptionAccessor /// int DicomListeningPort { get; set; } + /// + /// Gets or sets the ExternalApp DICOM SCP listening port from appsettings.json. + /// + int ExternalAppDicomListeningPort { get; set; } + /// /// Gets or sets the HL7 listening port from appsettings.json. /// @@ -112,6 +117,21 @@ public int DicomListeningPort } } + public int ExternalAppDicomListeningPort + { + get + { + return GetValueFromJsonPath("InformaticsGateway.dicom.scp.externalAppPort"); + } + set + { + Guard.Against.OutOfRangePort(value, nameof(ExternalAppDicomListeningPort)); + var jObject = ReadConfigurationFile(); + jObject["InformaticsGateway"]["dicom"]["scp"]["externalAppPort"] = value; + SaveConfigurationFile(jObject); + } + } + public int Hl7ListeningPort { get diff --git a/src/CLI/Test/AetCommandTest.cs b/src/CLI/Test/AetCommandTest.cs old mode 100644 new mode 100755 index 473f02426..9852ccf0a --- a/src/CLI/Test/AetCommandTest.cs +++ b/src/CLI/Test/AetCommandTest.cs @@ -28,7 +28,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.SharedTest; diff --git a/src/CLI/Test/DestinationCommandTest.cs b/src/CLI/Test/DestinationCommandTest.cs old mode 100644 new mode 100755 index 4212a7e0d..0d9dd4cd0 --- a/src/CLI/Test/DestinationCommandTest.cs +++ b/src/CLI/Test/DestinationCommandTest.cs @@ -29,7 +29,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.SharedTest; diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json old mode 100644 new mode 100755 index 251afc0cd..37b49effc --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -506,6 +506,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -587,6 +597,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -959,6 +983,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1401,8 +1430,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1521,7 +1550,7 @@ "Crayon": "[2.0.69, )", "Docker.DotNet": "[3.125.15, )", "Microsoft.Extensions.Http": "[6.0.0, )", - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "System.CommandLine.Hosting": "[0.4.0-alpha.22272.1, )", @@ -1534,7 +1563,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1542,7 +1572,7 @@ "monai.deploy.informaticsgateway.client": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )" } }, diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json old mode 100644 new mode 100755 index f8d0493fc..cdce8b111 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -408,6 +408,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -433,6 +443,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -469,6 +493,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -501,8 +530,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -515,7 +544,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -523,7 +553,7 @@ "monai.deploy.informaticsgateway.client": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )" } }, diff --git a/src/Client.Common/Test/packages.lock.json b/src/Client.Common/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Client/IInformaticsGatewayClient.cs b/src/Client/IInformaticsGatewayClient.cs old mode 100644 new mode 100755 index cf9e8ef7d..c9279d474 --- a/src/Client/IInformaticsGatewayClient.cs +++ b/src/Client/IInformaticsGatewayClient.cs @@ -17,6 +17,7 @@ using System; using System.Net.Http.Headers; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client.Services; namespace Monai.Deploy.InformaticsGateway.Client diff --git a/src/Client/InformaticsGatewayClient.cs b/src/Client/InformaticsGatewayClient.cs old mode 100644 new mode 100755 index 9f48dac6c..ddb809434 --- a/src/Client/InformaticsGatewayClient.cs +++ b/src/Client/InformaticsGatewayClient.cs @@ -20,6 +20,7 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Client.Services; diff --git a/src/Client/Services/AeTitle{T}Service.cs b/src/Client/Services/AeTitle{T}Service.cs old mode 100644 new mode 100755 index 43a2e7f3d..e9df749ec --- a/src/Client/Services/AeTitle{T}Service.cs +++ b/src/Client/Services/AeTitle{T}Service.cs @@ -23,7 +23,7 @@ using System.Threading.Tasks; using Ardalis.GuardClauses; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Client.Services { diff --git a/src/Client/Test/AeTitleServiceTest.cs b/src/Client/Test/AeTitleServiceTest.cs old mode 100644 new mode 100755 index 646f03a44..df852a205 --- a/src/Client/Test/AeTitleServiceTest.cs +++ b/src/Client/Test/AeTitleServiceTest.cs @@ -24,6 +24,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Client.Services; using Moq; diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index ebc99b32c..8b97bc19b 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.5-rc0006", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1816,7 +1816,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1829,7 +1829,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json old mode 100644 new mode 100755 index d1cd8c1c0..eac0b2cfc --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -164,6 +164,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -189,6 +199,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -207,6 +231,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -239,8 +268,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -248,7 +277,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Common/Test/packages.lock.json b/src/Common/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Configuration/MessageBrokerConfigurationKeys.cs b/src/Configuration/MessageBrokerConfigurationKeys.cs old mode 100644 new mode 100755 index 897e25eb6..0ef705f77 --- a/src/Configuration/MessageBrokerConfigurationKeys.cs +++ b/src/Configuration/MessageBrokerConfigurationKeys.cs @@ -28,17 +28,32 @@ public class MessageBrokerConfigurationKeys public string WorkflowRequest { get; set; } = "md.workflow.request"; /// - /// Gets or sets the topic for publishing workflow requests. - /// Defaults to `md_workflow_request`. + /// Gets or sets the topic for publishing export complete requests. + /// Defaults to `md_export_complete`. /// [ConfigurationKeyName("exportComplete")] public string ExportComplete { get; set; } = "md.export.complete"; /// - /// Gets or sets the topic for publishing workflow requests. - /// Defaults to `md_workflow_request`. + /// Gets or sets the topic for publishing export requests. + /// Defaults to `md_export_request`. /// [ConfigurationKeyName("exportRequestPrefix")] public string ExportRequestPrefix { get; set; } = "md.export.request"; + + /// + /// Gets or sets the topic for publishing artifact recieved events. + /// Defaults to `md_workflow_artifactrecieved`. + /// + [ConfigurationKeyName("artifactrecieved")] + public string ArtifactRecieved { get; set; } = "md.workflow.artifactrecieved"; + + + /// + /// Gets or sets the topic for publishing export requests. + /// Defaults to `md_export_request`. + /// + [ConfigurationKeyName("externalAppRequest")] + public string ExternalAppRequest { get; set; } = "md.externalapp.request"; } } diff --git a/src/Configuration/ScpConfiguration.cs b/src/Configuration/ScpConfiguration.cs old mode 100644 new mode 100755 index 6b66626ee..bac9a2952 --- a/src/Configuration/ScpConfiguration.cs +++ b/src/Configuration/ScpConfiguration.cs @@ -34,6 +34,12 @@ public class ScpConfiguration [ConfigurationKeyName("port")] public int Port { get; set; } = 104; + /// + /// Gets or sets Port number to be used for SCP service. + /// + [ConfigurationKeyName("externalAppPort")] + public int ExternalAppPort { get; set; } = 105; + /// /// Gets or sets maximum number of simultaneous DICOM associations for the SCP service. /// diff --git a/src/Configuration/Test/ValidationExtensionsTest.cs b/src/Configuration/Test/ValidationExtensionsTest.cs old mode 100644 new mode 100755 index 986922e4a..9e00e5dbb --- a/src/Configuration/Test/ValidationExtensionsTest.cs +++ b/src/Configuration/Test/ValidationExtensionsTest.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using FellowOakDicom; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Configuration.Test diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json old mode 100644 new mode 100755 index f583c4d3f..6591f5152 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -266,6 +266,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -347,6 +357,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -697,6 +721,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1139,8 +1168,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1264,7 +1293,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1279,7 +1309,7 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } } diff --git a/src/Configuration/ValidationExtensions.cs b/src/Configuration/ValidationExtensions.cs index da29ce249..676852061 100755 --- a/src/Configuration/ValidationExtensions.cs +++ b/src/Configuration/ValidationExtensions.cs @@ -22,6 +22,7 @@ using Ardalis.GuardClauses; using FellowOakDicom; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Configuration { diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json old mode 100644 new mode 100755 index f8c0c969a..e7746d2d7 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -164,6 +164,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -189,6 +199,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -207,6 +231,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -239,8 +268,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -248,7 +277,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs b/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs old mode 100644 new mode 100755 index ffc58fa17..dd84793fa --- a/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs +++ b/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs @@ -15,7 +15,7 @@ */ using System.Linq.Expressions; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs old mode 100644 new mode 100755 index 2457dcb7e..796ff43bc --- a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs +++ b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs @@ -14,7 +14,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs b/src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs new file mode 100755 index 000000000..51668aefd --- /dev/null +++ b/src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs @@ -0,0 +1,31 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Models; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IExternalAppDetailsRepository + { + Task AddAsync(ExternalAppDetails details, CancellationToken cancellationToken); + + Task> GetAsync(string studyInstanceId, CancellationToken cancellationToken); + + Task GetByPatientIdOutboundAsync(string patientId, CancellationToken cancellationToken); + + Task GetByStudyIdOutboundAsync(string studyInstanceId, CancellationToken cancellationToken); + } +} diff --git a/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs b/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..b381d4da6 --- /dev/null +++ b/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IHl7ApplicationConfigRepository + { + Task> GetAllAsync(CancellationToken cancellationToken = default); + + Task GetByIdAsync(string id); + + Task DeleteAsync(string id, CancellationToken cancellationToken = default); + + Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default); + + Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs b/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs old mode 100644 new mode 100755 index 1b803385e..ccfbd6567 --- a/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs +++ b/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs @@ -15,7 +15,7 @@ */ using System.Linq.Expressions; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs index 157f703b8..8775eb688 100755 --- a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs +++ b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs @@ -17,7 +17,6 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; @@ -63,7 +62,7 @@ public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceReques { Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + using var loggerScope = _logger.BeginScope(new InformaticsGateway.Api.LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); if (status == InferenceRequestStatus.Success) { diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs index 326cce2cf..dac5fb729 100755 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -17,7 +17,6 @@ using System.Text.Json; using System.Text.Json.Serialization; using Ardalis.GuardClauses; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; namespace Monai.Deploy.InformaticsGateway.Database.Api diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json old mode 100644 new mode 100755 index 22b241ec1..84e33a6d5 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -240,6 +240,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -326,6 +336,20 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -671,6 +695,11 @@ "System.Threading": "4.3.0" } }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Net.Http": { "type": "Transitive", "resolved": "4.3.0", @@ -1113,8 +1142,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1238,7 +1267,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1253,14 +1283,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json old mode 100644 new mode 100755 index 1f2fdb0fb..6f18781ad --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -170,6 +170,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -195,6 +205,20 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", @@ -213,6 +237,11 @@ "resolved": "17.2.3", "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -245,8 +274,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -254,7 +283,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -269,7 +299,7 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } } diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index 2efe60d8d..040848b7e 100755 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -91,6 +91,8 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IPayloadRepository), typeof(EntityFramework.Repositories.PayloadRepository)); services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(EntityFramework.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(EntityFramework.Repositories.VirtualApplicationEntityRepository)); + services.AddScoped(typeof(IHl7ApplicationConfigRepository), typeof(EntityFramework.Repositories.Hl7ApplicationConfigRepository)); + services.AddSingleton(typeof(IExternalAppDetailsRepository), typeof(EntityFramework.Repositories.ExternalAppDetailsRepository)); services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); return services; @@ -106,6 +108,8 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IPayloadRepository), typeof(MongoDB.Repositories.PayloadRepository)); services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(MongoDB.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(MongoDB.Repositories.VirtualApplicationEntityRepository)); + services.AddScoped(typeof(IHl7ApplicationConfigRepository), typeof(MongoDB.Repositories.Hl7ApplicationConfigRepository)); + services.AddSingleton(typeof(IExternalAppDetailsRepository), typeof(MongoDB.Repositories.ExternalAppDetailsRepository)); services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); diff --git a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index ad0688719..33d7ff2f5 --- a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs @@ -17,7 +17,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs b/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs index 67bda9b8d..d8b2c45f5 100755 --- a/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs @@ -20,7 +20,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs b/src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs new file mode 100755 index 000000000..cfdcf8d9d --- /dev/null +++ b/src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs @@ -0,0 +1,44 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System.Text.Json.Serialization; +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api.Models; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class ExternalAppDetailsConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + var jsonSerializerSettings = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + builder.HasKey(j => j.Id); + + builder.Property(j => j.StudyInstanceUid).IsRequired(); + builder.Property(j => j.WorkflowInstanceId).IsRequired(); + builder.Property(j => j.DateTimeCreated).IsRequired(); + builder.Property(j => j.CorrelationId).IsRequired(); + builder.Property(j => j.ExportTaskID).IsRequired(); + } + } +} diff --git a/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs new file mode 100644 index 000000000..41ad63ad3 --- /dev/null +++ b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs @@ -0,0 +1,30 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class Hl7ApplicationConfigConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(j => j.Id); + } + } +} diff --git a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index 3e78d3ad9..fc9f1666c --- a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs @@ -20,7 +20,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index 52b410c39..f8b6f986f 100755 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -18,6 +18,7 @@ using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api; @@ -41,6 +42,10 @@ public InformaticsGatewayContext(DbContextOptions opt public virtual DbSet StorageMetadataWrapperEntities { get; set; } public virtual DbSet DicomAssociationHistories { get; set; } public virtual DbSet VirtualApplicationEntities { get; set; } + public virtual DbSet ExternalAppDetails { get; set; } + + public virtual DbSet Hl7ApplicationConfig { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -54,6 +59,8 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.ApplyConfiguration(new StorageMetadataWrapperEntityConfiguration()); modelBuilder.ApplyConfiguration(new DicomAssociationInfoConfiguration()); modelBuilder.ApplyConfiguration(new VirtualApplicationEntityConfiguration()); + modelBuilder.ApplyConfiguration(new ExternalAppDetailsConfiguration()); + modelBuilder.ApplyConfiguration(new Hl7ApplicationConfigConfiguration()); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) diff --git a/src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs new file mode 100755 index 000000000..cecea913d --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs @@ -0,0 +1,431 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231120161347_202311201611")] + partial class _202311201611 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs new file mode 100755 index 000000000..182e05f68 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class _202311201611 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DestinationFolder", + table: "Payloads", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.CreateTable( + name: "ExternalAppDetails", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + StudyInstanceUid = table.Column(type: "TEXT", nullable: false), + StudyInstanceUidOutBound = table.Column(type: "TEXT", nullable: false), + WorkflowInstanceId = table.Column(type: "TEXT", nullable: false), + ExportTaskID = table.Column(type: "TEXT", nullable: false), + CorrelationId = table.Column(type: "TEXT", nullable: false), + DestinationFolder = table.Column(type: "TEXT", nullable: true), + PatientId = table.Column(type: "TEXT", nullable: false), + PatientIdOutBound = table.Column(type: "TEXT", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ExternalAppDetails", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ExternalAppDetails"); + + migrationBuilder.DropColumn( + name: "DestinationFolder", + table: "Payloads"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs old mode 100644 new mode 100755 index f85fc6347..888d54c32 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -15,9 +15,9 @@ partial class InformaticsGatewayContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.21"); + modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DestinationApplicationEntity", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => { b.Property("Name") .HasColumnType("TEXT"); @@ -56,7 +56,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("DestinationApplicationEntities"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DicomAssociationInfo", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -106,7 +106,52 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("DicomAssociationHistories"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.MonaiApplicationEntity", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => { b.Property("Name") .HasColumnType("TEXT") @@ -268,6 +313,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("DateTimeCreated") .HasColumnType("TEXT"); + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + b.Property("Files") .IsRequired() .HasColumnType("TEXT"); diff --git a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs index 459631ac3..4a3f1cdc2 100755 --- a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs index b144ac2c5..2e000e947 100755 --- a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs b/src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs new file mode 100755 index 000000000..52fce4a50 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs @@ -0,0 +1,110 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Polly.Retry; +using Microsoft.Extensions.Logging; +using Polly; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class ExternalAppDetailsRepository : IExternalAppDetailsRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public ExternalAppDetailsRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(ExternalAppDetails details, CancellationToken cancellationToken = default) + { + Guard.Against.Null(details, nameof(details)); + + await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(details, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task> GetAsync(string studyInstanceId, CancellationToken cancellationToken = default) + { + return await _dataset + .Where(t => t.StudyInstanceUid == studyInstanceId).ToListAsync(cancellationToken) + .ConfigureAwait(false); + } + + public async Task GetByPatientIdOutboundAsync(string patientId, CancellationToken cancellationToken) + { + return await _dataset + .FirstOrDefaultAsync(t => t.PatientIdOutBound == patientId, cancellationToken) + .ConfigureAwait(false); + } + + public async Task GetByStudyIdOutboundAsync(string studyInstanceId, CancellationToken cancellationToken) + { + return await _dataset + .FirstOrDefaultAsync(t => t.StudyInstanceUidOutBound == studyInstanceId, cancellationToken) + .ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..7f6711ab4 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs @@ -0,0 +1,99 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class Hl7ApplicationConfigRepository : IHl7ApplicationConfigRepository + { + private readonly ILogger _logger; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + + public Hl7ApplicationConfigRepository(ILogger logger, + IOptions options, IServiceScopeFactory serviceScopeFactory) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + var scope = serviceScopeFactory.CreateScope(); + + _informaticsGatewayContext = scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public Task> GetAllAsync(CancellationToken cancellationToken = default) => + _retryPolicy.ExecuteAsync(() => _dataset.ToListAsync(cancellationToken)); + + public Task GetByIdAsync(string id) => + _retryPolicy.ExecuteAsync(() => _dataset.FirstOrDefaultAsync(x => x.Id.Equals(id))); + + public Task DeleteAsync(string id, CancellationToken cancellationToken) + { + return _retryPolicy.ExecuteAsync(async () => + { + var entity = await GetByIdAsync(id).ConfigureAwait(false); + if (entity is null) + { + throw new DatabaseException("Failed to delete entity."); + } + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }); + } + + public Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(configEntity, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }); + } + + public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(configEntity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + })!; + } + } +} diff --git a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs index f97696edf..e8001a728 100755 --- a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs index 60170d4a2..0d5d923d6 100755 --- a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -19,9 +19,9 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { diff --git a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs index 8a3d6eb7d..d0acc3330 100755 --- a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs b/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs new file mode 100755 index 000000000..77d991e3c --- /dev/null +++ b/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs @@ -0,0 +1,116 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class ExternalAppDetailsRepositoryTest + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public ExternalAppDetailsRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithExternalAppDetailsEntries(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new DatabaseOptions()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + [Fact] + public async Task GivenDestinationExternalAppInTheDatabase_WhenGetAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + + var expected = _databaseFixture.DatabaseContext.Set() + .Where(t => t.StudyInstanceUid == "1"); + var actual = await store.GetAsync("1").ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenDestinationExternalAppInTheDatabase_WhenGetAsyncCalled_ExpectEntitieToBeReturned2() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + + var expected = _databaseFixture.DatabaseContext.Set() + .Where(t => t.PatientIdOutBound == "2") + .Take(1).First(); + var actual = await store.GetByPatientIdOutboundAsync("2", new CancellationToken()).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenDestinationExternalAppInTheDatabase_WhenAddingToDatabase_ExpectItToBeSaved() + { + var association = new ExternalAppDetails + { + StudyInstanceUid = "3", + WorkflowInstanceId = "calling", + CorrelationId = Guid.NewGuid().ToString(), + DateTimeCreated = DateTime.UtcNow, + ExportTaskID = "host" + }; + + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(association).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.StudyInstanceUid.Equals(association.StudyInstanceUid)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(association.DateTimeCreated, actual!.DateTimeCreated); + Assert.Equal(association.WorkflowInstanceId, actual!.WorkflowInstanceId); + Assert.Equal(association.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(association.CorrelationId, actual!.CorrelationId); + } + } +} diff --git a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs old mode 100644 new mode 100755 index 2aea0684a..01f8d8457 --- a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs @@ -16,6 +16,7 @@ using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs index 609cfecdf..2c6a7558a 100755 --- a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs old mode 100644 new mode 100755 index 7dd549b73..79cf63780 --- a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs @@ -16,6 +16,7 @@ using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { @@ -134,6 +135,17 @@ internal void InitDatabaseWithDicomAssociationInfoEntries() DatabaseContext.SaveChanges(); } + internal void InitDatabaseWithExternalAppDetailsEntries() + { + var ea1 = new ExternalAppDetails { StudyInstanceUid = "1", PatientId = "11", PatientIdOutBound = "1" }; + var ea2 = new ExternalAppDetails { StudyInstanceUid = "2", PatientId = "22", PatientIdOutBound = "2" }; + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(ea1); + set.Add(ea2); + + DatabaseContext.SaveChanges(); + } public void Clear() where T : class { diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json old mode 100644 new mode 100755 index a123be361..1360cc775 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -401,6 +401,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -492,6 +502,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -882,8 +901,8 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, "System.Net.Http": { "type": "Transitive", @@ -1327,8 +1346,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1452,7 +1471,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json old mode 100644 new mode 100755 index 591508214..18be93807 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -324,6 +324,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -354,6 +364,15 @@ "resolved": "5.2.4", "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", "resolved": "2.1.2", @@ -412,8 +431,8 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", @@ -447,8 +466,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", @@ -456,7 +475,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index 25ceefb39..9f1c36e21 --- a/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs +++ b/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs b/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs old mode 100644 new mode 100755 index b5e63d71d..4b6b10034 --- a/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs +++ b/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs b/src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs new file mode 100755 index 000000000..7a6fea639 --- /dev/null +++ b/src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs @@ -0,0 +1,33 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Models; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class ExternalAppDetailsConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index 561b0b1f8..3f1eaca0e --- a/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs +++ b/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs b/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs old mode 100644 new mode 100755 index c7ee5ac3d..9abd8b535 --- a/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs +++ b/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Storage; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs index f4628ef67..522e19023 100755 --- a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs index 3dd049a1f..919693090 100755 --- a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs new file mode 100755 index 000000000..e2755cfce --- /dev/null +++ b/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs @@ -0,0 +1,136 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; +using MongoDB.Driver; +using Moq; + + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test +{ + [Collection("MongoDatabase")] + public class ExternalAppDetailsRepositoryTest + { + private readonly MongoDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public ExternalAppDetailsRepositoryTest(MongoDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithExternalAppEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = _databaseFixture.Options; + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.Client); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + + var expected = (await collection.FindAsync(e => e.StudyInstanceUid == "2").ConfigureAwait(false)).First(); + var actual = (await store.GetAsync("2", new CancellationToken()).ConfigureAwait(false)).FirstOrDefault(); + + actual.Should().NotBeNull(); + Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(expected.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(expected.CorrelationId, actual!.CorrelationId); + Assert.Equal(expected.WorkflowInstanceId, actual!.WorkflowInstanceId); + } + + [Fact] + public async Task GivenAExternalAppDetails_WhenAddingToDatabase_ExpectItToBeSaved() + { + var app = new ExternalAppDetails { StudyInstanceUid = "3", ExportTaskID = "ExportTaskID3", CorrelationId = "CorrelationId3", WorkflowInstanceId = "WorkflowInstanceId3" }; + + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(app, new CancellationToken()).ConfigureAwait(false); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + var actual = await collection.Find(p => p.Id == app.Id).FirstOrDefaultAsync().ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(app.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(app.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(app.CorrelationId, actual!.CorrelationId); + Assert.Equal(app.WorkflowInstanceId, actual!.WorkflowInstanceId); + + actual!.DateTimeCreated.Should().BeCloseTo(app.DateTimeCreated, TimeSpan.FromMilliseconds(500)); + } + + [Fact] + public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetPatientOutboundAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + + var expected = (await collection.FindAsync(e => e.PatientIdOutBound == "pat1out1").ConfigureAwait(false)).First(); + var actual = (await store.GetByPatientIdOutboundAsync("pat1out1", new CancellationToken()).ConfigureAwait(false)); + + actual.Should().NotBeNull(); + Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(expected.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(expected.CorrelationId, actual!.CorrelationId); + Assert.Equal(expected.WorkflowInstanceId, actual!.WorkflowInstanceId); + } + + [Fact] + public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetStudyIdOutboundAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + + var expected = (await collection.FindAsync(e => e.StudyInstanceUidOutBound == "sudIdOut2").ConfigureAwait(false)).First(); + var actual = (await store.GetByStudyIdOutboundAsync("sudIdOut2", new CancellationToken()).ConfigureAwait(false)); + + actual.Should().NotBeNull(); + Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(expected.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(expected.CorrelationId, actual!.CorrelationId); + Assert.Equal(expected.WorkflowInstanceId, actual!.WorkflowInstanceId); + } + } +} diff --git a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs index e8da9cec8..5c73132a9 100755 --- a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs index f8645bead..bafc7b581 100755 --- a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs +++ b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs @@ -16,6 +16,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.MongoDB; @@ -114,6 +115,17 @@ public void InitDatabaseWithSourceApplicationEntities() collection.InsertOne(aet4); collection.InsertOne(aet5); } + public void InitDatabaseWithExternalAppEntities() + { + var collection = Database.GetCollection(nameof(ExternalAppDetails)); + Clear(collection); + + var ea1 = new ExternalAppDetails { StudyInstanceUid = "1", ExportTaskID = "ExportTaskID", CorrelationId = "CorrelationId", WorkflowInstanceId = "WorkflowInstanceId", PatientIdOutBound = "pat1out1", StudyInstanceUidOutBound = "sudIdOut1" }; + var ea2 = new ExternalAppDetails { StudyInstanceUid = "2", ExportTaskID = "ExportTaskID2", CorrelationId = "CorrelationId2", WorkflowInstanceId = "WorkflowInstanceId2", PatientIdOutBound = "pat1out2", StudyInstanceUidOutBound = "sudIdOut2" }; + + collection.InsertOne(ea1); + collection.InsertOne(ea2); + } public void InitDatabaseWithInferenceRequests() { diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json old mode 100644 new mode 100755 index 9e54f0f84..e394689d1 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -283,6 +283,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -415,6 +425,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -1249,8 +1268,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1379,7 +1398,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1394,14 +1414,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/src/Database/MongoDB/MongoDatabaseMigrationManager.cs b/src/Database/MongoDB/MongoDatabaseMigrationManager.cs old mode 100644 new mode 100755 index f9f4f2d40..151282bad --- a/src/Database/MongoDB/MongoDatabaseMigrationManager.cs +++ b/src/Database/MongoDB/MongoDatabaseMigrationManager.cs @@ -40,6 +40,7 @@ public IHost Migrate(IHost host) StorageMetadataWrapperEntityConfiguration.Configure(); DicomAssociationInfoConfiguration.Configure(); VirtualApplicationEntityConfiguration.Configure(); + ExternalAppDetailsConfiguration.Configure(); return host; } } diff --git a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs index b00d3e7d3..85c071e24 100755 --- a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; diff --git a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs index f81a18d6f..1056bc0c1 100755 --- a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs b/src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs new file mode 100755 index 000000000..16a4a7feb --- /dev/null +++ b/src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs @@ -0,0 +1,139 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class ExternalAppDetailsRepository : IExternalAppDetailsRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public ExternalAppDetailsRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(ExternalAppDetails)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.StudyInstanceUid); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.PatientIdOutBound); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.StudyInstanceUidOutBound); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + var options = new CreateIndexOptions { ExpireAfter = TimeSpan.FromDays(7), Name = "DateTimeCreated" }; + indexDefinitionState = Builders.IndexKeys.Ascending(_ => _.DateTimeCreated); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState, options)); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + public async Task AddAsync(ExternalAppDetails details, CancellationToken cancellationToken) + { + Guard.Against.Null(details, nameof(details)); + + await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(details, cancellationToken: cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task> GetAsync(string studyInstanceId, CancellationToken cancellationToken) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return (await _collection.FindAsync(p => + p.StudyInstanceUid == studyInstanceId, null, cancellationToken + ).ConfigureAwait(false)).ToList(); + }).ConfigureAwait(false); + } + + public async Task GetByPatientIdOutboundAsync(string patientId, CancellationToken cancellationToken) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return (await _collection.FindAsync(p => + p.PatientIdOutBound == patientId, null, cancellationToken + ).ConfigureAwait(false)).FirstOrDefault(); + }).ConfigureAwait(false); + } + + public async Task GetByStudyIdOutboundAsync(string studyInstanceId, CancellationToken cancellationToken) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return (await _collection.FindAsync(p => + p.StudyInstanceUidOutBound == studyInstanceId, null, cancellationToken + ).ConfigureAwait(false)).FirstOrDefault(); + }).ConfigureAwait(false); + } + } +} diff --git a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..04cdc1df8 --- /dev/null +++ b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs @@ -0,0 +1,149 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class Hl7ApplicationConfigRepository : IHl7ApplicationConfigRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public Hl7ApplicationConfigRepository(IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(Hl7ApplicationConfigEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.DateTimeCreated); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + } + + public Task> GetAllAsync(CancellationToken cancellationToken = default) => + _retryPolicy.ExecuteAsync(() => + _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken)); + + public Task GetByIdAsync(string id) => + _retryPolicy.ExecuteAsync(() => _collection + .Find(x => x.Id.Equals(id)) + .FirstOrDefaultAsync())!; + + public Task DeleteAsync(string id, CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var entity = await GetByIdAsync(id).ConfigureAwait(false); + if (entity is null) + { + throw new DatabaseException("Failed to delete entity."); + } + + var result = await _collection + .DeleteOneAsync(Builders.Filter.Where(p => p.Id.Equals(id)), + cancellationToken: cancellationToken).ConfigureAwait(false); + + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + + return entity; + }); + } + + public Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(configEntity, cancellationToken: cancellationToken) + .ConfigureAwait(false); + return configEntity; + }); + } + + public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection + .ReplaceOneAsync(Builders.Filter.Where(p => p.Id.Equals(configEntity.Id)), + configEntity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + + return configEntity; + })!; + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs index 87cc1ace1..0f9ecdb36 100755 --- a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json old mode 100644 new mode 100755 index 943ad83ee..1cdbe1032 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -204,6 +204,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -264,6 +274,15 @@ "resolved": "5.2.4", "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -343,8 +362,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "ZstdSharp.Port": { "type": "Transitive", @@ -357,7 +376,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -372,14 +392,14 @@ "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "NLog": "[5.2.4, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json old mode 100644 new mode 100755 index e984ce0d6..0f2abebb3 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -363,6 +363,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -439,6 +449,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -556,8 +575,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "ZstdSharp.Port": { "type": "Transitive", @@ -570,7 +589,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/DicomWebClient/Test/packages.lock.json b/src/DicomWebClient/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs b/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs new file mode 100755 index 000000000..fcae49e38 --- /dev/null +++ b/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs @@ -0,0 +1,43 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2020 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Common +{ + + public class DestinationNotSuppliedException : Exception + { + public DestinationNotSuppliedException() + { + } + + public DestinationNotSuppliedException(string message) : base(message) + { + } + + public DestinationNotSuppliedException(string message, Exception innerException) : base(message, innerException) + { + } + + protected DestinationNotSuppliedException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + + } +} diff --git a/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs b/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs index df26a9cf3..d3c420f1f 100755 --- a/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs +++ b/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs @@ -62,14 +62,12 @@ public static partial class Log public static partial void FailedToUpdateAppliationEntityHandlerWithUpdatedAEChange(this ILogger logger, string aeTitle, Exception? ex = null); // SCP Service - [LoggerMessage(EventId = 200, Level = LogLevel.Information, Message = "Initializing SCP Service at port {port}...")] - public static partial void ScpServiceLoading(this ILogger logger, int port); [LoggerMessage(EventId = 201, Level = LogLevel.Critical, Message = "Failed to initialize SCP listener.")] public static partial void ScpListenerInitializationFailure(this ILogger logger); - [LoggerMessage(EventId = 202, Level = LogLevel.Information, Message = "SCP listening on port: {port}.")] - public static partial void ScpListeningOnPort(this ILogger logger, int port); + [LoggerMessage(EventId = 202, Level = LogLevel.Information, Message = "{serviceName} listening on port: {port}.")] + public static partial void ScpListeningOnPort(this ILogger logger, string serviceName, int port); [LoggerMessage(EventId = 203, Level = LogLevel.Information, Message = "C-ECHO request received.")] public static partial void CEchoReceived(this ILogger logger); @@ -106,5 +104,8 @@ public static partial class Log [LoggerMessage(EventId = 214, Level = LogLevel.Information, Message = "Connection closed. Correlation ID={correlationId}. Calling AE Title={callingAeTitle}. Called AE Title={calledAeTitle}. Duration={durationSeconds} seconds.")] public static partial void ConnectionClosed(this ILogger logger, string correlationId, string callingAeTitle, string calledAeTitle, double durationSeconds); + + [LoggerMessage(EventId = 215, Level = LogLevel.Warning, Message = "Failed to find stored external app details for studyInstance Uid {studyInstanceUid}.")] + public static partial void FailedToFindStoredExtAppDetails(this ILogger logger, string studyInstanceUid); } } diff --git a/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs b/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs index d6198ed90..e1ee29d93 100755 --- a/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs +++ b/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs @@ -27,8 +27,8 @@ public static partial class Log [LoggerMessage(EventId = 3002, Level = LogLevel.Information, Message = "[Startup] {count} pending payloads removed from database.")] public static partial void TotalNumberOfPayloadsRemoved(this ILogger logger, int count); - [LoggerMessage(EventId = 3003, Level = LogLevel.Information, Message = "File added to bucket {key}. Queue size: {count}")] - public static partial void FileAddedToBucket(this ILogger logger, string key, int count); + [LoggerMessage(EventId = 3003, Level = LogLevel.Information, Message = "File added to bucket {key}. Queue size: {count}. PayloadId {PayloadId}")] + public static partial void FileAddedToBucket(this ILogger logger, string key, int count, string PayloadId); [LoggerMessage(EventId = 3004, Level = LogLevel.Trace, Message = "Number of incomplete payloads waiting for processing: {count}.")] public static partial void BucketsActive(this ILogger logger, int count); diff --git a/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs b/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs old mode 100644 new mode 100755 index afdad8c78..8939da80e --- a/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs +++ b/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs @@ -21,8 +21,8 @@ namespace Monai.Deploy.InformaticsGateway.Logging { public static partial class Log { - [LoggerMessage(EventId = 4000, Level = LogLevel.Warning, Message = "Failed to upload file {identifier}; added back to queue for retry.")] - public static partial void FailedToUploadFile(this ILogger logger, string identifier, Exception ex); + [LoggerMessage(EventId = 4000, Level = LogLevel.Warning, Message = "Failed to upload file {identifier}; path: {path} added back to queue for retry.")] + public static partial void FailedToUploadFile(this ILogger logger, string identifier, string path, Exception ex); [LoggerMessage(EventId = 4001, Level = LogLevel.Debug, Message = "Upload statistics: {threads} threads, {seconds} seconds.")] public static partial void UploadStats(this ILogger logger, int threads, double seconds); diff --git a/src/InformaticsGateway/Logging/Log.500.ExportService.cs b/src/InformaticsGateway/Logging/Log.500.ExportService.cs old mode 100644 new mode 100755 index 5d2b826f6..1588b94eb --- a/src/InformaticsGateway/Logging/Log.500.ExportService.cs +++ b/src/InformaticsGateway/Logging/Log.500.ExportService.cs @@ -132,5 +132,8 @@ public static partial class Log [LoggerMessage(EventId = 536, Level = LogLevel.Error, Message = "Error executing data plug-ins.")] public static partial void ErrorExecutingDataPlugIns(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 537, Level = LogLevel.Error, Message = "Error executing OutputDataEngine plug-in.")] + public static partial void OutputDataEngineBlockException(this ILogger logger, Exception ex); } } diff --git a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs old mode 100644 new mode 100755 index 2e2425b63..b83aef765 --- a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs +++ b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs @@ -37,5 +37,8 @@ public static partial class Log [LoggerMessage(EventId = 5005, Level = LogLevel.Information, Message = "Executing output data plug-in: {plugin}.")] public static partial void ExecutingOutputDataPlugIn(this ILogger logger, string plugin); + + [LoggerMessage(EventId = 5006, Level = LogLevel.Debug, Message = "Adding SCP Listener {serviceName} on port {port}")] + public static partial void AddingScpListener(this ILogger logger, string serviceName, int port); } } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs old mode 100644 new mode 100755 index c09270e2f..0b926a413 --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -148,5 +148,20 @@ public static partial class Log [LoggerMessage(EventId = 747, Level = LogLevel.Error, Message = "Error posting payload to publish queue.")] public static partial void ErrorPostingJobToPublishPayloadsQueue(this ILogger logger); + + [LoggerMessage(EventId = 748, Level = LogLevel.Debug, Message = "Generating artifact recieeved request message for payload {payloadId}...")] + public static partial void GenerateArtifactReceievedRequest(this ILogger logger, Guid payloadId); + + [LoggerMessage(EventId = 749, Level = LogLevel.Information, Message = "Publishing artifact recieved request message ID={messageId}...")] + public static partial void PublishingArtifactRecievedRequest(this ILogger logger, string messageId); + + [LoggerMessage(EventId = 750, Level = LogLevel.Information, Message = "Artifact recieved published to {queue}, message ID={messageId}. Payload took {durationSeconds} seconds to complete.")] + public static partial void ArtifactRecievedPublished(this ILogger logger, string queue, string messageId, double durationSeconds); + + [LoggerMessage(EventId = 751, Level = LogLevel.Debug, Message = "Saving External App Data to repo for {studyInstanceUID}.")] + public static partial void SavingExternalAppData(this ILogger logger, string studyInstanceUID); + + [LoggerMessage(EventId = 752, Level = LogLevel.Debug, Message = "Payload in Notification handler {payloadId}.")] + public static partial void PayloadNotifyAsync(this ILogger logger, string payloadId); } } diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs index 48fcdd325..aebdb7e23 100644 --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -179,5 +179,12 @@ public static partial class Log // [LoggerMessage(EventId = 8300, Level = LogLevel.Error, Message = "Unexpected error occurred in GET /dicom-associations API..")] public static partial void DicomAssociationsControllerGetError(this ILogger logger, Exception ex); + + /// + /// HL7 Application Configuration controller + /// + [LoggerMessage(EventId = 8400, Level = LogLevel.Error, Message = "Unexpected error occurred in PUT {endpoint} API.")] + public static partial void PutHl7ApplicationConfigException(this ILogger logger, string endpoint, Exception ex); + } } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index 84c22832a..a49afc36f 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index aaf5d9d91..9eb227f55 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -132,16 +132,16 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); + //services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); + //services.AddSingleton(); var timeout = TimeSpan.FromSeconds(hostContext.Configuration.GetValue("InformaticsGateway:dicomWeb:clientTimeout", DicomWebConfiguration.DefaultClientTimeout)); services @@ -159,14 +159,16 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => .SetHandlerLifetime(timeout); #pragma warning disable CS8603 // Possible null reference return. - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(/*p => p.GetService()*/); #pragma warning restore CS8603 // Possible null reference return. }) diff --git a/src/InformaticsGateway/Properties/launchSettings.json b/src/InformaticsGateway/Properties/launchSettings.json index c9ff339fa..11e711acb 100755 --- a/src/InformaticsGateway/Properties/launchSettings.json +++ b/src/InformaticsGateway/Properties/launchSettings.json @@ -9,7 +9,10 @@ "InformaticsGateway__messaging__publisherSettings__username": "rabbitmq", "InformaticsGateway__messaging__publisherSettings__password": "rabbitmq", "InformaticsGateway__messaging__subscriberSettings__username": "rabbitmq", - "InformaticsGateway__messaging__subscriberSettings__password": "rabbitmq" + "InformaticsGateway__messaging__subscriberSettings__password": "rabbitmq", + "Kestrel__EndPoints__Http__Url": "http://+:5000", + "InformaticsGateway__dicom__scp__port": "1104", + "InformaticsGateway__dicom__scp__externalAppPort": "1105" } } } diff --git a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs index 33d72b186..2d386b053 100755 --- a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs @@ -20,7 +20,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Logging; diff --git a/src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs b/src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs new file mode 100755 index 000000000..280effdfe --- /dev/null +++ b/src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs @@ -0,0 +1,24 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Monai.Deploy.InformaticsGateway.Services.Common +{ + public enum ScpInputTypeEnum + { + WorkflowTrigger, + ExternalAppReturn + } +} diff --git a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs old mode 100644 new mode 100755 index 3bc1300fd..b558c4175 --- a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs +++ b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs @@ -29,7 +29,6 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; @@ -124,7 +123,7 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) try { request = await repository.TakeAsync(cancellationToken).ConfigureAwait(false); - using (_logger.BeginScope(new LoggingDataDictionary { { "TransactionId", request.TransactionId } })) + using (_logger.BeginScope(new Api.LoggingDataDictionary { { "TransactionId", request.TransactionId } })) { _logger.ProcessingInferenceRequest(); await ProcessRequest(request, cancellationToken).ConfigureAwait(false); @@ -589,4 +588,4 @@ public void Dispose() #endregion Data Retrieval } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index b498cd082..1222add24 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -103,9 +103,9 @@ public async Task Queue(string bucket, FileStorageMetadata file, DataOrigi using var _ = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", file.CorrelationId } }); - var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout).ConfigureAwait(false); + var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, file.PayloadId).ConfigureAwait(false); payload.Add(file); - _logger.FileAddedToBucket(payload.Key, payload.Count); + _logger.FileAddedToBucket(payload.Key, payload.Count, file.PayloadId ?? "null"); return payload.PayloadId; } @@ -200,13 +200,13 @@ private async Task QueueBucketForNotification(string key, Payload payload) } } - private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout) + private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder = null) { return await _payloads.GetOrAdd(key, x => new AsyncLazy(async () => { var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); - var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout); + var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null, destinationFolder); await repository.AddAsync(newPayload).ConfigureAwait(false); _logger.BucketCreated(key, timeout); return newPayload; @@ -219,4 +219,4 @@ public void Dispose() _timer.Stop(); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 16d9a7fe4..3cb86ee92 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -23,13 +23,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; @@ -62,6 +62,7 @@ public PayloadNotificationActionHandler(IServiceScopeFactory serviceScopeFactory public async Task NotifyAsync(Payload payload, ActionBlock notificationQueue, CancellationToken cancellationToken = default) { + _logger.PayloadNotifyAsync(payload.PayloadId.ToString()); Guard.Against.Null(payload, nameof(payload)); Guard.Against.Null(notificationQueue, nameof(notificationQueue)); @@ -104,6 +105,18 @@ private async Task NotifyPayloadReady(Payload payload) { Guard.Against.Null(payload, nameof(payload)); + if (payload.WorkflowInstanceId.IsNullOrEmpty() is false && payload.TaskId.IsNullOrEmpty() is false) + { + await SendArtifactRecievedEvent(payload).ConfigureAwait(false); + } + else + { + await SendWorkflowRequestEvent(payload).ConfigureAwait(false); + } + } + + private async Task SendWorkflowRequestEvent(Payload payload) + { _logger.GenerateWorkflowRequest(payload.PayloadId); var workflowRequest = new WorkflowRequestEvent @@ -138,6 +151,42 @@ await messageBrokerPublisherService.Publish( _logger.WorkflowRequestPublished(_options.Value.Messaging.Topics.WorkflowRequest, message.MessageId, payload.Elapsed.TotalSeconds); } + private async Task SendArtifactRecievedEvent(Payload payload) + { + _logger.GenerateArtifactReceievedRequest(payload.PayloadId); + + var artifiactRecievedEvent = new ArtifactsReceivedEvent + { + Bucket = _options.Value.Storage.StorageServiceBucketName, + PayloadId = payload.PayloadId, + Workflows = payload.GetWorkflows(), + FileCount = payload.Count, + CorrelationId = payload.CorrelationId, + Timestamp = payload.DateTimeCreated, + DataTrigger = payload.DataTrigger, + WorkflowInstanceId = payload.WorkflowInstanceId, + TaskId = payload.TaskId, + }; + artifiactRecievedEvent.DataOrigins.AddRange(payload.DataOrigins); + + artifiactRecievedEvent.Artifacts = payload.Files.Select(f => new Artifact { Type = f.DataOrigin.ArtifactType, Path = f.File.UploadPath }).ToList(); + + var message = new JsonMessage( + artifiactRecievedEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + payload.CorrelationId, + string.Empty); + + _logger.PublishingArtifactRecievedRequest(message.MessageId); + + var messageBrokerPublisherService = _scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IMessageBrokerPublisherService)); + await messageBrokerPublisherService.Publish( + _options.Value.Messaging.Topics.ArtifactRecieved, + message.ToMessage()).ConfigureAwait(false); + + _logger.ArtifactRecievedPublished(_options.Value.Messaging.Topics.ArtifactRecieved, message.MessageId, payload.Elapsed.TotalSeconds); + } + private async Task UpdatePayloadState(Payload payload, CancellationToken cancellationToken = default) { Guard.Against.Null(payload, nameof(payload)); @@ -189,4 +238,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs old mode 100644 new mode 100755 index bd040ed48..45bc68268 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs @@ -155,6 +155,11 @@ private async Task NotificationHandler(Payload payload) try { + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { + { "Payload", payload.PayloadId }, + { "WorkflowInstanceId", payload.WorkflowInstanceId ?? "NotSet" }, + { "TaskId", payload.TaskId ?? "NotSet" }, + }); await _payloadNotificationActionHandler.NotifyAsync(payload, _publishQueue!, _cancellationTokenSource.Token).ConfigureAwait(false); } catch (PostPayloadException ex) diff --git a/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs b/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs index 7bb731f23..4fc30edea 100644 --- a/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs +++ b/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs @@ -22,6 +22,7 @@ internal static class ContentTypes public const string ApplicationDicomJson = "application/dicom+json"; public const string ApplicationDicomXml = "application/dicom+xml"; public const string ApplicationOctetStream = "application/octet-stream"; + public const string ApplicationJson = "application/json"; public const string MultipartRelated = "multipart/related"; diff --git a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs index a2baf45a5..f6825922d 100755 --- a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs +++ b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs @@ -21,12 +21,13 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; using Ardalis.GuardClauses; using FellowOakDicom; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; @@ -35,6 +36,7 @@ using Monai.Deploy.InformaticsGateway.DicomWeb.Client.API; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; using Polly; @@ -60,7 +62,7 @@ public DicomWebExportService( ILogger logger, IOptions configuration, IDicomToolkit dicomToolkit) - : base(logger, configuration, serviceScopeFactory) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) { _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); @@ -73,9 +75,42 @@ public DicomWebExportService( Concurrency = configuration.Value.DicomWeb.MaximumNumberOfConnection; } + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var exportRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) + { + _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); + return; + } + + exportRequest.MessageId = eventArgs.Message.MessageId; + exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + + ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); + } + } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + } protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) { - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); using var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); @@ -174,7 +209,7 @@ private void CheckAndLogResult(DicomWebResponse result) break; default: - throw new ServiceException("Failed to export to destination."); + throw new InformaticsGateway.Common.ServiceException("Failed to export to destination."); } } } diff --git a/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs b/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs old mode 100644 new mode 100755 index 6b4477f6f..66a704e63 --- a/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs +++ b/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs @@ -29,11 +29,12 @@ public ExportRequestEventDetails(ExportRequestEvent exportRequest) ExportTaskId = exportRequest.ExportTaskId; Files = new List(exportRequest.Files); Destinations = new string[exportRequest.Destinations.Length]; - Array.Copy(exportRequest.Destinations, Destinations, exportRequest.Destinations.Length); + //Array.Copy(exportRequest.Destinations, Destinations, exportRequest.Destinations.Length); exportRequest.Destinations.CopyTo(Destinations, 0); DeliveryTag = exportRequest.DeliveryTag; MessageId = exportRequest.MessageId; WorkflowInstanceId = exportRequest.WorkflowInstanceId; + PayloadId = exportRequest.PayloadId; PluginAssemblies.AddRange(exportRequest.PluginAssemblies); ErrorMessages.AddRange(exportRequest.ErrorMessages); @@ -41,6 +42,23 @@ public ExportRequestEventDetails(ExportRequestEvent exportRequest) StartTime = DateTimeOffset.UtcNow; } + public ExportRequestEventDetails(ExternalAppRequestEvent externalAppRequest) + { + CorrelationId = externalAppRequest.CorrelationId; + ExportTaskId = externalAppRequest.ExportTaskId; + Files = new List(externalAppRequest.Files); + Destinations = externalAppRequest.Targets.Select(t => t.Destination).ToArray(); + DeliveryTag = externalAppRequest.DeliveryTag; + MessageId = externalAppRequest.MessageId; + WorkflowInstanceId = externalAppRequest.WorkflowInstanceId; + PayloadId = externalAppRequest.DestinationFolder; + + PluginAssemblies.AddRange(externalAppRequest.PluginAssemblies); + ErrorMessages.AddRange(externalAppRequest.ErrorMessages); + + StartTime = DateTimeOffset.UtcNow; + } + /// /// Gets the time the export request received. /// diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index 9525b6174..6065c0e2c 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -23,15 +23,18 @@ using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using Ardalis.GuardClauses; +using FellowOakDicom.Network; +using FellowOakDicom; +using FellowOakDicom.Network.Client; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -41,12 +44,14 @@ using Monai.Deploy.Messaging.Messages; using Monai.Deploy.Storage.API; using Polly; +using System.Net.Sockets; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Services.Export { public abstract class ExportServiceBase : IHostedService, IMonaiService, IDisposable { - private static readonly object SyncRoot = new(); + protected static readonly object SyncRoot = new(); internal event EventHandler? ReportActionCompleted; @@ -54,13 +59,14 @@ public abstract class ExportServiceBase : IHostedService, IMonaiService, IDispos private readonly ILogger _logger; private readonly IServiceScopeFactory _serviceScopeFactory; private readonly InformaticsGatewayConfiguration _configuration; - private readonly IMessageBrokerSubscriberService _messageSubscriber; - private readonly IMessageBrokerPublisherService _messagePublisher; + protected readonly IMessageBrokerSubscriberService MessageSubscriber; + protected readonly IMessageBrokerPublisherService MessagePublisher; private readonly IServiceScope _scope; - private readonly Dictionary _exportRequests; + protected readonly Dictionary ExportRequests; private readonly IStorageInfoProvider _storageInfoProvider; private bool _disposedValue; private ulong _activeWorkers = 0; + private readonly IDicomToolkit _dicomToolkit; public abstract string RoutingKey { get; } protected abstract ushort Concurrency { get; } @@ -76,15 +82,19 @@ public abstract class ExportServiceBase : IHostedService, IMonaiService, IDispos /// protected abstract Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken); + protected abstract Task ProcessMessage(MessageReceivedEventArgs eventArgs); + protected ExportServiceBase( ILogger logger, IOptions configuration, - IServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory, + IDicomToolkit dicomToolkit) { _cancellationTokenSource = new CancellationTokenSource(); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _scope = _serviceScopeFactory.CreateScope(); + _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); if (configuration is null) { @@ -93,13 +103,13 @@ protected ExportServiceBase( _configuration = configuration.Value; - _messageSubscriber = _scope.ServiceProvider.GetRequiredService(); - _messagePublisher = _scope.ServiceProvider.GetRequiredService(); + MessageSubscriber = _scope.ServiceProvider.GetRequiredService(); + MessagePublisher = _scope.ServiceProvider.GetRequiredService(); _storageInfoProvider = _scope.ServiceProvider.GetRequiredService(); - _exportRequests = new Dictionary(); + ExportRequests = new Dictionary(); - _messageSubscriber.OnConnectionError += (sender, args) => + MessageSubscriber.OnConnectionError += (sender, args) => { _logger.MessagingServiceErrorRecover(args.ErrorMessage); SetupPolling(); @@ -125,11 +135,11 @@ public Task StopAsync(CancellationToken cancellationToken) private void SetupPolling() { - _messageSubscriber.SubscribeAsync(RoutingKey, RoutingKey, OnMessageReceivedCallback, prefetchCount: Concurrency); + MessageSubscriber.SubscribeAsync(RoutingKey, RoutingKey, OnMessageReceivedCallback, prefetchCount: Concurrency); _logger.ExportEventSubscription(ServiceName, RoutingKey); } - private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) + protected async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) { using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "ThreadId", Environment.CurrentManagedThreadId }, @@ -138,7 +148,7 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) if (!_storageInfoProvider.HasSpaceAvailableForExport) { _logger.ExportServiceStoppedDueToLowStorageSpace(_storageInfoProvider.AvailableFreeSpace); - _messageSubscriber.Reject(eventArgs.Message); + MessageSubscriber.Reject(eventArgs.Message); return; } @@ -146,110 +156,134 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) { _logger.ExceededMaxmimumNumberOfWorkers(ServiceName, _activeWorkers); await Task.Delay(200).ConfigureAwait(false); // small delay to stop instantly dead lettering the next message. - _messageSubscriber.Reject(eventArgs.Message); + MessageSubscriber.Reject(eventArgs.Message); return; } Interlocked.Increment(ref _activeWorkers); try { - var executionOptions = new ExecutionDataflowBlockOptions + await ProcessMessage(eventArgs).ConfigureAwait(false); + } + catch (AggregateException ex) + { + foreach (var iex in ex.InnerExceptions) { - MaxDegreeOfParallelism = Concurrency, - MaxMessagesPerTask = 1, - CancellationToken = _cancellationTokenSource.Token - }; + _logger.ErrorExporting(iex); + } + } + catch (Exception ex) + { + _logger.ErrorProcessingExportTask(ex); + } + finally + { + Interlocked.Decrement(ref _activeWorkers); + } + } - var exportFlow = new TransformManyBlock( - exportRequest => DownloadPayloadActionCallback(exportRequest, _cancellationTokenSource.Token), - executionOptions); + TransformBlock GetoutputDataEngineBlock(ExecutionDataflowBlockOptions executionOptions) + { + return new TransformBlock( + async (exportDataRequest) => + { + try + { + if (exportDataRequest.IsFailed) return exportDataRequest; + return await ExecuteOutputDataEngineCallback(exportDataRequest).ConfigureAwait(false); + } + catch (Exception e) + { + exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"failed to execute plugin {e.Message}"); + return exportDataRequest; + } + }, + executionOptions); + } - var outputDataEngineBLock = new TransformBlock( - async (exportDataRequest) => + TransformBlock GetxportActionBlock(ExecutionDataflowBlockOptions executionOptions) + { + return new TransformBlock( + async (exportDataRequest) => + { + try { - try - { - if (exportDataRequest.IsFailed) return exportDataRequest; - return await ExecuteOutputDataEngineCallback(exportDataRequest).ConfigureAwait(false); - } - catch (Exception e) - { - exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"failed to execute plugin {e.Message}"); - return exportDataRequest; - } - }, - executionOptions); - - var exportActionBlock = new TransformBlock( - async (exportDataRequest) => + if (exportDataRequest.IsFailed) return exportDataRequest; + return await ExportDataBlockCallback(exportDataRequest, _cancellationTokenSource.Token).ConfigureAwait(false); + } + catch (Exception e) { - try - { - if (exportDataRequest.IsFailed) return exportDataRequest; - return await ExportDataBlockCallback(exportDataRequest, _cancellationTokenSource.Token).ConfigureAwait(false); - } - catch (Exception e) - { - exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"Failed during export {e.Message}"); - return exportDataRequest; - } + exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"Failed during export {e.Message}"); + return exportDataRequest; + } - }, - executionOptions); + }, + executionOptions); + } - var reportingActionBlock = new ActionBlock(ReportingActionBlock, executionOptions); + protected (TransformManyBlock, ActionBlock) SetupActionBlocks() + { + var executionOptions = new ExecutionDataflowBlockOptions + { + MaxDegreeOfParallelism = Concurrency, + MaxMessagesPerTask = 1, + CancellationToken = _cancellationTokenSource.Token + }; - var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; + var exportFlow = new TransformManyBlock( + exportRequest => DownloadPayloadActionCallback(exportRequest, _cancellationTokenSource.Token), + executionOptions); - exportFlow.LinkTo(outputDataEngineBLock, linkOptions); - outputDataEngineBLock.LinkTo(exportActionBlock, linkOptions); - exportActionBlock.LinkTo(reportingActionBlock, linkOptions); + var outputDataEngineBLock = GetoutputDataEngineBlock(executionOptions); - lock (SyncRoot) - { - var exportRequest = eventArgs.Message.ConvertTo(); - if (_exportRequests.ContainsKey(exportRequest.ExportTaskId)) - { - _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); - return; - } + var exportActionBlock = GetxportActionBlock(executionOptions); - exportRequest.MessageId = eventArgs.Message.MessageId; - exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + var reportingActionBlock = new ActionBlock(ReportingActionBlock, executionOptions); - var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; - _exportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); - if (!exportFlow.Post(exportRequestWithDetails)) - { - _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); - _messageSubscriber.Reject(eventArgs.Message); - } - else - { - _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); - } - } + exportFlow.LinkTo(outputDataEngineBLock, linkOptions); + outputDataEngineBLock.LinkTo(exportActionBlock, linkOptions); + exportActionBlock.LinkTo(reportingActionBlock, linkOptions); - exportFlow.Complete(); - await reportingActionBlock.Completion.ConfigureAwait(false); - } - catch (AggregateException ex) - { - foreach (var iex in ex.InnerExceptions) - { - _logger.ErrorExporting(iex); - } - } - catch (Exception ex) + return (exportFlow, reportingActionBlock); + } + + protected void HandleCStoreException(Exception ex, ExportRequestDataMessage exportRequestData) + { + var exception = ex; + var fillStatus = FileExportStatus.ServiceError; + + if (exception is AggregateException) { - _logger.ErrorProcessingExportTask(ex); + exception = exception.InnerException!; } - finally + + var errorMessage = $"Job failed with error: {exception.Message}."; + + switch (exception) { - Interlocked.Decrement(ref _activeWorkers); + case DicomAssociationAbortedException abortEx: + errorMessage = $"Association aborted with reason {abortEx.AbortReason}."; + break; + case DicomAssociationRejectedException rejectEx: + errorMessage = $"Association rejected with reason {rejectEx.RejectReason}."; + break; + case SocketException socketException: + errorMessage = $"Association aborted with error {socketException.Message}."; + break; + case ConfigurationException configException: + errorMessage = $"{configException.Message}"; + fillStatus = FileExportStatus.ConfigurationError; + break; + case ExternalAppExeception appException: + errorMessage = $"{appException.Message}"; + break; } + + _logger.ExportException(errorMessage, ex); + exportRequestData.SetFailed(fillStatus, errorMessage); } // TPL doesn't yet support IAsyncEnumerable @@ -281,6 +315,7 @@ private IEnumerable DownloadPayloadActionCallback(Expo var stream = (await storageService.GetObjectAsync(_configuration.Storage.StorageServiceBucketName, file, cancellationToken).ConfigureAwait(false) as MemoryStream)!; exportRequestData.SetData(stream.ToArray()); _logger.FileReadyForExport(file); + ExportCompleteCallback(exportRequestData).GetAwaiter().GetResult(); }); task.Wait(cancellationToken); @@ -308,9 +343,8 @@ private async Task ExecuteOutputDataEngineCallback(Exp return await outputDataEngine.ExecutePlugInsAsync(exportDataRequest).ConfigureAwait(false); } - private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) + private static void HandleStatus(ExportRequestDataMessage exportRequestData, ExportRequestEventDetails exportRequest) { - var exportRequest = _exportRequests[exportRequestData.ExportTaskId]; lock (SyncRoot) { exportRequest.FileStatuses.Add(exportRequestData.Filename, exportRequestData.ExportStatus); @@ -327,11 +361,16 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) { exportRequest.AddErrorMessages(exportRequestData.Messages); } + } + } - if (!exportRequest.IsCompleted) - { - return; - } + private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) + { + var exportRequest = ExportRequests[exportRequestData.ExportTaskId]; + HandleStatus(exportRequestData, exportRequest); + if (!exportRequest.IsCompleted) + { + return; } using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId } }); @@ -341,6 +380,26 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) var jsonMessage = new JsonMessage(exportCompleteEvent, MessageBrokerConfiguration.InformaticsGatewayApplicationId, exportRequest.CorrelationId, exportRequest.DeliveryTag); + FinaliseMessage(jsonMessage); + + lock (SyncRoot) + { + ExportRequests.Remove(exportRequestData.ExportTaskId); + } + + if (ReportActionCompleted != null) + { + _logger.CallingReportActionCompletedCallback(); + ReportActionCompleted(this, EventArgs.Empty); + } + } + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + protected virtual async Task ExportCompleteCallback(ExportRequestDataMessage exportRequestData) { } +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + private void FinaliseMessage(JsonMessage jsonMessage) + { Policy .Handle() .WaitAndRetry( @@ -352,7 +411,7 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) .Execute(() => { _logger.PublishingExportCompleteEvent(); - _messagePublisher.Publish(_configuration.Messaging.Topics.ExportComplete, jsonMessage.ToMessage()); + MessagePublisher.Publish(_configuration.Messaging.Topics.ExportComplete, jsonMessage.ToMessage()); }); Policy @@ -366,19 +425,8 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) .Execute(() => { _logger.SendingAcknowledgement(); - _messageSubscriber.Acknowledge(jsonMessage); + MessageSubscriber.Acknowledge(jsonMessage); }); - - lock (SyncRoot) - { - _exportRequests.Remove(exportRequestData.ExportTaskId); - } - - if (ReportActionCompleted != null) - { - _logger.CallingReportActionCompletedCallback(); - ReportActionCompleted(this, EventArgs.Empty); - } } protected virtual void Dispose(bool disposing) @@ -394,6 +442,141 @@ protected virtual void Dispose(bool disposing) } } + private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(destinationName)) + { + throw new ConfigurationException("Export task does not have destination set."); + } + + using var scope = _serviceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); + var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); + + if (destination is null) + { + throw new ConfigurationException($"Specified destination '{destinationName}' does not exist."); + } + + return destination; + } + + protected async Task GetDestination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + try + { + return await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); + } + catch (ConfigurationException ex) + { + HandleCStoreException(ex, exportRequestData); + return null; + } + } + + protected async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + Guard.Against.Null(exportRequestData, nameof(exportRequestData)); + + var manualResetEvent = new ManualResetEvent(false); + var destination = await GetDestination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + if (destination is null) + { + return; + } + + try + { + await ExecuteExport(exportRequestData, manualResetEvent, destination!, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + HandleCStoreException(ex, exportRequestData); + } + } + + private async Task GenerateRequestsAsync( + ExportRequestDataMessage exportRequestData, + IDicomClient client, + ManualResetEvent manualResetEvent) + { + DicomFile dicomFile; + try + { + dicomFile = _dicomToolkit.Load(exportRequestData.FileContent); + } + catch (Exception ex) + { + var errorMessage = $"Error reading DICOM file: {ex.Message}"; + _logger.ExportException(errorMessage, ex); + exportRequestData.SetFailed(FileExportStatus.UnsupportedDataType, errorMessage); + return false; + } + + try + { + var request = new DicomCStoreRequest(dicomFile); + + request.OnResponseReceived += (req, response) => + { + if (response.Status == DicomStatus.Success) + { + _logger.DimseExportInstanceComplete(); + } + else + { + var errorMessage = $"Failed to export with error {response.Status}"; + _logger.DimseExportInstanceError(response.Status); + exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); + } + manualResetEvent.Set(); + }; + + await client.AddRequestAsync(request).ConfigureAwait(false); + return true; + } + catch (Exception exception) + { + var errorMessage = $"Error while adding DICOM C-STORE request: {exception.Message}"; + _logger.DimseExportErrorAddingInstance(exception.Message, exception); + exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); + return false; + } + } + + protected async Task ExecuteExport(ExportRequestDataMessage exportRequestData, ManualResetEvent manualResetEvent, DestinationApplicationEntity destination, CancellationToken cancellationToken) => await Policy + .Handle() + .WaitAndRetryAsync( + _configuration.Export.Retries.RetryDelays, + (exception, timeSpan, retryCount, context) => + { + _logger.DimseExportErrorWithRetry(timeSpan, retryCount, exception); + }) + .ExecuteAsync(async () => + { + var client = DicomClientFactory.Create( + destination.HostIp, + destination.Port, + false, + _configuration.Dicom.Scu.AeTitle, + destination.AeTitle); + + client.AssociationAccepted += (sender, args) => _logger.ExportAssociationAccepted(); + client.AssociationRejected += (sender, args) => _logger.ExportAssociationRejected(); + client.AssociationReleased += (sender, args) => _logger.ExportAssociationReleased(); + client.ServiceOptions.LogDataPDUs = _configuration.Dicom.Scu.LogDataPdus; + client.ServiceOptions.LogDimseDatasets = _configuration.Dicom.Scu.LogDimseDatasets; + + client.NegotiateAsyncOps(); + if (await GenerateRequestsAsync(exportRequestData, client, manualResetEvent).ConfigureAwait(false)) + { + _logger.DimseExporting(destination.AeTitle, destination.HostIp, destination.Port); + await client.SendAsync(cancellationToken).ConfigureAwait(false); + manualResetEvent.WaitOne(); + _logger.DimseExportComplete(destination.AeTitle); + } + }).ConfigureAwait(false); + public void Dispose() { // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method diff --git a/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs b/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs new file mode 100755 index 000000000..0e6c5a225 --- /dev/null +++ b/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs @@ -0,0 +1,168 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; +using FellowOakDicom; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; + +namespace Monai.Deploy.InformaticsGateway.Services.Export +{ + public class ExtAppScuExportService : ExportServiceBase + { + private readonly ILogger _logger; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly IOptions _configuration; + private readonly IExternalAppDetailsRepository _repository; + private readonly IDicomToolkit _dicomToolkit; + protected override ushort Concurrency { get; } + public override string RoutingKey { get; } + public override string ServiceName => "DICOM Export Service"; + + public ExtAppScuExportService( + ILogger logger, + IServiceScopeFactory serviceScopeFactory, + IOptions configuration, + IDicomToolkit dicomToolkit, + IExternalAppDetailsRepository repository) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); + RoutingKey = $"{configuration.Value.Messaging.Topics.ExternalAppRequest}"; + Concurrency = _configuration.Value.Dicom.Scu.MaximumNumberOfAssociations; + } + + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var externalAppRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(externalAppRequest.ExportTaskId)) + { + _logger.ExportRequestAlreadyQueued(externalAppRequest.CorrelationId, externalAppRequest.ExportTaskId); + return; + } + + externalAppRequest.MessageId = eventArgs.Message.MessageId; + externalAppRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(externalAppRequest); + + ExportRequests.Add(externalAppRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + _logger.ErrorPostingExportJobToQueue(externalAppRequest.CorrelationId, externalAppRequest.ExportTaskId); + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + _logger.ExportRequestQueuedForProcessing(externalAppRequest.CorrelationId, externalAppRequest.MessageId, externalAppRequest.ExportTaskId); + } + } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + } + + protected override async Task ExportCompleteCallback(ExportRequestDataMessage exportRequestData) + { + try + { + var dicom = _dicomToolkit.Load(exportRequestData.FileContent); + dicom.Dataset.TryGetString(DicomTag.PatientID, out var patientID); + if (dicom.Dataset.TryGetString(DicomTag.StudyInstanceUID, out var studyInstUID)) + { + var (newStudyInstanceUID, newPatientId) = + await SaveInRepo(exportRequestData, studyInstUID, patientID ?? string.Empty) + .ConfigureAwait(false); + dicom.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, newStudyInstanceUID); + dicom.Dataset.AddOrUpdate(DicomTag.PatientID, newPatientId); + + using var ms = new MemoryStream(); + await dicom.SaveAsync(ms).ConfigureAwait(false); + exportRequestData.SetData(ms.ToArray()); + return; + } + throw new ExternalAppExeception("No StudyInstanceUID tag found"); + } + catch (Exception ex) + { + var errorMessage = $"Error reading DICOM file: {ex.Message}"; + _logger.ExportException(errorMessage, ex); + exportRequestData.SetFailed(FileExportStatus.UnsupportedDataType, errorMessage); + } + + } + + private async Task<(string, string)> SaveInRepo(ExportRequestDataMessage externalAppRequest, string studyinstanceId, string patientId) + { + var existing = (await _repository.GetAsync(studyinstanceId, new CancellationToken()).ConfigureAwait(false)) + ?.Find(e => e.WorkflowInstanceId == externalAppRequest.WorkflowInstanceId && + e.ExportTaskID == externalAppRequest.ExportTaskId); + if (existing is null) + { + var studyInstanceUidOutBound = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var PatientIdOutbound = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + await _repository.AddAsync(new ExternalAppDetails + { + StudyInstanceUid = studyinstanceId, + StudyInstanceUidOutBound = studyInstanceUidOutBound, + WorkflowInstanceId = externalAppRequest.WorkflowInstanceId, + ExportTaskID = externalAppRequest.ExportTaskId, + CorrelationId = externalAppRequest.CorrelationId, + DateTimeCreated = DateTime.Now, + DestinationFolder = externalAppRequest.FilePayloadId, + PatientId = patientId, + PatientIdOutBound = PatientIdOutbound + }, new CancellationToken()).ConfigureAwait(false); + _logger.SavingExternalAppData(studyinstanceId); + return (studyInstanceUidOutBound, PatientIdOutbound); + } + return (existing.StudyInstanceUidOutBound, existing.PatientIdOutBound); + } + + protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) + { + using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); + + foreach (var destinationName in exportRequestData.Destinations) + { + await HandleDesination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + } + + return exportRequestData; + } + } +} diff --git a/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs b/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs new file mode 100755 index 000000000..0b2860011 --- /dev/null +++ b/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Services.Export +{ + public class ExternalAppExeception : Exception + { + public ExternalAppExeception() + { + } + + public ExternalAppExeception(string message) : base(message) + { + } + + public ExternalAppExeception(string message, Exception innerException) : base(message, innerException) + { + } + + protected ExternalAppExeception(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/InformaticsGateway/Services/Export/ScuExportService.cs b/src/InformaticsGateway/Services/Export/ScuExportService.cs index 1daec61eb..e3fc6fdbe 100755 --- a/src/InformaticsGateway/Services/Export/ScuExportService.cs +++ b/src/InformaticsGateway/Services/Export/ScuExportService.cs @@ -16,23 +16,18 @@ */ using System; -using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; -using Ardalis.GuardClauses; -using FellowOakDicom; -using FellowOakDicom.Network; -using FellowOakDicom.Network.Client; +using System.Threading.Tasks.Dataflow; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; -using Polly; namespace Monai.Deploy.InformaticsGateway.Services.Export { @@ -52,7 +47,7 @@ public ScuExportService( IServiceScopeFactory serviceScopeFactory, IOptions configuration, IDicomToolkit dicomToolkit) - : base(logger, configuration, serviceScopeFactory) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); @@ -63,170 +58,50 @@ public ScuExportService( Concurrency = _configuration.Value.Dicom.Scu.MaximumNumberOfAssociations; } - protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) - { - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); - - foreach (var destinationName in exportRequestData.Destinations) - { - await HandleDesination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); - } - - return exportRequestData; - } - - private async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) - { - Guard.Against.Null(exportRequestData, nameof(exportRequestData)); - - var manualResetEvent = new ManualResetEvent(false); - DestinationApplicationEntity? destination = null; - try - { - destination = await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); - } - catch (ConfigurationException ex) - { - _logger.ScuExportConfigurationError(ex.Message, ex); - exportRequestData.SetFailed(FileExportStatus.ConfigurationError, ex.Message); - return; - } - - try - { - await Policy - .Handle() - .WaitAndRetryAsync( - _configuration.Value.Export.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.DimseExportErrorWithRetry(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - var client = DicomClientFactory.Create( - destination.HostIp, - destination.Port, - false, - _configuration.Value.Dicom.Scu.AeTitle, - destination.AeTitle); - - client.AssociationAccepted += (sender, args) => _logger.ExportAssociationAccepted(); - client.AssociationRejected += (sender, args) => _logger.ExportAssociationRejected(); - client.AssociationReleased += (sender, args) => _logger.ExportAssociationReleased(); - client.ServiceOptions.LogDataPDUs = _configuration.Value.Dicom.Scu.LogDataPdus; - client.ServiceOptions.LogDimseDatasets = _configuration.Value.Dicom.Scu.LogDimseDatasets; - - client.NegotiateAsyncOps(); - if (await GenerateRequestsAsync(exportRequestData, client, manualResetEvent).ConfigureAwait(false)) - { - _logger.DimseExporting(destination.AeTitle, destination.HostIp, destination.Port); - await client.SendAsync(cancellationToken).ConfigureAwait(false); - manualResetEvent.WaitOne(); - _logger.DimseExportComplete(destination.AeTitle); - } - }).ConfigureAwait(false); - } - catch (Exception ex) - { - HandleCStoreException(ex, exportRequestData); - } - } - - private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) { - if (string.IsNullOrWhiteSpace(destinationName)) - { - throw new ConfigurationException("Export task does not have destination set."); - } + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); - using var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService(); - var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); - - if (destination is null) + lock (SyncRoot) { - throw new ConfigurationException($"Specified destination '{destinationName}' does not exist."); - } - - return destination; - } + var exportRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) + { + _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); + return; + } - private async Task GenerateRequestsAsync( - ExportRequestDataMessage exportRequestData, - IDicomClient client, - ManualResetEvent manualResetEvent) - { - DicomFile dicomFile; - try - { - dicomFile = _dicomToolkit.Load(exportRequestData.FileContent); - } - catch (Exception ex) - { - var errorMessage = $"Error reading DICOM file: {ex.Message}"; - _logger.ExportException(errorMessage, ex); - exportRequestData.SetFailed(FileExportStatus.UnsupportedDataType, errorMessage); - return false; - } + exportRequest.MessageId = eventArgs.Message.MessageId; + exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; - try - { - var request = new DicomCStoreRequest(dicomFile); + var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); - request.OnResponseReceived += (req, response) => + ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) { - if (response.Status == DicomStatus.Success) - { - _logger.DimseExportInstanceComplete(); - } - else - { - var errorMessage = $"Failed to export with error {response.Status}"; - _logger.DimseExportInstanceError(response.Status); - exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); - } - manualResetEvent.Set(); - }; - - await client.AddRequestAsync(request).ConfigureAwait(false); - return true; - } - catch (Exception exception) - { - var errorMessage = $"Error while adding DICOM C-STORE request: {exception.Message}"; - _logger.DimseExportErrorAddingInstance(exception.Message, exception); - exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); - return false; + _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); + } } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); } - private void HandleCStoreException(Exception ex, ExportRequestDataMessage exportRequestData) + protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) { - var exception = ex; - - if (exception is AggregateException) - { - exception = exception.InnerException!; - } - - var errorMessage = $"Job failed with error: {exception.Message}."; + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); - if (exception is DicomAssociationAbortedException abortEx) - { - errorMessage = $"Association aborted with reason {abortEx.AbortReason}."; - } - else if (exception is DicomAssociationRejectedException rejectEx) - { - errorMessage = $"Association rejected with reason {rejectEx.RejectReason}."; - } - else if (exception is SocketException socketException) + foreach (var destinationName in exportRequestData.Destinations) { - errorMessage = $"Association aborted with error {socketException.Message}."; + await HandleDesination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); } - _logger.ExportException(errorMessage, ex); - exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); + return exportRequestData; } } } diff --git a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs index 23542973e..91e46723d 100755 --- a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs @@ -23,6 +23,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs old mode 100644 new mode 100755 index d794cecff..ad0fb4d37 --- a/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs +++ b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs @@ -23,7 +23,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; diff --git a/src/InformaticsGateway/Services/Http/HealthController.cs b/src/InformaticsGateway/Services/Http/HealthController.cs old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs new file mode 100644 index 000000000..d49913ebe --- /dev/null +++ b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs @@ -0,0 +1,172 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.DicomWeb; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [ApiController] + [Route("configEntity/hl7-application")] + public class Hl7ApplicationConfigController : ApiControllerBase + { + private const string Endpoint = "configEntity/hl7-application"; + + private readonly ILogger _logger; + private readonly IHl7ApplicationConfigRepository _repository; + + public Hl7ApplicationConfigController(ILogger logger, + IHl7ApplicationConfigRepository repository) + { + _logger = logger; + _repository = repository; + } + + [HttpGet] + [Produces(ContentTypes.ApplicationJson)] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task Get() + { + var data = await _repository.GetAllAsync().ConfigureAwait(false); + return Ok(data); + } + + [HttpGet("{id}")] + [Produces(ContentTypes.ApplicationJson)] + [ProducesResponseType(typeof(Hl7ApplicationConfigEntity), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task Get(string id) + { + var data = await _repository.GetByIdAsync(id).ConfigureAwait(false); + if (data == null) + { + return NotFound(); + } + + return Ok(data); + } + + [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Delete(string id) + { + var data = await _repository.GetByIdAsync(id).ConfigureAwait(false); + if (data == null) + { + return NotFound(); + } + + try + { + var result = await _repository.DeleteAsync(id).ConfigureAwait(false); + return Ok(result); + } + catch (DatabaseException ex) + { + return Problem(title: "Database error removing HL7 Application Configuration.", statusCode: BadRequest, + detail: ex.Message); + } + catch (Exception ex) + { + return Problem(title: "Unknown error removing HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + + [HttpPut] + [Consumes(ContentTypes.ApplicationJson)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Put([FromBody] Hl7ApplicationConfigEntity configEntity) + { + if (configEntity == null) + { + return Problem(title: "Hl7ApplicationConfigEntity is null.", statusCode: BadRequest, detail: "Hl7ApplicationConfigEntity is null."); + } + + var errorMessages = configEntity.Validate().ToList(); + if (errorMessages.Any()) + { + var message = "Hl7ApplicationConfigEntity is invalid. " + string.Join(", ", errorMessages); + return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); + } + + configEntity.Id = Guid.NewGuid(); + try + { + await _repository.CreateAsync(configEntity).ConfigureAwait(false); + return Ok(configEntity.Id); + } + catch (Exception ex) + { + _logger.PutHl7ApplicationConfigException(Endpoint, ex); + return Problem(title: "Error adding new HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + + [HttpPost] + [Consumes(ContentTypes.ApplicationJson)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Post([FromBody] Hl7ApplicationConfigEntity configEntity) + { + if (configEntity == null) + { + return Problem(title: "Hl7ApplicationConfigEntity is null.", statusCode: BadRequest, detail: "Hl7ApplicationConfigEntity is null."); + } + + var errorMessages = configEntity.Validate().ToList(); + if (errorMessages.Any()) + { + var message = "Hl7ApplicationConfigEntity is invalid. " + string.Join(", ", errorMessages); + return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); + } + + try + { + var result = await _repository.UpdateAsync(configEntity).ConfigureAwait(false); + if (result is null) + { + return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, + detail: "configEntity not found."); + } + return Ok(result); + } + catch (DatabaseException ex) + { + return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, + detail: ex.Message); + } + catch (Exception ex) + { + return Problem(title: "Unknown error updating HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs old mode 100644 new mode 100755 index 22810f4a3..fd967c01a --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -24,6 +24,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/src/InformaticsGateway/Services/Http/Startup.cs b/src/InformaticsGateway/Services/Http/Startup.cs old mode 100644 new mode 100755 index f498e3545..dfc6dc5e1 --- a/src/InformaticsGateway/Services/Http/Startup.cs +++ b/src/InformaticsGateway/Services/Http/Startup.cs @@ -90,6 +90,28 @@ public void ConfigureServices(IServiceCollection services) services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "MONAI Deploy Informatics Gateway", Version = "v1" }); + c.DescribeAllParametersInCamelCase(); + c.AddSecurityDefinition("basic", new OpenApiSecurityScheme + { + Scheme = "basic", + Name = "basic", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }); + c.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "basic", + }, + }, + System.Array.Empty() + }, + }); }); services.Configure(options => diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index f41d63966..411657c86 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -19,18 +19,22 @@ using System.Linq; using System.Threading.Tasks; using Ardalis.GuardClauses; +using FellowOakDicom; using FellowOakDicom.Network; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.Services.Storage; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; namespace Monai.Deploy.InformaticsGateway.Services.Scp @@ -46,6 +50,7 @@ internal class ApplicationEntityHandler : IDisposable, IApplicationEntityHandler private readonly IObjectUploadQueue _uploadQueue; private readonly IFileSystem _fileSystem; private readonly IInputDataPlugInEngine _pluginEngine; + private readonly IExternalAppDetailsRepository _externalAppDetailsRepository; private MonaiApplicationEntity? _configuration; private DicomJsonOptions _dicomJsonOptions; private bool _validateDicomValueOnJsonSerialization; @@ -54,7 +59,8 @@ internal class ApplicationEntityHandler : IDisposable, IApplicationEntityHandler public ApplicationEntityHandler( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options, + IExternalAppDetailsRepository externalAppDetailsRepository) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); @@ -65,6 +71,7 @@ public ApplicationEntityHandler( _uploadQueue = _serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IObjectUploadQueue)); _fileSystem = _serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IFileSystem)); _pluginEngine = _serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IInputDataPlugInEngine)); + _externalAppDetailsRepository = externalAppDetailsRepository ?? throw new ServiceNotFoundException(nameof(externalAppDetailsRepository)); } public void Configure(MonaiApplicationEntity monaiApplicationEntity, DicomJsonOptions dicomJsonOptions, bool validateDicomValuesOnJsonSerialization) @@ -87,7 +94,7 @@ public void Configure(MonaiApplicationEntity monaiApplicationEntity, DicomJsonOp } } - public async Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids) + public async Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids, ScpInputTypeEnum type) { if (_configuration is null) { @@ -105,17 +112,57 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string _logger.InstanceIgnoredWIthMatchingSopClassUid(request.SOPClassUID.UID); return string.Empty; } + ExternalAppDetails? storedDetails = null; + + + + var dicomInfo = new DicomFileStorageMetadata( + associationId.ToString(), + uids.Identifier, + uids.StudyInstanceUid, + uids.SeriesInstanceUid, + uids.SopInstanceUid, + DataService.DIMSE, + callingAeTitle, + calledAeTitle); + - var dicomInfo = new DicomFileStorageMetadata(associationId.ToString(), uids.Identifier, uids.StudyInstanceUid, uids.SeriesInstanceUid, uids.SopInstanceUid, DataService.DIMSE, callingAeTitle, calledAeTitle); if (_configuration.Workflows.Any()) { dicomInfo.SetWorkflows(_configuration.Workflows.ToArray()); } + if (request.File.Dataset.Contains(DicomTag.Modality)) + { + var modality = request.File.Dataset.GetSingleValue(DicomTag.Modality); + + if (ArtifactTypes.Validate(modality) && Enum.TryParse(modality, out ArtifactType parsedArtifactType)) + { + dicomInfo.DataOrigin.ArtifactType = parsedArtifactType; + } + } var result = await _pluginEngine.ExecutePlugInsAsync(request.File, dicomInfo).ConfigureAwait(false); - using var scope = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); + using var scope = _logger.BeginScope(new Api.LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); + + + if (type == ScpInputTypeEnum.ExternalAppReturn) + { + var uid = request.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); + storedDetails = await _externalAppDetailsRepository + .GetByStudyIdOutboundAsync(uid, new System.Threading.CancellationToken()) + .ConfigureAwait(false); + if (storedDetails is null) + { + _logger.FailedToFindStoredExtAppDetails(uid); + } + RetrieveExternalAppDetails(storedDetails, dicomInfo); + dicomInfo.SetupGivenFilePaths(storedDetails?.DestinationFolder); + request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, storedDetails?.StudyInstanceUid); + request.Dataset.AddOrUpdate(DicomTag.PatientID, storedDetails?.PatientId); + } + dicomInfo = (result.Item2 as DicomFileStorageMetadata)!; var dicomFile = result.Item1; @@ -125,13 +172,26 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string _logger.QueueInstanceUsingDicomTag(dicomTag); var key = dicomFile.Dataset.GetSingleValue(dicomTag); - var payloadId = await _payloadAssembler.Queue(key, dicomInfo, new DataOrigin { DataService = DataService.DIMSE, Source = callingAeTitle, Destination = calledAeTitle }, _configuration.Timeout).ConfigureAwait(false); + var payloadId = await _payloadAssembler.Queue(key, dicomInfo, dicomInfo.DataOrigin, _configuration.Timeout).ConfigureAwait(false); dicomInfo.PayloadId = payloadId.ToString(); _uploadQueue.Queue(dicomInfo); return dicomInfo.PayloadId; } + private void RetrieveExternalAppDetails(ExternalAppDetails? storedDetails, DicomFileStorageMetadata dicomInfo) + { + if (storedDetails is null) + { + return; + } + dicomInfo.ChangeCorrelationId(_logger, storedDetails.CorrelationId); + dicomInfo.WorkflowInstanceId = storedDetails.WorkflowInstanceId; + dicomInfo.TaskId = storedDetails.ExportTaskID; + dicomInfo.SetStudyInstanceUid(storedDetails.StudyInstanceUid); + //dicomInfo.DestinationFolderNeil = storedDetails.DestinationFolder!; + } + private bool AcceptsSopClass(string sopClassUid) { Guard.Against.NullOrWhiteSpace(sopClassUid, nameof(sopClassUid)); diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs index 778266cd2..4e6aaf951 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Concurrent; -using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; using FellowOakDicom.Network; @@ -26,10 +25,12 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Storage; namespace Monai.Deploy.InformaticsGateway.Services.Scp @@ -92,7 +93,7 @@ private void OnApplicationStopping() _unsubscriberForMonaiAeChangedNotificationService.Dispose(); } - public async Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId) + public async Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type) { Guard.Against.Null(request, nameof(request)); @@ -108,10 +109,10 @@ public async Task HandleCStoreRequest(DicomCStoreRequest request, string throw new InsufficientStorageAvailableException($"Insufficient storage available. Available storage space: {_storageInfoProvider.AvailableFreeSpace:D}"); } - return await HandleInstance(request, calledAeTitle, callingAeTitle, associationId).ConfigureAwait(false); + return await HandleInstance(request, calledAeTitle, callingAeTitle, associationId, type).ConfigureAwait(false); } - private async Task HandleInstance(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId) + private async Task HandleInstance(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type) { var uids = _dicomToolkit.GetStudySeriesSopInstanceUids(request.File); @@ -125,7 +126,7 @@ private async Task HandleInstance(DicomCStoreRequest request, string cal { _logger.InstanceInformation(uids.StudyInstanceUid, uids.SeriesInstanceUid); - return await _aeTitles[calledAeTitle].HandleInstanceAsync(request, calledAeTitle, callingAeTitle, associationId, uids).ConfigureAwait(false); + return await _aeTitles[calledAeTitle].HandleInstanceAsync(request, calledAeTitle, callingAeTitle, associationId, uids, type).ConfigureAwait(false); } } diff --git a/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs b/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs new file mode 100755 index 000000000..aa6f1e459 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs @@ -0,0 +1,94 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Logging; + + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + internal class ExternalAppScpService : ScpServiceBase + { + private readonly IServiceScope _serviceScope; + private readonly ILogger _logger; + private readonly ILogger _scpServiceInternalLogger; + private readonly IOptions _configuration; + private readonly IApplicationEntityManager _associationDataProvider; + + public override string ServiceName => "External App DICOM SCP Service"; + + public ExternalAppScpService(IServiceScopeFactory serviceScopeFactory, + IApplicationEntityManager applicationEntityManager, + IHostApplicationLifetime appLifetime, + IOptions configuration) : base(serviceScopeFactory, applicationEntityManager, appLifetime, configuration) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(applicationEntityManager, nameof(applicationEntityManager)); + Guard.Against.Null(appLifetime, nameof(appLifetime)); + Guard.Against.Null(configuration, nameof(configuration)); + + _associationDataProvider = applicationEntityManager; + + _serviceScope = serviceScopeFactory.CreateScope(); + var logginFactory = _serviceScope.ServiceProvider.GetService(); + + _logger = logginFactory!.CreateLogger(); + _scpServiceInternalLogger = logginFactory!.CreateLogger(); + _configuration = configuration; + } + + public override void ServiceStart() + { + var ScpPort = _configuration.Value.Dicom.Scp.ExternalAppPort; + try + { + _logger.AddingScpListener(ServiceName, ScpPort); + Server = DicomServerFactory.Create( + NetworkManager.IPv4Any, + ScpPort, + logger: _scpServiceInternalLogger, + userState: _associationDataProvider); + + Server.Options.IgnoreUnsupportedTransferSyntaxChange = true; + Server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; + Server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; + + if (Server.Exception != null) + { + _logger.ScpListenerInitializationFailure(); + throw Server.Exception; + } + + Status = ServiceStatus.Running; + _logger.ScpListeningOnPort(ServiceName, ScpPort); + } + catch (System.Exception ex) + { + Status = ServiceStatus.Cancelled; + _logger.ServiceFailedToStart(ServiceName, ex); + AppLifetime.StopApplication(); + } + + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs new file mode 100755 index 000000000..8a41f2c54 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs @@ -0,0 +1,71 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Text; +using System.Threading.Tasks; +using FellowOakDicom.Network; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Logging; + + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + internal class ExternalAppScpServiceInternal : ScpServiceInternalBase + { + + private readonly DicomAssociationInfo _associationInfo; + private readonly ILogger _logger; + + public ExternalAppScpServiceInternal(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dicomServiceDependencies) + : base(stream, fallbackEncoding, logger, dicomServiceDependencies) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _associationInfo = new DicomAssociationInfo(); + } + public override async Task OnCStoreRequestAsync(DicomCStoreRequest request) + { + try + { + _logger?.TransferSyntaxUsed(request.TransferSyntax); + var payloadId = await AssociationDataProvider!.HandleCStoreRequest(request, Association.CalledAE, Association.CallingAE, AssociationId, Common.ScpInputTypeEnum.ExternalAppReturn).ConfigureAwait(false); + _associationInfo.FileReceived(payloadId); + return new DicomCStoreResponse(request, DicomStatus.Success); + } + catch (InsufficientStorageAvailableException ex) + { + _logger?.CStoreFailedDueToLowStorageSpace(ex); + _associationInfo.Errors = $"Failed to store file due to low disk space: {ex}"; + return new DicomCStoreResponse(request, DicomStatus.ResourceLimitation); + } + catch (System.IO.IOException ex) when ((ex.HResult & 0xFFFF) == Constants.ERROR_HANDLE_DISK_FULL || (ex.HResult & 0xFFFF) == Constants.ERROR_DISK_FULL) + { + _logger?.CStoreFailedWithNoSpace(ex); + _associationInfo.Errors = $"Failed to store file due to low disk space: {ex}"; + return new DicomCStoreResponse(request, DicomStatus.StorageStorageOutOfResources); + } + catch (Exception ex) + { + _logger?.CStoreFailed(ex); + _associationInfo.Errors = $"Failed to store file: {ex}"; + return new DicomCStoreResponse(request, DicomStatus.ProcessingFailure); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs old mode 100644 new mode 100755 index 0d3c5ed2d..f82e2d08e --- a/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs @@ -17,9 +17,10 @@ using System; using System.Threading.Tasks; using FellowOakDicom.Network; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common; namespace Monai.Deploy.InformaticsGateway.Services.Scp { @@ -27,6 +28,6 @@ internal interface IApplicationEntityHandler { void Configure(MonaiApplicationEntity monaiApplicationEntity, DicomJsonOptions dicomJsonOptions, bool validateDicomValuesOnJsonSerialization); - Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids); + Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids, ScpInputTypeEnum type); } } diff --git a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs old mode 100644 new mode 100755 index 7c42996c5..d8c224a04 --- a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs @@ -20,6 +20,7 @@ using FellowOakDicom.Network; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common; namespace Monai.Deploy.InformaticsGateway.Services.Scp { @@ -35,7 +36,7 @@ public interface IApplicationEntityManager /// Called AE Title to be associated with the call. /// Calling AE Title to be associated with the call. /// Unique association ID. - Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId); + Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type = ScpInputTypeEnum.WorkflowTrigger); /// /// Checks if a MONAI AET is configured. diff --git a/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs b/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs old mode 100644 new mode 100755 index 2de4fccb8..adf544c61 --- a/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs +++ b/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs @@ -16,7 +16,7 @@ */ using System; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Services.Scp { diff --git a/src/InformaticsGateway/Services/Scp/ScpService.cs b/src/InformaticsGateway/Services/Scp/ScpService.cs old mode 100644 new mode 100755 index aae6f5db6..85c755b4a --- a/src/InformaticsGateway/Services/Scp/ScpService.cs +++ b/src/InformaticsGateway/Services/Scp/ScpService.cs @@ -1,6 +1,5 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * Copyright 2019-2021 NVIDIA Corporation +/* + * Copyright 2021-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,45 +14,28 @@ * limitations under the License. */ -using System; -using System.Threading; -using System.Threading.Tasks; using Ardalis.GuardClauses; -using FellowOakDicom; -using FellowOakDicom.Network; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Services.Common; - -using FoDicomNetwork = FellowOakDicom.Network; namespace Monai.Deploy.InformaticsGateway.Services.Scp { - internal sealed class ScpService : IHostedService, IDisposable, IMonaiService + internal class ScpService : ScpServiceBase { -#pragma warning disable S2223 // Non-constant static fields should not be visible - public static int ActiveConnections = 0; -#pragma warning restore S2223 // Non-constant static fields should not be visible - private readonly IServiceScope _serviceScope; - private readonly IApplicationEntityManager _associationDataProvider; private readonly ILogger _logger; - private readonly ILogger _scpServiceInternalLogger; - private readonly IHostApplicationLifetime _appLifetime; private readonly IOptions _configuration; - private FoDicomNetwork.IDicomServer? _server; - public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; - public string ServiceName => "DICOM SCP Service"; + + public override string ServiceName => "DICOM SCP Service"; public ScpService(IServiceScopeFactory serviceScopeFactory, IApplicationEntityManager applicationEntityManager, IHostApplicationLifetime appLifetime, - IOptions configuration) + IOptions configuration) : base(serviceScopeFactory, applicationEntityManager, appLifetime, configuration) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(applicationEntityManager, nameof(applicationEntityManager)); @@ -61,66 +43,16 @@ public ScpService(IServiceScopeFactory serviceScopeFactory, Guard.Against.Null(configuration, nameof(configuration)); _serviceScope = serviceScopeFactory.CreateScope(); - _associationDataProvider = applicationEntityManager; - var logginFactory = _serviceScope.ServiceProvider.GetService(); _logger = logginFactory!.CreateLogger(); - _scpServiceInternalLogger = logginFactory!.CreateLogger(); - _appLifetime = appLifetime; _configuration = configuration; - _ = DicomDictionary.Default; - } - - public void Dispose() - { - _serviceScope.Dispose(); - _server?.Dispose(); - GC.SuppressFinalize(this); - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.ScpServiceLoading(_configuration.Value.Dicom.Scp.Port); - - try - { - _logger.ServiceStarting(ServiceName); - _server = DicomServerFactory.Create( - NetworkManager.IPv4Any, - _configuration.Value.Dicom.Scp.Port, - logger: _scpServiceInternalLogger, - userState: _associationDataProvider); - - _server.Options.IgnoreUnsupportedTransferSyntaxChange = true; - _server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; - _server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; - - if (_server.Exception != null) - { - _logger.ScpListenerInitializationFailure(); - throw _server.Exception; - } - - Status = ServiceStatus.Running; - _logger.ScpListeningOnPort(_configuration.Value.Dicom.Scp.Port); - } - catch (System.Exception ex) - { - Status = ServiceStatus.Cancelled; - _logger.ServiceFailedToStart(ServiceName, ex); - _appLifetime.StopApplication(); - } - return Task.CompletedTask; } - public Task StopAsync(CancellationToken cancellationToken) + public override void ServiceStart() { - _logger.ServiceStopping(ServiceName); - _server?.Stop(); - _server?.Dispose(); - Status = ServiceStatus.Stopped; - return Task.CompletedTask; + _logger.AddingScpListener(ServiceName, _configuration.Value.Dicom.Scp.Port); + ServiceStartBase(_configuration.Value.Dicom.Scp.Port); } } } diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs b/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs new file mode 100755 index 000000000..832ebec13 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs @@ -0,0 +1,131 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; + +using FoDicomNetwork = FellowOakDicom.Network; + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + internal abstract class ScpServiceBase : IHostedService, IDisposable, IMonaiService + { +#pragma warning disable S2223 // Non-constant static fields should not be visible + public static int ActiveConnections = 0; +#pragma warning restore S2223 // Non-constant static fields should not be visible + + private readonly IServiceScope _serviceScope; + private readonly IApplicationEntityManager _associationDataProvider; + private readonly ILogger _logger; + private readonly ILogger _scpServiceInternalLogger; + protected readonly IHostApplicationLifetime AppLifetime; + private readonly IOptions _configuration; + protected FoDicomNetwork.IDicomServer? Server; + public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; + public abstract string ServiceName { get; } + + public ScpServiceBase(IServiceScopeFactory serviceScopeFactory, + IApplicationEntityManager applicationEntityManager, + IHostApplicationLifetime appLifetime, + IOptions configuration) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(applicationEntityManager, nameof(applicationEntityManager)); + Guard.Against.Null(appLifetime, nameof(appLifetime)); + Guard.Against.Null(configuration, nameof(configuration)); + + _serviceScope = serviceScopeFactory.CreateScope(); + + var logginFactory = _serviceScope.ServiceProvider.GetService(); + + _logger = logginFactory!.CreateLogger(); + _scpServiceInternalLogger = logginFactory!.CreateLogger(); + _associationDataProvider = applicationEntityManager; + AppLifetime = appLifetime; + _configuration = configuration; + _ = DicomDictionary.Default; + } + + public void Dispose() + { + _serviceScope.Dispose(); + Server?.Dispose(); + GC.SuppressFinalize(this); + } + + public Task StartAsync(CancellationToken cancellationToken) + { + ServiceStart(); + return Task.CompletedTask; + } + + public abstract void ServiceStart(); + + public Task StopAsync(CancellationToken cancellationToken) + { + _logger.ServiceStopping(ServiceName); + Server?.Stop(); + Server?.Dispose(); + Status = ServiceStatus.Stopped; + return Task.CompletedTask; + } + + public void ServiceStartBase(int ScpPort) + { + try + { + _logger.ServiceStarting(ServiceName); + Server = DicomServerFactory.Create( + NetworkManager.IPv4Any, + ScpPort, + logger: _scpServiceInternalLogger, + userState: _associationDataProvider); + + Server.Options.IgnoreUnsupportedTransferSyntaxChange = true; + Server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; + Server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; + + if (Server.Exception != null) + { + _logger.ScpListenerInitializationFailure(); + throw Server.Exception; + } + + Status = ServiceStatus.Running; + _logger.ScpListeningOnPort(ServiceName, ScpPort); + } + catch (System.Exception ex) + { + Status = ServiceStatus.Cancelled; + _logger.ServiceFailedToStart(ServiceName, ex); + AppLifetime.StopApplication(); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs index 0ee55a106..a19ef3825 100755 --- a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs @@ -1,5 +1,5 @@ -/* - * Copyright 2021-2022 MONAI Consortium +/* + * Copyright 2021-2023 MONAI Consortium * Copyright 2019-2021 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,35 +16,26 @@ */ using System; -using System.Linq; using System.Text; -using System.Threading; using System.Threading.Tasks; -using FellowOakDicom; using FellowOakDicom.Network; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; -using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; namespace Monai.Deploy.InformaticsGateway.Services.Scp { - /// - /// A new instance of ScpServiceInternal is created for every new association. - /// - internal class ScpServiceInternal : - DicomService, - IDicomServiceProvider, - IDicomCEchoProvider, - IDicomCStoreProvider + internal class ScpServiceInternal : ScpServiceInternalBase { + + private readonly DicomAssociationInfo _associationInfo; private readonly ILogger _logger; - private IApplicationEntityManager? _associationDataProvider; - private IDisposable? _loggerScope; - private Guid _associationId; - private DateTimeOffset? _associationReceived; + //private IApplicationEntityManager? _associationDataProvider; + //private IDisposable? _loggerScope; + //private Guid _associationId; + //private DateTimeOffset? _associationReceived; public ScpServiceInternal(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dicomServiceDependencies) : base(stream, fallbackEncoding, logger, dicomServiceDependencies) @@ -52,42 +43,12 @@ public ScpServiceInternal(INetworkStream stream, Encoding fallbackEncoding, ILog _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _associationInfo = new DicomAssociationInfo(); } - - public Task OnCEchoRequestAsync(DicomCEchoRequest request) - { - _logger?.CEchoReceived(); - return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success)); - } - - public void OnConnectionClosed(Exception exception) - { - if (exception != null) - { - _logger?.ConnectionClosedWithException(exception); - } - - _loggerScope?.Dispose(); - Interlocked.Decrement(ref ScpService.ActiveConnections); - - try - { - var repo = _associationDataProvider!.GetService(); - _associationInfo.Disconnect(); - repo?.AddAsync(_associationInfo).Wait(); - _logger?.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); - } - catch (Exception ex) - { - _logger?.ErrorSavingDicomAssociationInfo(_associationId, ex); - } - } - - public async Task OnCStoreRequestAsync(DicomCStoreRequest request) + public override async Task OnCStoreRequestAsync(DicomCStoreRequest request) { try { _logger?.TransferSyntaxUsed(request.TransferSyntax); - var payloadId = await _associationDataProvider!.HandleCStoreRequest(request, Association.CalledAE, Association.CallingAE, _associationId).ConfigureAwait(false); + var payloadId = await AssociationDataProvider!.HandleCStoreRequest(request, Association.CalledAE, Association.CallingAE, AssociationId, Common.ScpInputTypeEnum.WorkflowTrigger).ConfigureAwait(false); _associationInfo.FileReceived(payloadId); return new DicomCStoreResponse(request, DicomStatus.Success); } @@ -111,123 +72,5 @@ public async Task OnCStoreRequestAsync(DicomCStoreRequest r } } - public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e) - { - _logger?.CStoreFailed(e); - _associationInfo.Errors = $"Failed to store file: {e}"; - return Task.CompletedTask; - } - - public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason) - { - _logger?.CStoreAbort(source, reason); - _associationInfo.Errors = $"{source} - {reason}"; - } - - /// - /// Start timer only if a receive association release request is received. - /// - /// - public Task OnReceiveAssociationReleaseRequestAsync() - { - var associationElapsed = TimeSpan.Zero; - if (_associationReceived.HasValue) - { - associationElapsed = DateTimeOffset.UtcNow.Subtract(_associationReceived.Value); - } - - _logger?.CStoreAssociationReleaseRequest(associationElapsed); - return SendAssociationReleaseResponseAsync(); - } - - public async Task OnReceiveAssociationRequestAsync(DicomAssociation association) - { - Interlocked.Increment(ref ScpService.ActiveConnections); - _associationReceived = DateTimeOffset.UtcNow; - _associationDataProvider = (UserState as IApplicationEntityManager)!; - - if (_associationDataProvider is null) - { - _associationInfo.Errors = $"Internal error: association data provider not found."; - throw new ServiceException($"{nameof(UserState)} must be an instance of IAssociationDataProvider"); - } - - _associationId = Guid.NewGuid(); - var associationIdStr = $"#{_associationId} {association.RemoteHost}:{association.RemotePort}"; - - _loggerScope = _logger!.BeginScope(new LoggingDataDictionary { { "Association", associationIdStr } }); - _logger.CStoreAssociationReceived(association.RemoteHost, association.RemotePort); - - _associationInfo.CallingAeTitle = association.CallingAE; - _associationInfo.CalledAeTitle = association.CalledAE; - _associationInfo.RemoteHost = association.RemoteHost; - _associationInfo.RemotePort = association.RemotePort; - _associationInfo.CorrelationId = _associationId.ToString(); - - if (!await IsValidSourceAeAsync(association.CallingAE, association.RemoteHost).ConfigureAwait(false)) - { - _associationInfo.Errors = $"Invalid source. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.CallingAENotRecognized).ConfigureAwait(false); - } - - if (!await IsValidCalledAeAsync(association.CalledAE).ConfigureAwait(false)) - { - _associationInfo.Errors = "Invalid MONAI AE Title. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.CalledAENotRecognized).ConfigureAwait(false); - } - - foreach (var pc in association.PresentationContexts) - { - if (pc.AbstractSyntax == DicomUID.Verification) - { - if (!_associationDataProvider.Configuration.Value.Dicom.Scp.EnableVerification) - { - _associationInfo.Errors = "Verification service disabled. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - _logger?.VerificationServiceDisabled(); - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.ApplicationContextNotSupported - ).ConfigureAwait(false); - } - pc.AcceptTransferSyntaxes(_associationDataProvider.Configuration.Value.Dicom.Scp.VerificationServiceTransferSyntaxes.ToDicomTransferSyntaxArray()); - } - else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None) - { - if (!_associationDataProvider.CanStore) - { - _associationInfo.Errors = "Disk pressure. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.NoReasonGiven).ConfigureAwait(false); - } - // Accept any proposed TS - pc.AcceptTransferSyntaxes(pc.GetTransferSyntaxes().ToArray()); - } - } - - await SendAssociationAcceptAsync(association).ConfigureAwait(false); - } - - private async Task IsValidCalledAeAsync(string calledAe) - { - return await _associationDataProvider!.IsAeTitleConfiguredAsync(calledAe).ConfigureAwait(false); - } - - private async Task IsValidSourceAeAsync(string callingAe, string host) - { - if (!_associationDataProvider!.Configuration.Value.Dicom.Scp.RejectUnknownSources) return true; - - return await _associationDataProvider.IsValidSourceAsync(callingAe, host).ConfigureAwait(false); - } } } diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs new file mode 100755 index 000000000..3548aaaf4 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs @@ -0,0 +1,207 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + /// + /// A new instance of ScpServiceInternal is created for every new association. + /// + internal abstract class ScpServiceInternalBase : + DicomService, + IDicomServiceProvider, + IDicomCEchoProvider, + IDicomCStoreProvider + { + private readonly DicomAssociationInfo _associationInfo; + private readonly ILogger _logger; + protected IApplicationEntityManager? AssociationDataProvider; + private IDisposable? _loggerScope; + protected Guid AssociationId; + private DateTimeOffset? _associationReceived; + + public ScpServiceInternalBase(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dicomServiceDependencies) + : base(stream, fallbackEncoding, logger, dicomServiceDependencies) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _associationInfo = new DicomAssociationInfo(); + } + + public Task OnCEchoRequestAsync(DicomCEchoRequest request) + { + _logger?.CEchoReceived(); + return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success)); + } + + public void OnConnectionClosed(Exception exception) + { + if (exception != null) + { + _logger?.ConnectionClosedWithException(exception); + } + + _loggerScope?.Dispose(); + Interlocked.Decrement(ref ScpServiceBase.ActiveConnections); + + try + { + var repo = AssociationDataProvider!.GetService(); + _associationInfo.Disconnect(); + repo?.AddAsync(_associationInfo).Wait(); + _logger?.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); + } + catch (Exception ex) + { + _logger?.ErrorSavingDicomAssociationInfo(AssociationId, ex); + } + } + + public abstract Task OnCStoreRequestAsync(DicomCStoreRequest request); + + public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e) + { + _logger?.CStoreFailed(e); + _associationInfo.Errors = $"Failed to store file: {e}"; + return Task.CompletedTask; + } + + public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason) + { + _logger?.CStoreAbort(source, reason); + _associationInfo.Errors = $"{source} - {reason}"; + } + + /// + /// Start timer only if a receive association release request is received. + /// + /// + public Task OnReceiveAssociationReleaseRequestAsync() + { + var associationElapsed = TimeSpan.Zero; + if (_associationReceived.HasValue) + { + associationElapsed = DateTimeOffset.UtcNow.Subtract(_associationReceived.Value); + } + + _logger?.CStoreAssociationReleaseRequest(associationElapsed); + return SendAssociationReleaseResponseAsync(); + } + + public async Task OnReceiveAssociationRequestAsync(DicomAssociation association) + { + Interlocked.Increment(ref ScpServiceBase.ActiveConnections); + _associationReceived = DateTimeOffset.UtcNow; + AssociationDataProvider = (UserState as IApplicationEntityManager)!; + + if (AssociationDataProvider is null) + { + _associationInfo.Errors = $"Internal error: association data provider not found."; + throw new ServiceException($"{nameof(UserState)} must be an instance of IAssociationDataProvider"); + } + + AssociationId = Guid.NewGuid(); + var associationIdStr = $"#{AssociationId} {association.RemoteHost}:{association.RemotePort}"; + + _loggerScope = _logger!.BeginScope(new LoggingDataDictionary { { "Association", associationIdStr } }); + _logger.CStoreAssociationReceived(association.RemoteHost, association.RemotePort); + + _associationInfo.CallingAeTitle = association.CallingAE; + _associationInfo.CalledAeTitle = association.CalledAE; + _associationInfo.RemoteHost = association.RemoteHost; + _associationInfo.RemotePort = association.RemotePort; + _associationInfo.CorrelationId = AssociationId.ToString(); + + if (!await IsValidSourceAeAsync(association.CallingAE, association.RemoteHost).ConfigureAwait(false)) + { + _associationInfo.Errors = $"Invalid source. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.CallingAENotRecognized).ConfigureAwait(false); + } + + if (!await IsValidCalledAeAsync(association.CalledAE).ConfigureAwait(false)) + { + _associationInfo.Errors = "Invalid MONAI AE Title. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.CalledAENotRecognized).ConfigureAwait(false); + } + + foreach (var pc in association.PresentationContexts) + { + if (pc.AbstractSyntax == DicomUID.Verification) + { + if (!AssociationDataProvider.Configuration.Value.Dicom.Scp.EnableVerification) + { + _associationInfo.Errors = "Verification service disabled. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + _logger?.VerificationServiceDisabled(); + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.ApplicationContextNotSupported + ).ConfigureAwait(false); + } + pc.AcceptTransferSyntaxes(AssociationDataProvider.Configuration.Value.Dicom.Scp.VerificationServiceTransferSyntaxes.ToDicomTransferSyntaxArray()); + } + else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None) + { + if (!AssociationDataProvider.CanStore) + { + _associationInfo.Errors = "Disk pressure. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.NoReasonGiven).ConfigureAwait(false); + } + // Accept any proposed TS + pc.AcceptTransferSyntaxes(pc.GetTransferSyntaxes().ToArray()); + } + } + + await SendAssociationAcceptAsync(association).ConfigureAwait(false); + } + + private async Task IsValidCalledAeAsync(string calledAe) + { + return await AssociationDataProvider!.IsAeTitleConfiguredAsync(calledAe).ConfigureAwait(false); + } + + private async Task IsValidSourceAeAsync(string callingAe, string host) + { + if (!AssociationDataProvider!.Configuration.Value.Dicom.Scp.RejectUnknownSources) return true; + + return await AssociationDataProvider.IsValidSourceAsync(callingAe, host).ConfigureAwait(false); + } + } +} diff --git a/src/InformaticsGateway/Services/Scu/ScuService.cs b/src/InformaticsGateway/Services/Scu/ScuService.cs index 809f12cfa..1833955d7 100755 --- a/src/InformaticsGateway/Services/Scu/ScuService.cs +++ b/src/InformaticsGateway/Services/Scu/ScuService.cs @@ -205,7 +205,6 @@ public Task StartAsync(CancellationToken cancellationToken) }, CancellationToken.None); Status = ServiceStatus.Running; - _logger.ServiceRunning(ServiceName); if (task.IsCompleted) return task; return Task.CompletedTask; diff --git a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs old mode 100644 new mode 100755 index 9a219f185..49d894728 --- a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs +++ b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs @@ -167,7 +167,7 @@ private async Task ProcessObject(int thread, FileStorageMetadata blob) catch (Exception ex) { blob.SetFailed(); - _logger.FailedToUploadFile(blob.Id, ex); + _logger.FailedToUploadFile(blob.Id, blob.File.UploadPath, ex); } finally { @@ -256,7 +256,7 @@ await _storageService.PutObjectAsync( metadata, cancellationToken).ConfigureAwait(false); storageObjectMetadata.SetUploaded(_configuration.Value.Storage.TemporaryStorageBucket); // deletes local file and sets uploaded to true - _logger.UploadedFileToStoreage(storageObjectMetadata.TemporaryPath); + _logger.UploadedFileToStoreage(path); storageObjectMetadata.SetMoved(_configuration.Value.Storage.StorageServiceBucketName); // set bucket, date moved, and move complete }) .ConfigureAwait(false); diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj index 9680120d1..0f1df6ef4 100755 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -36,6 +36,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs b/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs old mode 100644 new mode 100755 index 61640d386..d26a9ccf1 --- a/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs +++ b/src/InformaticsGateway/Test/Plug-ins/TestInputDataPlugIns.cs @@ -62,6 +62,8 @@ public class TestInputDataPlugInModifyDicomFile : IInputDataPlugIn public Task<(DicomFile dicomFile, FileStorageMetadata fileMetadata)> ExecuteAsync(DicomFile dicomFile, FileStorageMetadata fileMetadata) { dicomFile.Dataset.Add(ExpectedTag, ExpectedValue); + fileMetadata.WorkflowInstanceId = "WorkflowInstanceId"; + fileMetadata.TaskId = "TaskId"; return Task.FromResult((dicomFile, fileMetadata)); } } diff --git a/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs b/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs old mode 100644 new mode 100755 index 171e7c3d6..8a95ca525 --- a/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs +++ b/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs @@ -16,7 +16,7 @@ using System.Reflection; using FellowOakDicom; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; namespace Monai.Deploy.InformaticsGateway.Test.PlugIns diff --git a/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs b/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs old mode 100644 new mode 100755 index 012425de7..d459bddb7 --- a/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs +++ b/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs @@ -49,11 +49,13 @@ public void GetMonaiServices() items => items.ServiceName.Equals("DataRetrievalService"), items => items.ServiceName.Equals("ScpService"), items => items.ServiceName.Equals("ScuService"), + items => items.ServiceName.Equals("ExtAppScuService"), items => items.ServiceName.Equals("SpaceReclaimerService"), items => items.ServiceName.Equals("DicomWebExportService"), items => items.ServiceName.Equals("ScuExportService"), items => items.ServiceName.Equals("PayloadNotificationService"), - items => items.ServiceName.Equals("HL7 Service")); + items => items.ServiceName.Equals("HL7 Service"), + items => items.ServiceName.Equals("ExtAppScuExportService")); } [Fact(DisplayName = "GetServiceStatus")] @@ -62,7 +64,7 @@ public void GetServiceStatus() var serviceLocator = new MonaiServiceLocator(_serviceProvider.Object); var result = serviceLocator.GetServiceStatus(); - Assert.Equal(8, result.Count); + Assert.Equal(10, result.Count); foreach (var svc in result.Keys) { Assert.Equal(ServiceStatus.Running, result[svc]); diff --git a/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs old mode 100644 new mode 100755 index 90595f2ff..faee1ca97 --- a/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs @@ -21,7 +21,7 @@ using FellowOakDicom; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Test.PlugIns; diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs index b23c95e67..788031117 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs @@ -196,5 +196,62 @@ public async Task GivenAPayload_WhenMessageIsPublished_ExpectPayloadToBeDeleted( _messageBrokerPublisherService.Verify(p => p.Publish(It.IsAny(), It.IsAny()), Times.AtLeastOnce()); _repository.Verify(p => p.RemoveAsync(payload, _cancellationTokenSource.Token), Times.AtLeastOnce()); } + + [Fact] + public async Task GivenAPayload_ExpectMessageIsPublished() + { + var notifyAction = new ActionBlock(payload => + { + }); + + var correlationId = Guid.NewGuid(); + var payload = new Payload("key", correlationId.ToString(), Guid.NewGuid().ToString(), null, new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 0) + { + RetryCount = 3, + State = Payload.PayloadState.Notify, + Files = new List + { + new DicomFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Messaging.Events.DataService.DIMSE, "calling", "called"), + new FhirFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Api.Rest.FhirStorageFormat.Json, Messaging.Events.DataService.FHIR, "origin"), + }, + }; + + var handler = new PayloadNotificationActionHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var defaultKeys = new MessageBrokerConfigurationKeys(); + + await handler.NotifyAsync(payload, notifyAction, _cancellationTokenSource.Token); + + _messageBrokerPublisherService.Verify(p => p.Publish(defaultKeys.WorkflowRequest, It.IsAny()), Times.AtLeastOnce()); + } + + [Fact] + public async Task GivenAPayload_WithExternalAppSet_ExpectMessageIsPublished() + { + var notifyAction = new ActionBlock(payload => + { + }); + + var correlationId = Guid.NewGuid(); + var payload = new Payload("key", correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 0) + { + RetryCount = 3, + State = Payload.PayloadState.Notify, + Files = new List + { + new DicomFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Messaging.Events.DataService.DIMSE, "calling", "called"), + new FhirFileStorageMetadata(correlationId.ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Api.Rest.FhirStorageFormat.Json, Messaging.Events.DataService.FHIR, "origin"), + }, + WorkflowInstanceId = "WorkflowInstanceId", + TaskId = "TaskId" + }; + + + var handler = new PayloadNotificationActionHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var defaultKeys = new MessageBrokerConfigurationKeys(); + + await handler.NotifyAsync(payload, notifyAction, _cancellationTokenSource.Token); + + _messageBrokerPublisherService.Verify(p => p.Publish(defaultKeys.ArtifactRecieved, It.IsAny()), Times.AtLeastOnce()); + } } } diff --git a/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs index 97db11eda..83e4c2036 100755 --- a/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs @@ -28,7 +28,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs b/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs index bc80f36c5..e076e06e8 100755 --- a/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs @@ -20,11 +20,13 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Export; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -54,8 +56,9 @@ public class TestExportService : ExportServiceBase public TestExportService( ILogger logger, IOptions InformaticsGatewayConfiguration, - IServiceScopeFactory serviceScopeFactory) - : base(logger, InformaticsGatewayConfiguration, serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory, + IDicomToolkit _dicomToolkit) + : base(logger, InformaticsGatewayConfiguration, serviceScopeFactory, _dicomToolkit) { } @@ -70,6 +73,38 @@ protected override Task ExportDataBlockCallback(Export return Task.FromResult(exportRequestData); } + + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var exportRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) + { + return; + } + + exportRequest.MessageId = eventArgs.Message.MessageId; + exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + + ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + } + } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + + } } public class ExportServiceBaseTest @@ -83,6 +118,7 @@ public class ExportServiceBaseTest private readonly IOptions _configuration; private readonly CancellationTokenSource _cancellationTokenSource; private readonly Mock _serviceScopeFactory; + private readonly Mock _dicomToolkit = new Mock(); public ExportServiceBaseTest() { @@ -121,7 +157,7 @@ public ExportServiceBaseTest() [RetryFact(5, 250, DisplayName = "Data flow test - can start/stop")] public async Task DataflowTest_StartStop() { - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); await service.StartAsync(_cancellationTokenSource.Token); await StopAndVerify(service); @@ -145,7 +181,7 @@ public async Task DataflowTest_RejectOnInsufficientStorageSpace() messageReceivedCallback(CreateMessageReceivedEventArgs()); }); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); await service.StartAsync(_cancellationTokenSource.Token); await StopAndVerify(service); @@ -178,7 +214,7 @@ public async Task DataflowTest_PayloadDownlaodFailure() .ThrowsAsync(new Exception("storage error")); var countdownEvent = new CountdownEvent(1); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); service.ReportActionCompleted += (sender, e) => { countdownEvent.Signal(); @@ -224,7 +260,7 @@ public async Task DataflowTest_EndToEnd_WithPartialFailure() .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(testData))); var countdownEvent = new CountdownEvent(5 * 3); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); service.ReportActionCompleted += (sender, e) => { countdownEvent.Signal(); @@ -238,7 +274,7 @@ public async Task DataflowTest_EndToEnd_WithPartialFailure() countdownEvent.Signal(); }; await service.StartAsync(_cancellationTokenSource.Token); - Assert.True(countdownEvent.Wait(1000000)); + Assert.True(countdownEvent.Wait(60000)); await StopAndVerify(service); _messagePublisherService.Verify( @@ -278,7 +314,7 @@ public async Task DataflowTest_EndToEnd() .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(testData))); var countdownEvent = new CountdownEvent(5 * 3); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); service.ReportActionCompleted += (sender, e) => { countdownEvent.Signal(); @@ -290,7 +326,7 @@ public async Task DataflowTest_EndToEnd() countdownEvent.Signal(); }; await service.StartAsync(_cancellationTokenSource.Token); - Assert.True(countdownEvent.Wait(1000000)); + Assert.True(countdownEvent.Wait(60000)); await StopAndVerify(service); _messagePublisherService.Verify( diff --git a/src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs new file mode 100755 index 000000000..689699ba6 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs @@ -0,0 +1,595 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Export; +using Monai.Deploy.InformaticsGateway.Services.Storage; +using Monai.Deploy.InformaticsGateway.SharedTest; +using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Storage.API; +using Moq; +using xRetry; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Export +{ + [Collection("SCP Listener")] + public class ExtAppScuServiceTest + { + private readonly Mock _storageService; + private readonly Mock _messageSubscriberService; + private readonly Mock _messagePublisherService; + private readonly Mock _outputDataPlugInEngine; + private readonly Mock> _logger; + private readonly Mock _extAppScpLogger; + private readonly Mock _serviceScopeFactory; + private readonly IOptions _configuration; + private readonly Mock _dicomToolkit; + private readonly Mock _repository; + private readonly Mock _storageInfoProvider; + private readonly Mock _externalAppRepository = new Mock(); + + private readonly CancellationTokenSource _cancellationTokenSource; + private readonly DicomScpFixture _dicomScp; + private readonly int _port = 1104; + + public ExtAppScuServiceTest(DicomScpFixture dicomScp) + { + _dicomScp = dicomScp ?? throw new ArgumentNullException(nameof(dicomScp)); + + _storageService = new Mock(); + _messageSubscriberService = new Mock(); + _messagePublisherService = new Mock(); + _outputDataPlugInEngine = new Mock(); + _logger = new Mock>(); + _extAppScpLogger = new Mock(); + _serviceScopeFactory = new Mock(); + _configuration = Options.Create(new InformaticsGatewayConfiguration()); + _dicomToolkit = new Mock(); + _cancellationTokenSource = new CancellationTokenSource(); + _repository = new Mock(); + _storageInfoProvider = new Mock(); + + var services = new ServiceCollection(); + services.AddScoped(p => _repository.Object); + services.AddScoped(p => _messagePublisherService.Object); + services.AddScoped(p => _messageSubscriberService.Object); + services.AddScoped(p => _outputDataPlugInEngine.Object); + services.AddScoped(p => _storageService.Object); + services.AddScoped(p => _storageInfoProvider.Object); + + var serviceProvider = services.BuildServiceProvider(); + + var scope = new Mock(); + scope.Setup(x => x.ServiceProvider).Returns(serviceProvider); + + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(scope.Object); + DicomScpFixture.Logger = _extAppScpLogger.Object; + _dicomScp.Start(_port); + _configuration.Value.Export.Retries.DelaysMilliseconds = new[] { 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + _storageInfoProvider.Setup(p => p.HasSpaceAvailableForExport).Returns(true); + + _outputDataPlugInEngine.Setup(p => p.Configure(It.IsAny>())); + _outputDataPlugInEngine.Setup(p => p.ExecutePlugInsAsync(It.IsAny())) + .Returns((ExportRequestDataMessage message) => Task.FromResult(message)); + + _externalAppRepository.Setup(r => r.GetAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult>(null)); + + var seriesInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var testDicom = InstanceGenerator.GenerateDicomFile(seriesInstanceUid: seriesInstanceUid); + _dicomToolkit.Setup(d => d.Load(It.IsAny())).Returns(testDicom); + } + + [RetryFact(5, 250, DisplayName = "Constructor - throws on null params")] + public void Constructor_ThrowsOnNullParams() + { + Assert.Throws(() => new ExtAppScuExportService(null, null, null, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, null, null, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, null, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, null)); + } + + [RetryFact(10, 250, DisplayName = "When no destination is defined")] + public async Task ShallFailWhenNoDestinationIsDefined() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs(string.Empty)); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Export task does not have destination set.", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "When destination is not configured")] + public async Task ShallFailWhenDestinationIsNotConfigured() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(DestinationApplicationEntity)); + + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging($"Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); + } + + [RetryFact(1, 250, DisplayName = "Association rejected")] + public async Task AssociationRejected() + { + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = "ABC", Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + + await StopAndVerify(service); + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging($"Association rejected.", LogLevel.Warning, Times.AtLeastOnce()); + _logger.VerifyLoggingMessageBeginsWith($"Association rejected with reason", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "C-STORE simulate abort")] + public async Task SimulateAbort() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = "ABORT", Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.ResourceLimitation; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + + await StopAndVerify(service); + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLoggingMessageBeginsWith($"Association aborted with reason", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "C-STORE Failure")] + public async Task CStoreFailure() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.ResourceLimitation; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Association accepted.", LogLevel.Information, Times.Once()); + _logger.VerifyLogging($"Failed to export with error {DicomStatus.ResourceLimitation}.", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "Failed to load DICOM content")] + public async Task ErrorLoadingDicomContent() + { + + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Throws(new Exception("error")); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.UnsupportedDataType))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLoggingMessageBeginsWith("Error reading DICOM file: error", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "Unreachable Server")] + public async Task UnreachableServer() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "UNKNOWNHOST123456789", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(8000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLoggingMessageBeginsWith("Association aborted with error", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "C-STORE success")] + public async Task ExportCompletes() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Success, FileExportStatus.Success))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Association accepted.", LogLevel.Information, Times.Once()); + _logger.VerifyLogging($"Instance sent successfully.", LogLevel.Information, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "success save ExternalAppDetails")] + public async Task SaveExternalAppDetails() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _externalAppRepository.Verify(r => r.AddAsync(It.IsAny(), It.IsAny()), Times.Once); + } + + private bool CheckMessage(Message message, ExportStatus exportStatus, FileExportStatus fileExportStatus) + { + Guard.Against.Null(message, nameof(message)); + + var exportEvent = message.ConvertTo(); + return exportEvent.Status == exportStatus && + exportEvent.FileStatuses.First().Value == fileExportStatus; + } + + private static MessageReceivedEventArgs CreateMessageReceivedEventArgs(string destination) + { + var exportRequestEvent = new ExternalAppRequestEvent + { + ExportTaskId = Guid.NewGuid().ToString(), + CorrelationId = Guid.NewGuid().ToString(), + Targets = new List { new DataOrigin { Destination = destination } }, + Files = new[] { "file1" }, + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = Guid.NewGuid().ToString(), + }; + var jsonMessage = new JsonMessage(exportRequestEvent, MessageBrokerConfiguration.InformaticsGatewayApplicationId, exportRequestEvent.CorrelationId, exportRequestEvent.DeliveryTag); + + return new MessageReceivedEventArgs(jsonMessage.ToMessage(), CancellationToken.None); + } + + private async Task StopAndVerify(ExtAppScuExportService service) + { + await service.StopAsync(_cancellationTokenSource.Token); + _logger.VerifyLogging($"{service.ServiceName} is stopping.", LogLevel.Information, Times.Once()); + await Task.Delay(500); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs index ad538c544..a832401aa 100755 --- a/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs @@ -27,7 +27,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; @@ -156,7 +156,7 @@ public async Task ShallFailWhenNoDestinationIsDefined() It.IsAny(), It.IsAny>(), It.IsAny()), Times.Once()); - _logger.VerifyLogging("SCU Export configuration error: Export task does not have destination set.", LogLevel.Error, Times.Once()); + _logger.VerifyLogging("Export task does not have destination set.", LogLevel.Error, Times.Once()); } [RetryFact(10, 250, DisplayName = "When destination is not configured")] @@ -202,7 +202,7 @@ public async Task ShallFailWhenDestinationIsNotConfigured() It.IsAny>(), It.IsAny()), Times.Once()); - _logger.VerifyLogging($"SCU Export configuration error: Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); + _logger.VerifyLogging($"Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); } [RetryFact(1, 250, DisplayName = "Association rejected")] diff --git a/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs old mode 100644 new mode 100755 index f57600a94..297c7362a --- a/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs @@ -27,7 +27,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; diff --git a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs old mode 100644 new mode 100755 index 1558ec691..89bfc3e7d --- a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs @@ -22,7 +22,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; diff --git a/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs new file mode 100644 index 000000000..38d1bc89a --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs @@ -0,0 +1,322 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Http; +using Moq; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Http +{ + public class Hl7ApplicationConfigControllerTest + { + private readonly Mock> _logger; + private readonly Mock _loggerFactory; + private readonly Hl7ApplicationConfigController _controller; + private readonly Mock _repo; + + public Hl7ApplicationConfigControllerTest() + { + _loggerFactory = new Mock(); + _logger = new Mock>(); + _repo = new Mock(); + _loggerFactory.Setup(p => p.CreateLogger(It.IsAny())).Returns(_logger.Object); + + _controller = new Hl7ApplicationConfigController( + _logger.Object, _repo.Object); + } + + private static Hl7ApplicationConfigEntity ValidApplicationEntity(string dicomStr) + { + var validApplicationEntity = new Hl7ApplicationConfigEntity() + { + Id = Guid.Empty, + DataLink = KeyValuePair.Create("testKey", DataLinkType.PatientId), + DataMapping = new() { KeyValuePair.Create("datamapkey", dicomStr) }, + SendingId = KeyValuePair.Create("sendingidkey", "sendingidvalue"), + DateTimeCreated = DateTime.UtcNow + }; + return validApplicationEntity; + } + + #region GET Tests + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsOK() + { + _repo.Setup(r => r.GetAllAsync(It.IsAny())) + .ReturnsAsync(new List()); + var result = await _controller.Get(); + + var okResult = Assert.IsType(result); + var response = Assert.IsType>(okResult.Value); + Assert.Empty(response); + } + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsNotFound() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Get("test"); + + Assert.IsType(result); + } + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsOK2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Get("test"); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + #endregion + + #region DELETE Tests + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsNotFound() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Delete("test"); + + Assert.IsType(result); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsOK() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Delete("test"); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsInternalServerError() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Delete("test"); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsInternalServerError2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .Throws(new Exception()); + var result = await _controller.Delete("test"); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + + #region PUT Tests + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsOK() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Put(validApplicationEntity); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsBadRequest() + { + var result = await _controller.Put(null!); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsBadRequest2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Put(new Hl7ApplicationConfigEntity()); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsInternalServerError() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Put(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + + #region POST Tests + + [Theory] + [InlineData("(0001,0001)")] + [InlineData("0001,0001")] + [InlineData("(FFFE,E0DD)")] + [InlineData("FFFE,E0DD")] + public async Task Post_GiveExpectedInput_ReturnsOK(string dicomStr) + { + var validApplicationEntity = ValidApplicationEntity(dicomStr); + + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Post(validApplicationEntity); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Theory] + [InlineData("(001,0001)")] + [InlineData("(0001,00x1")] + [InlineData("x001,0001)")] + [InlineData("00001,00001)")] + public async Task Post_GivenInvalidDicomValueInput_ReturnsBadRequest(string dicomStr) + { + //valid Hl7ApplicationEntity + var validApplicationEntity = new Hl7ApplicationConfigEntity() + { + Id = Guid.Empty, + DataLink = KeyValuePair.Create("testKey", DataLinkType.PatientId), + DataMapping = new() { KeyValuePair.Create("datamapkey", dicomStr) }, + SendingId = KeyValuePair.Create("sendingidkey", "sendingidvalue"), + DateTimeCreated = DateTime.UtcNow + }; + + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Post(validApplicationEntity); + + var objResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsBadRequest() + { + var result = await _controller.Post(null!); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsBadRequest2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Post(new Hl7ApplicationConfigEntity()); + + var objectResult = Assert.IsType(result); + + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError3() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError2() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .Throws(new Exception()); + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + } +} diff --git a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs old mode 100644 new mode 100755 index 5804056e5..1f2058d57 --- a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs @@ -27,7 +27,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; @@ -488,7 +488,6 @@ public async Task Update_ShallReturnBadRequestWithBadAeTitle() Assert.Equal($"'{aeTitle}' is not a valid AE Title (source: MonaiApplicationEntity).", problem.Detail); Assert.Equal((int)HttpStatusCode.BadRequest, problem.Status); } - #endregion Update #region Delete diff --git a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs old mode 100644 new mode 100755 index a5f4dd9f6..0bf0cff4c --- a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs @@ -24,11 +24,12 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -49,6 +50,7 @@ public class ApplicationEntityHandlerTest private readonly Mock _inputDataPlugInEngine; private readonly Mock _payloadAssembler; private readonly Mock _uploadQueue; + private readonly Mock _extAppDetailsRepo = new Mock(); private readonly IOptions _options; private readonly IFileSystem _fileSystem; private readonly IServiceProvider _serviceProvider; @@ -81,14 +83,15 @@ public ApplicationEntityHandlerTest() _options.Value.Storage.TemporaryDataStorage = TemporaryDataStorageLocation.Memory; } - [RetryFact(5, 250)] + [RetryFact(1, 250)] public void GivenAApplicationEntityHandler_WhenInitialized_ExpectParametersToBeValidated() { - Assert.Throws(() => new ApplicationEntityHandler(null, null, null)); - Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, null, null)); - Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, null)); + Assert.Throws(() => new ApplicationEntityHandler(null, null, null, null)); + Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, null, null, null)); + Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, null, null)); + Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, null)); - _ = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + _ = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); } [RetryFact(5, 250)] @@ -102,13 +105,18 @@ public async Task GivenAApplicationEntityHandler_WhenHandleInstanceAsyncIsCalled IgnoredSopClasses = new List { DicomUID.SecondaryCaptureImageStorage.UID } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); var request = GenerateRequest(); var dicomToolkit = new DicomToolkit(); var uids = dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - await Assert.ThrowsAsync(async () => await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids)); + await Assert.ThrowsAsync(async + () => await handler.HandleInstanceAsync(request, + aet.AeTitle, + "CALLING", + Guid.NewGuid(), + uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger)); } [RetryFact(5, 250)] @@ -122,14 +130,14 @@ public async Task GivenACStoreRequest_WhenTheSopClassIsInTheIgnoreList_ExpectIns IgnoredSopClasses = new List { DicomUID.SecondaryCaptureImageStorage.UID } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); var request = GenerateRequest(); var dicomToolkit = new DicomToolkit(); var uids = dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids); + await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Never()); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); @@ -146,14 +154,14 @@ public async Task GivenACStoreRequest_WhenTheSopClassIsNotInTheAllowedList_Expec AllowedSopClasses = new List { DicomUID.UltrasoundImageStorage.UID } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); var request = GenerateRequest(); var dicomToolkit = new DicomToolkit(); var uids = dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids); + await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Never()); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); @@ -170,7 +178,7 @@ public async Task GivenACStoreRequest_WhenHandleInstanceAsyncIsCalled_ExpectADic PlugInAssemblies = new List() { typeof(TestInputDataPlugInAddWorkflow).AssemblyQualifiedName } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); var request = GenerateRequest(); @@ -179,7 +187,7 @@ public async Task GivenACStoreRequest_WhenHandleInstanceAsyncIsCalled_ExpectADic _inputDataPlugInEngine.Setup(p => p.ExecutePlugInsAsync(It.IsAny(), It.IsAny())) .Returns((DicomFile dicomFile, FileStorageMetadata fileMetadata) => Task.FromResult(new Tuple(dicomFile, fileMetadata))); - await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids); + await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Once()); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); @@ -203,7 +211,7 @@ public void GivenAConfiguredAETitle_WhenConfiguringAgainWithDifferentAETitle_Exp Name = "TESTAET", Workflows = new List() { "AppA", "AppB", Guid.NewGuid().ToString() } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); newAet.AeTitle = "NewAETitle"; @@ -228,4 +236,4 @@ private static DicomCStoreRequest GenerateRequest() return new DicomCStoreRequest(file); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs old mode 100644 new mode 100755 index 8f90693bb..df9934201 --- a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs @@ -26,9 +26,11 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; @@ -108,7 +110,7 @@ public async Task HandleCStoreRequest_ShallThrowIfAENotConfigured() var request = GenerateRequest(); var exception = await Assert.ThrowsAsync(async () => { - await manager.HandleCStoreRequest(request, "BADAET", "CallingAET", Guid.NewGuid()); + await manager.HandleCStoreRequest(request, "BADAET", "CallingAET", Guid.NewGuid(), InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); }); Assert.Equal("Called AE Title 'BADAET' is not configured", exception.Message); @@ -138,7 +140,7 @@ public async Task HandleCStoreRequest_ThrowWhenOnLowStorageSpace() var request = GenerateRequest(); await Assert.ThrowsAsync(async () => { - await manager.HandleCStoreRequest(request, aet, "CallingAET", Guid.NewGuid()); + await manager.HandleCStoreRequest(request, aet, "CallingAET", Guid.NewGuid(), InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); }); _logger.VerifyLogging($"{aet} added to AE Title Manager.", LogLevel.Information, Times.Once()); @@ -297,7 +299,7 @@ public async Task ShallHandleCStoreRequest() Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); var request = GenerateRequest(); - await manager.HandleCStoreRequest(request, "AE1", "AE", associationId); + await manager.HandleCStoreRequest(request, "AE1", "AE", associationId, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _applicationEntityHandler.Verify(p => p.HandleInstanceAsync( @@ -309,7 +311,8 @@ public async Task ShallHandleCStoreRequest() p.SopClassUid.Equals(request.Dataset.GetSingleValue(DicomTag.SOPClassUID)) && p.StudyInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.StudyInstanceUID)) && p.SeriesInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID)) && - p.SopInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.SOPInstanceUID)))) + p.SopInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.SOPInstanceUID))), + ScpInputTypeEnum.WorkflowTrigger) , Times.Once()); } diff --git a/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs b/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs old mode 100644 new mode 100755 index 299a85afe..9dca2a3ca --- a/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs @@ -16,7 +16,7 @@ using System; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Services.Scp; using Moq; using xRetry; diff --git a/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs b/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs index c8209a0f3..42e4043f5 100755 --- a/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs @@ -28,6 +28,7 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.SharedTest; using Moq; @@ -234,7 +235,7 @@ public async Task CStore_OnCStoreRequest_InsufficientStorageAvailableException() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new InsufficientStorageAvailableException()); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new InsufficientStorageAvailableException()); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -266,7 +267,7 @@ public async Task CStore_OnCStoreRequest_IoException() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new IOException { HResult = Constants.ERROR_HANDLE_DISK_FULL }); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new IOException { HResult = Constants.ERROR_HANDLE_DISK_FULL }); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -297,7 +298,7 @@ public async Task CStore_OnCStoreRequest_Exception() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new Exception()); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new Exception()); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -329,7 +330,7 @@ public async Task CStore_OnCStoreRequest_Success() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -361,7 +362,7 @@ public async Task CStore_OnClientAbort() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); var countdownEvent = new CountdownEvent(1); var service = await CreateService(); @@ -380,6 +381,41 @@ public async Task CStore_OnClientAbort() _logger.VerifyLogging($"Aborted {DicomAbortSource.ServiceUser} with reason {DicomAbortReason.NotSpecified}.", LogLevel.Warning, Times.Once()); } + [RetryFact(5, 250, DisplayName = "C-STORE - ExternalApp OnCStoreRequest - SendType")] + public async Task CStore_OnCStoreRequest_SendsType() + { + ScpInputTypeEnum savedType = ScpInputTypeEnum.WorkflowTrigger; + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.CanStore).Returns(true); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((DicomCStoreRequest request, string b, string c, Guid d, ScpInputTypeEnum type) => savedType = type); + + var countdownEvent = new CountdownEvent(3); + var service = await CreateExternalAppService(); + + var client = DicomClientFactory.Create("localhost", _configuration.Value.Dicom.Scp.ExternalAppPort, false, "STORESCU", "STORESCP"); + var request = new DicomCStoreRequest(InstanceGenerator.GenerateDicomFile()); + await client.AddRequestAsync(request); + client.AssociationAccepted += (sender, e) => + { + countdownEvent.Signal(); + }; + client.AssociationReleased += (sender, e) => + { + countdownEvent.Signal(); + }; + request.OnResponseReceived += (DicomCStoreRequest request, DicomCStoreResponse response) => + { + Assert.Equal(DicomStatus.Success, response.Status); + countdownEvent.Signal(); + }; + + await client.SendAsync(); + Assert.True(countdownEvent.Wait(2000)); + Assert.Equal(ScpInputTypeEnum.ExternalAppReturn, savedType); + } + private async Task CreateService() { var tryCount = 0; @@ -400,5 +436,26 @@ private async Task CreateService() Assert.Equal(ServiceStatus.Running, service.Status); return service; } + + private async Task CreateExternalAppService() + { + var tryCount = 0; + ExternalAppScpService service = null; + + do + { + _configuration.Value.Dicom.Scp.ExternalAppPort = Interlocked.Increment(ref s_nextPort); + if (service != null) + { + service.Dispose(); + await Task.Delay(100); + } + service = new ExternalAppScpService(_serviceScopeFactory.Object, _associationDataProvider.Object, _appLifetime.Object, _configuration); + _ = service.StartAsync(_cancellationTokenSource.Token); + } while (service.Status != ServiceStatus.Running && tryCount++ < 5); + + Assert.Equal(ServiceStatus.Running, service.Status); + return service; + } } } diff --git a/src/InformaticsGateway/Test/appsettings.json b/src/InformaticsGateway/Test/appsettings.json old mode 100644 new mode 100755 index f3e7bf5c3..c600ee131 --- a/src/InformaticsGateway/Test/appsettings.json +++ b/src/InformaticsGateway/Test/appsettings.json @@ -10,6 +10,7 @@ "dicom": { "scp": { "port": 1104, + "externalAppPort": 1106, "logDimseDatasets": false, "rejectUnknownSources": true }, @@ -35,7 +36,6 @@ "password": "password", "virtualHost": "monaideploy", "exchange": "monaideploy", - "exportRequestQueue": "export_tasks" } }, "storage": { diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index a49d0862e..f540f9174 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -8,6 +8,15 @@ "resolved": "6.0.0", "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.11.0, )", + "resolved": "6.11.0", + "contentHash": "aBaagwdNtVKkug1F3imGXUlmoBd8ZUZX8oQ5niThaJhF79SpESe1Gzq7OFuZkQdKD5Pa4Mone+jrbas873AT4g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, "Microsoft.AspNetCore.Mvc.WebApiCompatShim": { "type": "Direct", "requested": "[2.2.0, )", @@ -807,8 +816,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -818,10 +827,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.5-rc0006", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1234,6 +1243,14 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, "System.Console": { "type": "Transitive", "resolved": "4.3.0", @@ -1819,6 +1836,11 @@ "System.Threading.Tasks": "4.3.0" } }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, "System.Security.Cryptography.X509Certificates": { "type": "Transitive", "resolved": "4.3.0", @@ -2053,7 +2075,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2066,7 +2088,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/appsettings.Development.json b/src/InformaticsGateway/appsettings.Development.json old mode 100644 new mode 100755 index 544cb9858..6c6e82c55 --- a/src/InformaticsGateway/appsettings.Development.json +++ b/src/InformaticsGateway/appsettings.Development.json @@ -10,7 +10,7 @@ "InformaticsGateway": { "dicom": { "scp": { - "port": 1104, + "port": 104, "rejectUnknownSources": false } }, @@ -27,8 +27,7 @@ "username": "rabbitmq", "password": "rabbitmq", "virtualHost": "monaideploy", - "exchange": "monaideploy", - "exportRequestQueue": "export_tasks" + "exchange": "monaideploy" } }, "storage": { diff --git a/src/InformaticsGateway/appsettings.Test.json b/src/InformaticsGateway/appsettings.Test.json old mode 100644 new mode 100755 index 5f81a9e72..a2441e86c --- a/src/InformaticsGateway/appsettings.Test.json +++ b/src/InformaticsGateway/appsettings.Test.json @@ -6,6 +6,7 @@ "dicom": { "scp": { "port": 1104, + "externalAppPort": 1106, "rejectUnknownSources": false } }, @@ -23,7 +24,6 @@ "password": "rabbitmq", "virtualHost": "monaideploy", "exchange": "monaideploy", - "exportRequestQueue": "export_tasks" } }, "storage": { diff --git a/src/InformaticsGateway/appsettings.json b/src/InformaticsGateway/appsettings.json index a367a22c5..6ccdc1d4c 100755 --- a/src/InformaticsGateway/appsettings.json +++ b/src/InformaticsGateway/appsettings.json @@ -57,6 +57,7 @@ "dicom": { "scp": { "port": 104, + "externalAppPort": 105, "logDimseDatasets": false, "rejectUnknownSources": true }, @@ -82,7 +83,7 @@ "password": "password", "virtualHost": "monaideploy", "exchange": "monaideploy", - "exportRequestQueue": "export_tasks", + "externalAppRequest": "md.externalapp.request", "deadLetterExchange": "monaideploy-dead-letter", "deliveryLimit": 3, "requeueDelay": 30 @@ -95,7 +96,7 @@ "storageRootPath": "/payloads", "temporaryBucketName": "monaideploy", "serviceAssemblyName": "Monai.Deploy.Storage.MinIO.MinIoStorageService, Monai.Deploy.Storage.MinIO", - "watermarkPercent": 75, + "watermarkPercent": 95, "reserveSpaceGB": 5, "settings": { "endpoint": "localhost:9000", diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 4a0a986ed..949a7eb45 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -20,11 +20,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "requested": "[1.0.5-rc0006, )", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.5-rc0006", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -546,8 +546,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1683,7 +1683,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs index e5c1f667f..19c81aa07 100755 --- a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database; @@ -61,12 +61,16 @@ public DicomDeidentifier( var studyInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); var seriesInstanceUid = dicomFile.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID); + + var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); var existing = await repository.GetAsync(exportRequestDataMessage.WorkflowInstanceId, exportRequestDataMessage.ExportTaskId, studyInstanceUid, seriesInstanceUid).ConfigureAwait(false); - var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid); + var newRecord = new RemoteAppExecution(exportRequestDataMessage, existing?.StudyInstanceUid, existing?.SeriesInstanceUid) + { PayloadId = exportRequestDataMessage.FilePayloadId }; + newRecord.OriginalValues.Add(DicomTag.StudyInstanceUID.ToString(), studyInstanceUid); newRecord.OriginalValues.Add(DicomTag.SeriesInstanceUID.ToString(), seriesInstanceUid); diff --git a/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs old mode 100644 new mode 100755 index 88e32e9c0..56634fcf6 --- a/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomReidentifier.cs @@ -62,6 +62,7 @@ public DicomReidentifier( fileMetadata.WorkflowInstanceId = remoteAppExecution.WorkflowInstanceId; fileMetadata.TaskId = remoteAppExecution.ExportTaskId; fileMetadata.ChangeCorrelationId(_logger, remoteAppExecution.CorrelationId); + fileMetadata.PayloadId = remoteAppExecution.PayloadId; return (dicomFile, fileMetadata); } diff --git a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs old mode 100644 new mode 100755 index f01521b8a..fee0722da --- a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs +++ b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs @@ -16,7 +16,7 @@ using System.Text.Json.Serialization; using FellowOakDicom; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution { @@ -43,6 +43,8 @@ public class RemoteAppExecution /// public string ExportTaskId { get; set; } = string.Empty; + public string? PayloadId { get; set; } + /// /// Gets or sets the correlation ID of the original request. /// diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs old mode 100644 new mode 100755 index 04527c4bf..c1e458cf9 --- a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database; @@ -259,6 +259,7 @@ private ExportRequestEvent GenerateExportRequest() => CorrelationId = Guid.NewGuid().ToString(), ExportTaskId = Guid.NewGuid().ToString(), WorkflowInstanceId = Guid.NewGuid().ToString(), + PayloadId = null }; } } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 0b7eadaf0..0437f4a5d 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -449,8 +449,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -458,6 +458,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -590,6 +600,15 @@ "resolved": "7.2.4", "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.0", @@ -1449,8 +1468,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "System.Threading.Tasks": { "type": "Transitive", @@ -1579,7 +1598,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index f55ec8cb2..9e91af417 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -387,6 +387,16 @@ "System.IO.Abstractions": "17.2.3" } }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "dependencies": { + "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Polly": "7.2.4", + "RabbitMQ.Client": "6.5.0" + } + }, "Monai.Deploy.Storage": { "type": "Transitive", "resolved": "0.2.18", @@ -442,6 +452,15 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" + } + }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -559,8 +578,8 @@ }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "7.0.0", + "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, "ZstdSharp.Port": { "type": "Transitive", @@ -573,7 +592,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/Common/MinioDataSink.cs b/tests/Integration.Test/Common/MinioDataSink.cs old mode 100644 new mode 100755 diff --git a/tests/Integration.Test/Common/RabbitConnectionFactory.cs b/tests/Integration.Test/Common/RabbitConnectionFactory.cs old mode 100644 new mode 100755 index 36e6881c2..6da3afa35 --- a/tests/Integration.Test/Common/RabbitConnectionFactory.cs +++ b/tests/Integration.Test/Common/RabbitConnectionFactory.cs @@ -68,10 +68,12 @@ public static void DeleteAllQueues(InformaticsGatewayConfiguration configuration { DeleteQueue(configuration.Messaging, configuration.Messaging.Topics.WorkflowRequest); DeleteQueue(configuration.Messaging, configuration.Messaging.Topics.ExportComplete); + DeleteQueue(configuration.Messaging, configuration.Messaging.Topics.ArtifactRecieved); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.Dicom.Scu.AgentName}"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.DicomWeb.AgentName}"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.WorkflowRequest}-dead-letter"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportComplete}-dead-letter"); + DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ArtifactRecieved}-dead-letter"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.Dicom.Scu.AgentName}-dead-letter"); DeleteQueue(configuration.Messaging, $"{configuration.Messaging.Topics.ExportRequestPrefix}.{configuration.DicomWeb.AgentName}-dead-letter"); } @@ -81,9 +83,11 @@ public static void PurgeAllQueues(MessageBrokerConfiguration configuration) PurgeQueue(configuration, configuration.Topics.WorkflowRequest); PurgeQueue(configuration, configuration.Topics.ExportComplete); PurgeQueue(configuration, configuration.Topics.ExportRequestPrefix); + PurgeQueue(configuration, configuration.Topics.ArtifactRecieved); PurgeQueue(configuration, $"{configuration.Topics.WorkflowRequest}-dead-letter"); PurgeQueue(configuration, $"{configuration.Topics.ExportComplete}-dead-letter"); PurgeQueue(configuration, $"{configuration.Topics.ExportRequestPrefix}-dead-letter"); + PurgeQueue(configuration, $"{configuration.Topics.ArtifactRecieved}-dead-letter"); } } } diff --git a/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs b/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs old mode 100644 new mode 100755 index 539d95476..9ce35d3bf --- a/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs +++ b/tests/Integration.Test/Drivers/DicomInstanceGenerator.cs @@ -64,7 +64,7 @@ public DicomInstanceGenerator GenerateNewSeries() return this; } - public DicomFile GenerateNewInstance(long size, string sopClassUid = "1.2.840.10008.5.1.4.1.1.11.1") + public DicomFile GenerateNewInstance(long size, string modality, string sopClassUid = "1.2.840.10008.5.1.4.1.1.11.1") { var dataset = new DicomDataset(); _baseDataset.CopyTo(dataset); @@ -80,6 +80,12 @@ public DicomFile GenerateNewInstance(long size, string sopClassUid = "1.2.840.10 .AddOrUpdate(DicomTag.HighBit, 7) .AddOrUpdate(DicomTag.SamplesPerPixel, 1); + + if (modality.Any(char.IsLower) is false) + { + dataset.AddOrUpdate(DicomTag.Modality, modality); + } + var frames = Math.Max(1, size / Rows / Columns); var pixelData = DicomPixelData.Create(dataset, true); for (var frame = 0; frame < frames; frame++) @@ -119,7 +125,7 @@ public DicomDataSpecs Generate(string patientId, int studiesPerPatient, int seri for (var instance = 0; instance < instancesPerSeries; instance++) { var size = _random.NextLong(studySpec.SizeMinBytes, studySpec.SizeMaxBytes); - dicomFile = generator.GenerateNewInstance(size); + dicomFile = generator.GenerateNewInstance(size, modality); files.Add(dicomFile.GenerateFileName(), dicomFile); } } diff --git a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs old mode 100644 new mode 100755 index 2c86182b7..cf1ac780c --- a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs +++ b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs @@ -15,6 +15,7 @@ */ using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api; diff --git a/tests/Integration.Test/Features/DicomDimseScp.feature b/tests/Integration.Test/Features/DicomDimseScp.feature old mode 100644 new mode 100755 index 7741e62ed..102ca3619 --- a/tests/Integration.Test/Features/DicomDimseScp.feature +++ b/tests/Integration.Test/Features/DicomDimseScp.feature @@ -43,7 +43,7 @@ Feature: DICOM DIMSE SCP Services And studies When a C-STORE-RQ is sent to 'Informatics Gateway' with AET '' from 'TEST-RUNNER' Then a successful response should be received - And workflow requests sent to message broker + And Artifact Recieved sent to ea message broker And studies are uploaded to storage service with data input plugins Examples: @@ -61,7 +61,7 @@ Feature: DICOM DIMSE SCP Services And studies with series per study When a C-STORE-RQ is sent to 'Informatics Gateway' with AET '' from 'TEST-RUNNER' Then a successful response should be received - And workflow requests sent to message broker + And Artifact Recieved sent to ea message broker And studies are uploaded to storage service Examples: @@ -79,10 +79,21 @@ Feature: DICOM DIMSE SCP Services And studies with series per study When C-STORE-RQ are sent to 'Informatics Gateway' with AET 'C-STORE-MA' from 'TEST-RUNNER' Then a successful response should be received - And workflow requests sent to message broker + And Artifact Recieved sent to ea message broker And studies are uploaded to storage service Examples: | modality | study_count | series_count | seconds | workflow_requests | | MG | 1 | 3 | 3 | 1 | | MG | 1 | 3 | 6 | 3 | + + @messaging_workflow_request @messaging + Scenario Outline: Respond to C-STORE-RQ and group data by Study Instance UID from external App + Given a called AE Title named 'C-STORE-MA' that groups by '0020,000D' for 5 seconds from external app + And a DICOM client configured with 300 seconds timeout + And a DICOM client configured to send data over 1 associations and wait 3 between each association + And 1 MG studies with 3 series per study + When C-STORE-RQ are sent to 'Informatics Gateway' with AET 'C-STORE-MA' from 'TEST-RUNNER' + Then a successful response should be received + And 1 Artifact Recieved sent to ea message broker + And studies are uploaded to storage service diff --git a/tests/Integration.Test/Features/DicomWebStow.feature b/tests/Integration.Test/Features/DicomWebStow.feature old mode 100644 new mode 100755 index 2d892cd4b..0e2687954 --- a/tests/Integration.Test/Features/DicomWebStow.feature +++ b/tests/Integration.Test/Features/DicomWebStow.feature @@ -24,7 +24,7 @@ Feature: DICOMweb STOW-RS Service Scenario: Triggers a new workflow request via DICOMWeb STOW-RS Given studies with 'stow_none' grouping When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | @@ -35,7 +35,7 @@ Feature: DICOMweb STOW-RS Service Scenario: Triggers a new workflow with given study instance UID request via DICOMWeb STOW-RS Given studies with 'stow_study' grouping When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' with StudyInstanceUid - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | @@ -47,7 +47,7 @@ Feature: DICOMweb STOW-RS Service Given studies with 'stow_none' grouping And a workflow named 'MyWorkflow' When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | @@ -59,7 +59,7 @@ Feature: DICOMweb STOW-RS Service Given studies with 'stow_study' grouping And a workflow named 'MyWorkflow' When the studies are uploaded to the DICOMWeb STOW-RS service at '/dicomweb/' with StudyInstanceUid - Then 1 workflow requests received from message broker + Then 1 workflow requests received from receieved artifact message broker And studies are uploaded to storage service with data input plugins Examples: | modality | count | diff --git a/tests/Integration.Test/Features/ExternalApp.feature b/tests/Integration.Test/Features/ExternalApp.feature new file mode 100755 index 000000000..831f0c85d --- /dev/null +++ b/tests/Integration.Test/Features/ExternalApp.feature @@ -0,0 +1,27 @@ + +# Copyright 2023 MONAI Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# @ignored + +Feature: External App Execution + +This feature tests the External App Execution for saving and +re-identifying data sent and received by the MIG respectively. + + @messaging_workflow_request @messaging + Scenario: End-to-end test of external App scp incomming + Given a externalApp study that is exported to the test host + When the externalApp study is received and sent back to Informatics Gateway with 1 message + Then ensure the original externalApp study and the received study are the same diff --git a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature index 283db5da4..469408574 100755 --- a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature +++ b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature @@ -23,11 +23,12 @@ re-identifying data sent and received by the MIG respectively. @messaging_workflow_request @messaging Scenario: End-to-end test of plug-ins Given a study that is exported to the test host - When the study is received and sent back to Informatics Gateway + When the study is received and sent back to Informatics Gateway with 1 messages Then ensure the original study and the received study are the same @messaging_workflow_request @messaging Scenario: End-to-end test of plug-ins with one failing Given a study that is exported to the test host with a bad plugin - When the study is received and sent back to Informatics Gateway + When the study is received and sent back to Informatics Gateway with 2 messages Then ensure the original study and the received study are the same + diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 78a5240e7..0b9c2f48a 100755 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -40,6 +40,7 @@ public sealed class TestHooks private static RabbitMQConnectionFactory s_rabbitMqConnectionFactory; private static RabbitMQMessagePublisherService s_rabbitMqPublisher; private static RabbitMqConsumer s_rabbitMqConsumer_WorkflowRequest; + private static RabbitMqConsumer s_rabbitMqConsumer_ArtifactRecieved; private static RabbitMqConsumer s_rabbitMqConsumer_ExportComplete; private static IDatabaseDataProvider s_database; private static DicomScp s_dicomServer; @@ -129,6 +130,13 @@ private static void SetupRabbitMq(ISpecFlowOutputHelper outputHelper, IServiceSc s_rabbitMqConnectionFactory); s_rabbitMqConsumer_ExportComplete = new RabbitMqConsumer(rabbitMqSubscriber_ExportComplete, s_options.Value.Messaging.Topics.ExportComplete, outputHelper); + + var rabbitMqSubscriber_ArtifactRecieved = new RabbitMQMessageSubscriberService( + Options.Create(s_options.Value.Messaging), + scope.ServiceProvider.GetRequiredService>(), + s_rabbitMqConnectionFactory); + + s_rabbitMqConsumer_ArtifactRecieved = new RabbitMqConsumer(rabbitMqSubscriber_ArtifactRecieved, s_options.Value.Messaging.Topics.ArtifactRecieved, outputHelper); } private static IDatabaseDataProvider GetDatabase(IServiceProvider serviceProvider, ISpecFlowOutputHelper outputHelper) @@ -164,6 +172,7 @@ public void SetUp(ScenarioContext scenarioContext, ISpecFlowOutputHelper outputH _objectContainer.RegisterInstanceAs(s_rabbitMqPublisher, "MessagingPublisher"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_WorkflowRequest, "WorkflowRequestSubscriber"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ExportComplete, "ExportCompleteSubscriber"); + _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ArtifactRecieved, "ArtifactRecievedSubscriber"); _objectContainer.RegisterInstanceAs(s_dataProvider, "DataProvider"); _objectContainer.RegisterInstanceAs(s_assertions, "Assertions"); _objectContainer.RegisterInstanceAs(s_storescu, "StoreSCU"); @@ -183,6 +192,7 @@ public static void Shtudown() s_rabbitMqConsumer_WorkflowRequest.Dispose(); s_rabbitMqConsumer_ExportComplete.Dispose(); + s_rabbitMqConsumer_ArtifactRecieved.Dispose(); s_rabbitMqConnectionFactory.Dispose(); } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj old mode 100644 new mode 100755 index a53f89786..b40e1cf42 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs old mode 100644 new mode 100755 index 3c8cc1e2f..7bad77fa8 --- a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs @@ -19,11 +19,14 @@ using BoDi; using FellowOakDicom.Network; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions { @@ -31,13 +34,14 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class DicomDimseScpServicesStepDefinitions { - internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromSeconds(120); internal static readonly string[] DummyWorkflows = new string[] { "WorkflowA", "WorkflowB" }; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly ObjectContainer _objectContainer; private readonly Configurations _configuration; private readonly InformaticsGatewayClient _informaticsGatewayClient; private readonly RabbitMqConsumer _receivedMessages; + private readonly RabbitMqConsumer _receivedMessagesArtifactRecieved; private readonly DataProvider _dataProvider; private readonly Assertions _assertions; @@ -50,6 +54,7 @@ public DicomDimseScpServicesStepDefinitions( _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _receivedMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _receivedMessagesArtifactRecieved = objectContainer.Resolve("ArtifactRecievedSubscriber"); _dataProvider = objectContainer.Resolve("DataProvider"); _assertions = objectContainer.Resolve("Assertions"); _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); @@ -94,11 +99,15 @@ public void GivenXStudiesWithYSeriesPerStudy(int studyCount, string modality, in _dataProvider.GenerateDicomData(modality, studyCount, seriesPerStudy); _receivedMessages.ClearMessages(); + _receivedMessagesArtifactRecieved.ClearMessages(); } [Given(@"a called AE Title named '([^']*)' that groups by '([^']*)' for (.*) seconds")] public async Task GivenACalledAETitleNamedThatGroupsByForSeconds(string calledAeTitle, string grouping, uint groupingTimeout) { + _receivedMessages.ClearMessages(); + _receivedMessagesArtifactRecieved.ClearMessages(); + Guard.Against.NullOrWhiteSpace(calledAeTitle, nameof(calledAeTitle)); Guard.Against.NullOrWhiteSpace(grouping, nameof(grouping)); Guard.Against.NegativeOrZero(groupingTimeout, nameof(groupingTimeout)); @@ -132,6 +141,42 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit } } } + [Given(@"a called AE Title named '([^']*)' that groups by '([^']*)' for (.*) seconds from external app")] + public async Task GivenACalledAETitleNamedThatGroupsByForSecondsFromExternalApp(string calledAeTitle, string grouping, uint groupingTimeout) + { + Guard.Against.NullOrWhiteSpace(calledAeTitle, nameof(calledAeTitle)); + Guard.Against.NullOrWhiteSpace(grouping, nameof(grouping)); + Guard.Against.NegativeOrZero(groupingTimeout, nameof(groupingTimeout)); + + _dataProvider.StudyGrouping = grouping; + try + { + await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntity + { + AeTitle = calledAeTitle, + Name = calledAeTitle, + Grouping = grouping, + Timeout = groupingTimeout, + Workflows = new List(DummyWorkflows), + PlugInAssemblies = new List() { typeof(Monai.Deploy.InformaticsGateway.Test.PlugIns.TestInputDataPlugInModifyDicomFile).AssemblyQualifiedName }, + }, CancellationToken.None); + + _dataProvider.Workflows = DummyWorkflows; + _dataProvider.Destination = calledAeTitle; + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && + ex.ProblemDetails.Detail.Contains("already exists")) + { + await _informaticsGatewayClient.MonaiScpAeTitle.GetAeTitle(calledAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + } [Given(@"a DICOM client configured with (.*) seconds timeout")] public void GivenADICOMClientConfiguredWithSecondsTimeout(int timeout) @@ -205,5 +250,18 @@ public async Task ThenWorkflowRequestSentToMessageBrokerAsync(int workflowCount) (await _receivedMessages.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DIMSE, _receivedMessages.Messages, workflowCount); } + + [Then(@"(.*) Artifact Recieved sent to ea message broker")] + public async Task ThenArtifactRecievedSentToEaMessageBrokerExpect(int workflowCount) + { + Guard.Against.NegativeOrZero(workflowCount, nameof(workflowCount)); + + (await _receivedMessagesArtifactRecieved.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DIMSE, _receivedMessagesArtifactRecieved.Messages, workflowCount); + + var firstMessage = _receivedMessagesArtifactRecieved.Messages.First().ConvertTo(); + + Assert.NotEqual(ArtifactType.Unset, firstMessage.Artifacts.First().Type); + } } } diff --git a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs old mode 100644 new mode 100755 index f792febc9..4ce427a54 --- a/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomWebStowServiceStepDefinitions.cs @@ -32,12 +32,13 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class DicomWebStowServiceStepDefinitions { - internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + internal static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromSeconds(130); internal static readonly string[] DummyWorkflows = new string[] { "WorkflowA", "WorkflowB" }; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly InformaticsGatewayClient _informaticsGatewayClient; private readonly Configurations _configurations; private readonly RabbitMqConsumer _receivedMessages; + private readonly RabbitMqConsumer _artifactReceivedMessages; private readonly DataProvider _dataProvider; private readonly IDataClient _dataSink; private readonly Assertions _assertions; @@ -48,6 +49,7 @@ public DicomWebStowServiceStepDefinitions(ObjectContainer objectContainer, Confi _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); _receivedMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _artifactReceivedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); _dataProvider = objectContainer.Resolve("DataProvider"); _dataSink = objectContainer.Resolve("DicomWebClient"); _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); @@ -99,6 +101,7 @@ public void GivenNStudies(int studyCount, string modality, string grouping) _dataProvider.GenerateDicomData(modality, studyCount); _dataProvider.StudyGrouping = grouping; _receivedMessages.ClearMessages(); + _artifactReceivedMessages.ClearMessages(); } [Given(@"a workflow named '(.*)'")] @@ -167,5 +170,14 @@ public async Task ThenWorkflowRequestSentToMessageBrokerAsync(int workflowCount) (await _receivedMessages.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DicomWeb, _receivedMessages.Messages, workflowCount); } + + [Then(@"(.*) workflow requests received from receieved artifact message broker")] + public async Task ThenWorkflowRequestsReceivedFromReceievedArtifactMessageBroker(int workflowCount) + { + Guard.Against.NegativeOrZero(workflowCount, nameof(workflowCount)); + + (await _artifactReceivedMessages.WaitforAsync(workflowCount, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, Messaging.Events.DataService.DicomWeb, _artifactReceivedMessages.Messages, workflowCount); + } } } diff --git a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs old mode 100644 new mode 100755 index 8ca5811f9..53cae4359 --- a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs @@ -18,7 +18,7 @@ using System.Net.Http.Headers; using Ardalis.GuardClauses; using BoDi; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs new file mode 100755 index 000000000..168155f11 --- /dev/null +++ b/tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs @@ -0,0 +1,258 @@ +/* + * Copyright 2022-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Net; +using BoDi; +using FellowOakDicom; +using FellowOakDicom.Network; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Client; +using Monai.Deploy.InformaticsGateway.Client.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Integration.Test.Common; +using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Messaging.RabbitMQ; +using Polly; +using Polly.Timeout; + +namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions +{ + [Binding] + [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] + public class ExteralAppStepDefinitions + { + private static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + private static readonly TimeSpan DicomScpWaitTimeSpan = TimeSpan.FromMinutes(20); + private static readonly string MonaiAeTitle = "REMOTE-APPS"; + private static readonly string SourceAeTitle = "MIGTestHost"; + private static readonly DicomTag[] DicomTags = new[] { DicomTag.AccessionNumber, DicomTag.StudyDescription, DicomTag.SeriesDescription, DicomTag.PatientAddress, DicomTag.PatientAge, DicomTag.PatientName }; + private static readonly List DefaultDicomTags = new() { DicomTag.PatientID, DicomTag.StudyInstanceUID, DicomTag.SeriesInstanceUID, DicomTag.SOPInstanceUID }; + + private readonly ObjectContainer _objectContainer; + private readonly InformaticsGatewayClient _informaticsGatewayClient; + private readonly IDataClient _dataSinkMinio; + private readonly DicomScp _dicomServer; + private readonly Configurations _configuration; + private string _dicomDestination; + private readonly DataProvider _dataProvider; + private readonly RabbitMqConsumer _receivedExportCompletedMessages; + private readonly RabbitMqConsumer _receivedWorkflowRequestMessages; + private readonly RabbitMqConsumer _receivedArtifactRecievedMessages; + private readonly RabbitMQMessagePublisherService _messagePublisher; + private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; + private Dictionary _originalDicomFiles; + private ExternalAppRequestEvent _exportRequestEvent; + private readonly Assertions _assertions; + private readonly string _correlationId = Guid.NewGuid().ToString(); + private readonly string _exportTaskId = Guid.NewGuid().ToString(); + private readonly string _workflowInstanceId = Guid.NewGuid().ToString(); + + public ExteralAppStepDefinitions( + ObjectContainer objectContainer, + Configurations configuration) + { + _objectContainer = objectContainer ?? throw new ArgumentNullException(nameof(objectContainer)); + _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); + _dataSinkMinio = objectContainer.Resolve("MinioClient"); + _dicomServer = objectContainer.Resolve("DicomScp"); + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _dataProvider = objectContainer.Resolve("DataProvider"); + _receivedExportCompletedMessages = objectContainer.Resolve("ExportCompleteSubscriber"); + _receivedWorkflowRequestMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _receivedArtifactRecievedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); + _messagePublisher = objectContainer.Resolve("MessagingPublisher"); + _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); + _assertions = objectContainer.Resolve("Assertions"); + + DefaultDicomTags.AddRange(DicomTags); + _dicomServer.ClearFilesAndUseHashes = false; //we need to store actual files to send the data back to MIG + } + + [Given(@"a externalApp study that is exported to the test host")] + public async Task GivenAExternalAppStudyThatIsExportedToTheTestHost() + { + DestinationApplicationEntity destination; + try + { + destination = await _informaticsGatewayClient.DicomDestinations.Create(new DestinationApplicationEntity + { + Name = _dicomServer.FeatureScpAeTitle, + AeTitle = _dicomServer.FeatureScpAeTitle, + HostIp = _configuration.InformaticsGatewayOptions.Host, + Port = _dicomServer.FeatureScpPort + }, CancellationToken.None); + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && ex.ProblemDetails.Detail.Contains("already exists")) + { + destination = await _informaticsGatewayClient.DicomDestinations.GetAeTitle(_dicomServer.FeatureScpAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + _dicomDestination = destination.Name; + + // Generate a study with multiple series + //_dataProvider.GenerateDicomData("MG", 1, 1); + _dataProvider.GenerateDicomData("CT", 1); + _dataProvider.InjectRandomData(DicomTags); + _originalDicomFiles = new Dictionary(_dataProvider.DicomSpecs.Files); + + await _dataSinkMinio.SendAsync(_dataProvider); + + // Emit a export request event + _exportRequestEvent = new ExternalAppRequestEvent + { + CorrelationId = _correlationId, + Targets = new List { new DataOrigin { Destination = destination.Name } }, + ExportTaskId = _exportTaskId, + Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = _workflowInstanceId, + DestinationFolder = "ThisIs/My/Output/Folder", + }; + + //_exportRequestEvent.PluginAssemblies.Add(typeof(DicomDeidentifier).AssemblyQualifiedName); + + var message = new JsonMessage( + _exportRequestEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + _exportRequestEvent.CorrelationId, + string.Empty); + + _receivedExportCompletedMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); + await _messagePublisher.Publish("md.externalapp.request", message.ToMessage()); + } + + [When(@"the externalApp study is received and sent back to Informatics Gateway with (.*) message")] + public async Task WhenTheExternalAppStudyIsReceivedAndSentBackToInformaticsGatewayWithMessage(int exportCount) + { + // setup DICOM Source + try + { + await _informaticsGatewayClient.DicomSources.Create(new SourceApplicationEntity + { + Name = SourceAeTitle, + AeTitle = SourceAeTitle, + HostIp = _configuration.InformaticsGatewayOptions.Host, + }, CancellationToken.None); + _dataProvider.Source = SourceAeTitle; + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && + ex.ProblemDetails.Detail.Contains("already exists")) + { + await _informaticsGatewayClient.DicomSources.GetAeTitle(SourceAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + + // setup MONAI Deploy AET + _dataProvider.StudyGrouping = "0020,000D"; + try + { + await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntity + { + AeTitle = MonaiAeTitle, + Name = MonaiAeTitle, + Grouping = _dataProvider.StudyGrouping, + Timeout = 3, + PlugInAssemblies = new List() + }, CancellationToken.None); + _dataProvider.Destination = MonaiAeTitle; + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && + ex.ProblemDetails.Detail.Contains("already exists")) + { + await _informaticsGatewayClient.MonaiScpAeTitle.GetAeTitle(MonaiAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + + var timeoutPolicy = Policy.TimeoutAsync(140, TimeoutStrategy.Pessimistic); + await timeoutPolicy + .ExecuteAsync( + async () => { await SendRequest(exportCount); } + ); + + // Clear workflow request messages + _receivedWorkflowRequestMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); + + _dataProvider.DimseRsponse.Should().Be(DicomStatus.Success); + + // Wait for workflow request events + (await _receivedArtifactRecievedMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedArtifactRecievedMessages.Messages, 1); + } + + [Then(@"ensure the original externalApp study and the received study are the same")] + public async Task ThenEnsureTheOriginalExternalAppStudyAndTheReceivedStudyAreTheSame() + { + var workflowRequestEvent = _receivedArtifactRecievedMessages.Messages[0].ConvertTo(); + _exportRequestEvent.CorrelationId.Should().Be(_receivedArtifactRecievedMessages.Messages[0].CorrelationId); + _exportRequestEvent.CorrelationId.Should().Be(workflowRequestEvent.CorrelationId); + _exportRequestEvent.WorkflowInstanceId.Should().Be(workflowRequestEvent.WorkflowInstanceId); + _exportRequestEvent.ExportTaskId.Should().Be(workflowRequestEvent.TaskId); + await _assertions.ShouldRestoreAllDicomMetaata(_receivedArtifactRecievedMessages.Messages, _originalDicomFiles, DefaultDicomTags.ToArray()).ConfigureAwait(false); + } + + private async Task SendRequest(int exportCount = 1) + { + // Wait for export completed event + (await _receivedExportCompletedMessages.WaitforAsync(exportCount, DicomScpWaitTimeSpan)).Should().BeTrue(); + + foreach (var key in _dataProvider.DicomSpecs.FileHashes.Keys) + { + (await Extensions.WaitUntil(() => _dicomServer.Instances.ContainsKey(key), DicomScpWaitTimeSpan)).Should().BeTrue("{0} should be received", key); + } + + // Send data received back to MIG + var storeScu = _objectContainer.Resolve("StoreSCU"); + + var host = _configuration.InformaticsGatewayOptions.Host; + var port = _informaticsGatewayConfiguration.Dicom.Scp.ExternalAppPort; + + _dataProvider.Workflows = null; + _dataProvider.DicomSpecs.Files.Clear(); + _dataProvider.DicomSpecs.Files = new Dictionary(_dicomServer.DicomFiles); + _dataProvider.DicomSpecs.Files.Should().NotBeNull(); + + await storeScu.SendAsync( + _dataProvider, + SourceAeTitle, + host, + port, + MonaiAeTitle); + } + } +} diff --git a/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs b/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs old mode 100644 new mode 100755 index 88c574d41..98d72bc3b --- a/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/FhirDefinitions.cs @@ -29,9 +29,10 @@ public class FhirDefinitions internal enum FileFormat { Xml, Json }; - internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromMinutes(3); + internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromSeconds(120); private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly RabbitMqConsumer _receivedMessages; + private readonly RabbitMqConsumer _artifactReceivedMessages; private readonly DataProvider _dataProvider; private readonly Assertions _assertions; private readonly IDataClient _dataSink; @@ -45,6 +46,7 @@ public FhirDefinitions(ObjectContainer objectContainer) _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); _receivedMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _artifactReceivedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); _dataProvider = objectContainer.Resolve("DataProvider"); _assertions = objectContainer.Resolve("Assertions"); _dataSink = objectContainer.Resolve("FhirClient"); diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index dbc2409ff..2e126327b 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -19,11 +19,13 @@ using FellowOakDicom; using FellowOakDicom.Network; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +//using Monai.Deploy.InformaticsGateway.PlugIns.Pseudonymisation; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; @@ -53,6 +55,7 @@ public class RemoteAppExecutionPlugInsStepDefinitions private readonly DataProvider _dataProvider; private readonly RabbitMqConsumer _receivedExportCompletedMessages; private readonly RabbitMqConsumer _receivedWorkflowRequestMessages; + private readonly RabbitMqConsumer _receivedArtifactRecievedMessages; private readonly RabbitMQMessagePublisherService _messagePublisher; private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private Dictionary _originalDicomFiles; @@ -71,6 +74,7 @@ public RemoteAppExecutionPlugInsStepDefinitions( _dataProvider = objectContainer.Resolve("DataProvider"); _receivedExportCompletedMessages = objectContainer.Resolve("ExportCompleteSubscriber"); _receivedWorkflowRequestMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _receivedArtifactRecievedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); _messagePublisher = objectContainer.Resolve("MessagingPublisher"); _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); _assertions = objectContainer.Resolve("Assertions"); @@ -124,6 +128,7 @@ public async Task AStudyThatIsExportedToTheTestHost() Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), MessageId = Guid.NewGuid().ToString(), WorkflowInstanceId = Guid.NewGuid().ToString(), + PayloadId = Guid.NewGuid().ToString(), }; _exportRequestEvent.PluginAssemblies.Add(typeof(DicomDeidentifier).AssemblyQualifiedName); @@ -135,6 +140,7 @@ public async Task AStudyThatIsExportedToTheTestHost() string.Empty); _receivedExportCompletedMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); await _messagePublisher.Publish("md.export.request.monaiscu", message.ToMessage()); } @@ -174,7 +180,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() await _dataSinkMinio.SendAsync(_dataProvider); - // send 2 messagees the first on should fail, teh second one should not + // send 2 messagees the first on should fail, the second one should not string pluginName = typeof(DicomDeidentifier).AssemblyQualifiedName; pluginName = pluginName.Replace("DicomDeidentifier", "fail"); @@ -190,6 +196,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), MessageId = Guid.NewGuid().ToString(), WorkflowInstanceId = Guid.NewGuid().ToString(), + PayloadId = Guid.NewGuid().ToString(), }; _exportRequestEvent.PluginAssemblies.Add(pluginName); var message = new JsonMessage( @@ -204,8 +211,8 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() } } - [When(@"the study is received and sent back to Informatics Gateway")] - public async Task TheStudyIsReceivedAndSentBackToInformaticsGateway() + [When(@"the study is received and sent back to Informatics Gateway with (.*) messages")] + public async Task WhenTheStudyIsReceivedAndSentBackToInformaticsGatewayWith(int exportCount) { // setup DICOM Source @@ -259,20 +266,21 @@ await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntit } } - var timeoutPolicy = Policy.TimeoutAsync(40, TimeoutStrategy.Pessimistic); + var timeoutPolicy = Policy.TimeoutAsync(240, TimeoutStrategy.Pessimistic); await timeoutPolicy .ExecuteAsync( - async () => { await SendRequest(2); } + async () => { await SendRequest(exportCount); } ); // Clear workflow request messages _receivedWorkflowRequestMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); _dataProvider.DimseRsponse.Should().Be(DicomStatus.Success); // Wait for workflow request events - (await _receivedWorkflowRequestMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); - _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedWorkflowRequestMessages.Messages, 1); + (await _receivedArtifactRecievedMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedArtifactRecievedMessages.Messages, 1); } private async Task SendRequest(int exportCount = 1) @@ -307,12 +315,12 @@ await storeScu.SendAsync( [Then(@"ensure the original study and the received study are the same")] public async Task EnsureTheOriginalStudyAndTheReceivedStudyAreTheSameAsync() { - var workflowRequestEvent = _receivedWorkflowRequestMessages.Messages[0].ConvertTo(); - _exportRequestEvent.CorrelationId.Should().Be(_receivedWorkflowRequestMessages.Messages[0].CorrelationId); + var workflowRequestEvent = _receivedArtifactRecievedMessages.Messages[0].ConvertTo(); + _exportRequestEvent.CorrelationId.Should().Be(_receivedArtifactRecievedMessages.Messages[0].CorrelationId); _exportRequestEvent.CorrelationId.Should().Be(workflowRequestEvent.CorrelationId); _exportRequestEvent.WorkflowInstanceId.Should().Be(workflowRequestEvent.WorkflowInstanceId); _exportRequestEvent.ExportTaskId.Should().Be(workflowRequestEvent.TaskId); - await _assertions.ShouldRestoreAllDicomMetaata(_receivedWorkflowRequestMessages.Messages, _originalDicomFiles, DefaultDicomTags.ToArray()).ConfigureAwait(false); + await _assertions.ShouldRestoreAllDicomMetaata(_receivedArtifactRecievedMessages.Messages, _originalDicomFiles, DefaultDicomTags.ToArray()).ConfigureAwait(false); } } } diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index 4268c4f29..4fe3f720e 100755 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -25,6 +25,7 @@ "dicom": { "scp": { "port": 1104, + "externalAppPort": 1106, "logDimseDatasets": false, "rejectUnknownSources": true }, diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index e3521b080..bf3fee9d0 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -132,11 +132,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "zBVO6HOqyTfDj6YcITy1XtEiqRurFKUrIgLdJYVahhXlUnymn6/WmCuqkX1Z+3IKxy91D4LeF0KahH/rM8u6+w==", + "requested": "[1.0.5-rc0006, )", + "resolved": "1.0.5-rc0006", + "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.1", + "Monai.Deploy.Messaging": "1.0.5-rc0006", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -226,16 +226,6 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0034", - "contentHash": "BIDkrOEagPLrPWAgHcz1AQfrZAUkZG8mhwCJZjLszM5htrHItVihJc9nlqmSry7n/WOQ7nXouxScgZMlMSCYBQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -423,15 +413,6 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -444,17 +425,6 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -530,34 +500,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -600,55 +542,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -773,8 +666,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "w0+37sCMzhZg4vhYFG+9TKmDW+Dks5DOiTrJzdnT8xJCfH1MK6xkRnIf+dBfxes0wFwPiKueaUWDcUsg1RnadQ==", + "resolved": "1.0.5-rc0006", + "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -2048,24 +1941,6 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0034, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -2079,7 +1954,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.1, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2092,7 +1967,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.1, )", + "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } From 8d5fc9b98769d023132351f61f5ec4830d849378 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 20 Nov 2023 17:18:00 +0000 Subject: [PATCH 36/75] bad merge Signed-off-by: Neil South --- .../Services/Scp/ApplicationEntityHandler.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index 965e84e9b..411657c86 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -142,12 +142,6 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string } } - if (ArtifactTypes.Validate(modality) && Enum.TryParse(modality, out ArtifactType parsedArtifactType)) - { - dicomInfo.DataOrigin.ArtifactType = parsedArtifactType; - } - } - var result = await _pluginEngine.ExecutePlugInsAsync(request.File, dicomInfo).ConfigureAwait(false); using var scope = _logger.BeginScope(new Api.LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); From ad573336fe495c88d9b1fd33373ebe0a3f785607 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 11:15:36 +0000 Subject: [PATCH 37/75] adding hl7 linking to workflowInstanceId etc Signed-off-by: Neil South --- .gitignore | 1 + ...Monai.Deploy.InformaticsGateway.Api.csproj | 4 +- src/Api/Storage/Hl7FileStorageMetadata.cs | 3 +- src/Api/Test/packages.lock.json | 14 +- src/Api/packages.lock.json | 14 +- src/CLI/Test/packages.lock.json | 14 +- src/CLI/packages.lock.json | 14 +- src/Client/Test/packages.lock.json | 16 +- src/Client/packages.lock.json | 14 +- src/Configuration/Test/packages.lock.json | 14 +- src/Configuration/packages.lock.json | 14 +- src/Database/Api/Test/packages.lock.json | 14 +- src/Database/Api/packages.lock.json | 14 +- .../EntityFramework/Test/packages.lock.json | 14 +- .../EntityFramework/packages.lock.json | 14 +- .../Integration.Test/packages.lock.json | 14 +- .../Hl7ApplicationConfigRepository.cs | 22 +-- src/Database/MongoDB/packages.lock.json | 14 +- src/Database/packages.lock.json | 14 +- src/InformaticsGateway/InternalVisibleTo.cs | 0 .../Logging/Log.800.Hl7Service.cs | 22 +++ .../Monai.Deploy.InformaticsGateway.csproj | 2 +- src/InformaticsGateway/Program.cs | 1 + .../Properties/launchSettings.json | 19 --- .../HealthLevel7/IMllpClientFactory.cs | 5 +- .../Services/HealthLevel7/IMllpExtract.cs | 13 ++ .../Services/HealthLevel7/MllpClient.cs | 6 +- .../Services/HealthLevel7/MllpExtract.cs | 144 ++++++++++++++++ .../Services/HealthLevel7/MllpService.cs | 17 +- .../Http/Hl7ApplicationConfigController.cs | 5 +- .../Services/HealthLevel7/MllPExtractTests.cs | 160 ++++++++++++++++++ .../Services/HealthLevel7/MllpClientTest.cs | 27 +-- .../Services/HealthLevel7/MllpServiceTest.cs | 52 +++++- .../Test/packages.lock.json | 16 +- src/InformaticsGateway/packages.lock.json | 155 +---------------- .../Test/packages.lock.json | 14 +- .../RemoteAppExecution/packages.lock.json | 14 +- ...InformaticsGateway.Integration.Test.csproj | 2 +- tests/Integration.Test/packages.lock.json | 18 +- 39 files changed, 584 insertions(+), 350 deletions(-) mode change 100644 => 100755 src/Api/Storage/Hl7FileStorageMetadata.cs mode change 100644 => 100755 src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs mode change 100644 => 100755 src/InformaticsGateway/InternalVisibleTo.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.800.Hl7Service.cs delete mode 100755 src/InformaticsGateway/Properties/launchSettings.json mode change 100644 => 100755 src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs create mode 100755 src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs mode change 100644 => 100755 src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs create mode 100755 src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs create mode 100755 src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs diff --git a/.gitignore b/.gitignore index 8c4eb593b..990b81827 100644 --- a/.gitignore +++ b/.gitignore @@ -560,3 +560,4 @@ FodyWeavers.xsd # Additional files built by Visual Studio # End of https://www.toptal.com/developers/gitignore/api/aspnetcore,dotnetcore,visualstudio,visualstudiocode +/src/InformaticsGateway/Properties/launchSettings.json diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index 6ede317d0..05bbef5d0 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -55,8 +55,8 @@ - - + + diff --git a/src/Api/Storage/Hl7FileStorageMetadata.cs b/src/Api/Storage/Hl7FileStorageMetadata.cs old mode 100644 new mode 100755 index 2356f7738..576f88ae3 --- a/src/Api/Storage/Hl7FileStorageMetadata.cs +++ b/src/Api/Storage/Hl7FileStorageMetadata.cs @@ -54,6 +54,7 @@ public Hl7FileStorageMetadata(string connectionId, DataService dataType, string DataOrigin.DataService = dataType; DataOrigin.Source = dataOrigin; DataOrigin.Destination = IpAddress(); + DataOrigin.ArtifactType = Messaging.Common.ArtifactType.HL7; File = new StorageObjectMetadata(FileExtension) { @@ -63,4 +64,4 @@ public Hl7FileStorageMetadata(string connectionId, DataService dataType, string }; } } -} \ No newline at end of file +} diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 697907692..5d1fdf066 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -249,8 +249,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -260,10 +260,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1280,8 +1280,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 06bca97d4..7b9362503 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -35,9 +35,9 @@ }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.5-rc0006, )", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -47,11 +47,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.5-rc0006, )", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 37b49effc..41efaefab 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -497,8 +497,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -508,10 +508,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1563,8 +1563,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index cdce8b111..f83666c82 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -399,8 +399,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -410,10 +410,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -544,8 +544,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 8b97bc19b..6c873a044 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1816,7 +1816,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1829,8 +1829,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index eac0b2cfc..51038a996 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -166,10 +166,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -277,8 +277,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 6591f5152..b6fc3ff08 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -257,8 +257,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -268,10 +268,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1293,8 +1293,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index e7746d2d7..73698c335 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -155,8 +155,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -166,10 +166,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -277,8 +277,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index 84e33a6d5..14f526e45 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -231,8 +231,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -242,10 +242,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1267,8 +1267,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index 6f18781ad..3278ebc58 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -161,8 +161,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -172,10 +172,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -283,8 +283,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 1360cc775..8226f9a77 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -392,8 +392,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -403,10 +403,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1471,8 +1471,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 18be93807..cee402d1a 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -315,8 +315,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -326,10 +326,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -475,8 +475,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index e394689d1..426d87448 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -285,10 +285,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1398,8 +1398,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs old mode 100644 new mode 100755 index 04cdc1df8..b7a35ce5e --- a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs +++ b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs @@ -70,23 +70,22 @@ public Task> GetAllAsync(CancellationToken canc _retryPolicy.ExecuteAsync(() => _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken)); - public Task GetByIdAsync(string id) => - _retryPolicy.ExecuteAsync(() => _collection - .Find(x => x.Id.Equals(id)) - .FirstOrDefaultAsync())!; + public Task GetByIdAsync(string id) + { + var GuidId = Guid.Parse(id); + return _retryPolicy.ExecuteAsync(() => _collection + .Find(x => x.Id == GuidId) + .FirstOrDefaultAsync())!; + } public Task DeleteAsync(string id, CancellationToken cancellationToken = default) { return _retryPolicy.ExecuteAsync(async () => { - var entity = await GetByIdAsync(id).ConfigureAwait(false); - if (entity is null) - { - throw new DatabaseException("Failed to delete entity."); - } + var entity = await GetByIdAsync(id).ConfigureAwait(false) ?? throw new DatabaseException("Failed to delete entity."); var result = await _collection - .DeleteOneAsync(Builders.Filter.Where(p => p.Id.Equals(id)), + .DeleteOneAsync(Builders.Filter.Where(p => p.Id == entity.Id), cancellationToken: cancellationToken).ConfigureAwait(false); if (result.DeletedCount == 0) @@ -112,10 +111,11 @@ await _collection.InsertOneAsync(configEntity, cancellationToken: cancellationTo public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, CancellationToken cancellationToken = default) { + return _retryPolicy.ExecuteAsync(async () => { var result = await _collection - .ReplaceOneAsync(Builders.Filter.Where(p => p.Id.Equals(configEntity.Id)), + .ReplaceOneAsync(Builders.Filter.Where(p => p.Id == configEntity.Id), configEntity, cancellationToken: cancellationToken).ConfigureAwait(false); if (result.ModifiedCount == 0) { diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index 1cdbe1032..364492146 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -195,8 +195,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -206,10 +206,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -376,8 +376,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 0f2abebb3..57b20d41b 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -354,8 +354,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -365,10 +365,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -589,8 +589,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/InternalVisibleTo.cs b/src/InformaticsGateway/InternalVisibleTo.cs old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs old mode 100644 new mode 100755 index 419060787..8a7b3e8c8 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -68,5 +68,27 @@ public static partial class Log [LoggerMessage(EventId = 815, Level = LogLevel.Information, Message = "HL7 client {clientId} disconnected.")] public static partial void Hl7ClientRemoved(this ILogger logger, Guid clientId); + + [LoggerMessage(EventId = 816, Level = LogLevel.Debug, Message = "HL7 config loaded. {config}")] + public static partial void Hl7ConfigLoaded(this ILogger logger, string config); + + [LoggerMessage(EventId = 817, Level = LogLevel.Information, Message = "No HL7 config found")] + public static partial void Hl7NoConfig(this ILogger logger); + + [LoggerMessage(EventId = 818, Level = LogLevel.Debug, Message = "HL7 no matching config found for message {message}")] + public static partial void Hl7NoMatchingConfig(this ILogger logger, string message); + + [LoggerMessage(EventId = 819, Level = LogLevel.Debug, Message = "HL7 found matching config found for. {Id} config: {config}")] + public static partial void Hl7FoundMatchingConfig(this ILogger logger, string Id, string config); + + [LoggerMessage(EventId = 820, Level = LogLevel.Warning, Message = "HL7 exception thrown extracting Hl7 Info")] + public static partial void Hl7ExceptionThrow(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 821, Level = LogLevel.Warning, Message = "HL7 external App Details not found")] + public static partial void Hl7ExtAppDetailsNotFound(this ILogger logger); + + [LoggerMessage(EventId = 822, Level = LogLevel.Debug, Message = "HL7 changing value {hl7Tag} from {oldValue} to {newValue}")] + public static partial void ChangingHl7Values(this ILogger logger, string hl7Tag, string oldValue, string newValue); + } } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index a49afc36f..8b05d88c1 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 9eb227f55..0f8aaab8f 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -110,6 +110,7 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddScoped(); services.AddScoped(); diff --git a/src/InformaticsGateway/Properties/launchSettings.json b/src/InformaticsGateway/Properties/launchSettings.json deleted file mode 100755 index 11e711acb..000000000 --- a/src/InformaticsGateway/Properties/launchSettings.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "profiles": { - "Monai.Deploy.InformaticsGateway": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development", - "ELASTIC_CLIENT_APIVERSIONING": "true", - "LOGSTASH_URL": "tcp://localhost:50000", - "InformaticsGateway__messaging__publisherSettings__username": "rabbitmq", - "InformaticsGateway__messaging__publisherSettings__password": "rabbitmq", - "InformaticsGateway__messaging__subscriberSettings__username": "rabbitmq", - "InformaticsGateway__messaging__subscriberSettings__password": "rabbitmq", - "Kestrel__EndPoints__Http__Url": "http://+:5000", - "InformaticsGateway__dicom__scp__port": "1104", - "InformaticsGateway__dicom__scp__externalAppPort": "1105" - } - } - } -} \ No newline at end of file diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs old mode 100644 new mode 100755 index e2d145b6e..fd3c09bd1 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs @@ -22,11 +22,12 @@ namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 { internal interface IMllpClientFactory { - IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger); + IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, IMllpExtract mIIpExtract, ILogger logger); } internal class MllpClientFactory : IMllpClientFactory { - public IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger) => new MllpClient(client, configurations, logger); + public IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, IMllpExtract mIIpExtract, ILogger logger) + => new MllpClient(client, configurations, mIIpExtract, logger); } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs new file mode 100755 index 000000000..27e9f1371 --- /dev/null +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs @@ -0,0 +1,13 @@ + + +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +{ + internal interface IMllpExtract + { + Task ExtractInfo(Hl7FileStorageMetadata meta, Message message); + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs old mode 100644 new mode 100755 index 0a79c8d1f..3caef1a4f --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -38,6 +38,7 @@ internal sealed class MllpClient : IMllpClient private readonly List _exceptions; private readonly List _messages; private readonly IDisposable _loggerScope; + private readonly IMllpExtract _mIIpExtract; private bool _disposedValue; public Guid ClientId { get; } @@ -47,11 +48,12 @@ public string ClientIp get { return _client.RemoteEndPoint.ToString() ?? string.Empty; } } - public MllpClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger) + public MllpClient(ITcpClientAdapter client, Hl7Configuration configurations, IMllpExtract mIIpExtract, ILogger logger) { _client = client ?? throw new ArgumentNullException(nameof(client)); _configurations = configurations ?? throw new ArgumentNullException(nameof(configurations)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _mIIpExtract = mIIpExtract ?? throw new ArgumentNullException(nameof(_mIIpExtract)); ClientId = Guid.NewGuid(); _exceptions = new List(); @@ -247,4 +249,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs new file mode 100755 index 000000000..a4f75d4e6 --- /dev/null +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using FellowOakDicom; +using HL7.Dotnetcore; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +{ + internal sealed class MllpExtract : IMllpExtract + { + private readonly ILogger _logger; + private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; + private readonly IExternalAppDetailsRepository _externalAppDetailsRepository; + + public MllpExtract(IHl7ApplicationConfigRepository hl7ApplicationConfigRepository, IExternalAppDetailsRepository externalAppDetailsRepository, ILogger logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _hl7ApplicationConfigRepository = hl7ApplicationConfigRepository ?? throw new ArgumentNullException(nameof(hl7ApplicationConfigRepository)); + _externalAppDetailsRepository = externalAppDetailsRepository ?? throw new ArgumentNullException(nameof(externalAppDetailsRepository)); + } + + + public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message message) + { + try + { + // load the config + var config = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); + if (config == null) + { + _logger.Hl7NoConfig(); + return message; + } + _logger.Hl7ConfigLoaded($"Config: {config}"); + // get config for vendorId + var configItem = GetConfig(config, message); + if (configItem == null) + { + _logger.Hl7NoMatchingConfig(message.HL7Message); + return message; + } + // extract data for the given fields + // Use Id to get record from Db + var details = await GetExtAppDetails(configItem, message); + + if (details is null) + { + _logger.Hl7ExtAppDetailsNotFound(); + return message; + } + + // fill in meta data with workflowInstance and Task ID + // repopulate message with data from record + + meta.WorkflowInstanceId = details.WorkflowInstanceId; + meta.TaskId = details.ExportTaskID; + meta.ChangeCorrelationId(_logger, details.CorrelationId); + + if (string.IsNullOrEmpty(details.DestinationFolder) is false) + { + meta.File.DestinationFolderOverride = true; + meta.File.UploadPath = $"{details.DestinationFolder}/{meta.Id}{Hl7FileStorageMetadata.FileExtension}"; + } + message = RepopulateMessage(configItem, details, message); + } + catch (Exception ex) + { + _logger.Hl7ExceptionThrow(ex); + } + return message; + } + + private async Task GetExtAppDetails(Hl7ApplicationConfigEntity hl7ApplicationConfigEntity, Message message) + { + var tagId = message.GetValue(hl7ApplicationConfigEntity.DataLink.Key); + var type = hl7ApplicationConfigEntity.DataLink.Value; + switch (type) + { + case DataLinkType.PatientId: + return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()); + case DataLinkType.StudyInstanceUid: + return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()); + default: + break; + } + + throw new Exception($"Invalid DataLinkType: {type}"); + } + + internal static Hl7ApplicationConfigEntity? GetConfig(List config, Message message) + { + foreach (var item in config) + { + var t = message.GetValue(item.SendingId.Key); + if (item.SendingId.Value == message.GetValue(item.SendingId.Key)) + { + return item; + } + } + return null; + } + + private Message RepopulateMessage(Hl7ApplicationConfigEntity config, ExternalAppDetails details, Message message) + { + foreach (var item in config.DataMapping) + { + var tag = DicomTag.Parse(item.Value); + // these are the only two fields we have at the point + if (tag == DicomTag.PatientID) + { + var oldvalue = message.GetValue(item.Key); + message.SetValue(item.Key, details.PatientId); + _logger.ChangingHl7Values(item.Key, oldvalue, details.PatientId); + if (message.HL7Message.Contains(oldvalue)) + { + var newMess = message.HL7Message.Replace(oldvalue, details.PatientId); + message = new Message(newMess); + message.ParseMessage(); + } + } + else if (tag == DicomTag.StudyInstanceUID) + { + var oldvalue = message.GetValue(item.Key); + message.SetValue(item.Key, details.StudyInstanceUid); + _logger.ChangingHl7Values(item.Key, oldvalue, details.StudyInstanceUid); + if (message.HL7Message.Contains(oldvalue)) + { + var newMess = message.HL7Message.Replace(oldvalue, details.StudyInstanceUid); + message = new Message(newMess); + message.ParseMessage(); + } + } + } + return message; + } + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 24f7269cf..33e0d72ed 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -51,6 +51,7 @@ internal sealed class MllpService : IHostedService, IDisposable, IMonaiService private readonly IOptions _configuration; private readonly IStorageInfoProvider _storageInfoProvider; private readonly ConcurrentDictionary _activeTasks; + private readonly IMllpExtract _mIIpExtract; public int ActiveConnections { @@ -84,6 +85,7 @@ public MllpService(IServiceScopeFactory serviceScopeFactory, _payloadAssembler = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadAssembler)); _fileSystem = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IFileSystem)); _storageInfoProvider = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IStorageInfoProvider)); + _mIIpExtract = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IMllpExtract)); _activeTasks = new ConcurrentDictionary(); } @@ -131,7 +133,7 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) continue; } - mllpClient = _mllpClientFactory.CreateClient(client, _configuration.Value.Hl7, _logginFactory.CreateLogger()); + mllpClient = _mllpClientFactory.CreateClient(client, _configuration.Value.Hl7, _mIIpExtract, _logginFactory.CreateLogger()); _ = mllpClient.Start(OnDisconnect, cancellationToken); _activeTasks.TryAdd(mllpClient.ClientId, mllpClient); } @@ -168,11 +170,12 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) { foreach (var message in result.Messages) { - var hl7Fileetadata = new Hl7FileStorageMetadata(client.ClientId.ToString(), DataService.HL7, client.ClientIp); - await hl7Fileetadata.SetDataStream(message.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); - var payloadId = await _payloadAssembler.Queue(client.ClientId.ToString(), hl7Fileetadata, new DataOrigin { DataService = DataService.HL7, Source = client.ClientIp, Destination = FileStorageMetadata.IpAddress() }).ConfigureAwait(false); - hl7Fileetadata.PayloadId = payloadId.ToString(); - _uploadQueue.Queue(hl7Fileetadata); + var hl7Filemetadata = new Hl7FileStorageMetadata(client.ClientId.ToString(), DataService.HL7, client.ClientIp); + var newMessage = await _mIIpExtract.ExtractInfo(hl7Filemetadata, message).ConfigureAwait(false); + await hl7Filemetadata.SetDataStream(newMessage.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); + var payloadId = await _payloadAssembler.Queue(client.ClientId.ToString(), hl7Filemetadata, new DataOrigin { DataService = DataService.HL7, Source = client.ClientIp, Destination = FileStorageMetadata.IpAddress() }).ConfigureAwait(false); + hl7Filemetadata.PayloadId ??= payloadId.ToString(); + _uploadQueue.Queue(hl7Filemetadata); } } catch (Exception ex) @@ -223,4 +226,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs old mode 100644 new mode 100755 index d49913ebe..4eadd2f5c --- a/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs +++ b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs @@ -115,10 +115,9 @@ public async Task Put([FromBody] Hl7ApplicationConfigEntity confi return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); } - configEntity.Id = Guid.NewGuid(); try { - await _repository.CreateAsync(configEntity).ConfigureAwait(false); + await _repository.UpdateAsync(configEntity).ConfigureAwait(false); return Ok(configEntity.Id); } catch (Exception ex) @@ -149,7 +148,7 @@ public async Task Post([FromBody] Hl7ApplicationConfigEntity conf try { - var result = await _repository.UpdateAsync(configEntity).ConfigureAwait(false); + var result = await _repository.CreateAsync(configEntity).ConfigureAwait(false); if (result is null) { return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs new file mode 100755 index 000000000..700bec493 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -0,0 +1,160 @@ + +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using System.Threading; +using Moq; +using Xunit; +using Microsoft.Extensions.Logging; +using System; +using Monai.Deploy.InformaticsGateway.Api; +using System.Collections.Generic; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using System.Threading.Tasks; +using Monai.Deploy.InformaticsGateway.Api.Models; +using FellowOakDicom; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 +{ + public class MllPExtractTests + { + private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; + private const string AzMedMessage = "MSH|^~\\&|Rayvolve|AZMED|RIS|{InstitutionName}|{YYYYMMDDHHMMSS}||ORU^R01|{UniqueIdentifier}|P|2.5\r\nPID|{StudyInstanceUID}|{AccessionNumber}\r\nOBR|{StudyInstanceUID}||{AccessionNumber}|Rayvolve^{AlgorithmUsed}||||||||||||{AccessionNumber}|||||||F||{PriorityValues, ex: A^ASAP^HL70078}\r\nTQ1|||||||||{PriorityValues, ex: A^ASAP^HL70078}\r\nOBX|1|ST|113014^DICOM Study^DCM||{StudyInstanceUID}||||||O\r\nOBX|2|TX|59776-5^Procedure Findings^LN||{Textual findingsm, ex:\"Fracture detected\")}|||{Abnormal flag, ex : A^Abnormal^HL70078}|||F||||{ACR flag, ex : RID49482^Category 3 Non critical Actionable Finding^RadLex}\r\n"; + + private readonly Mock> _logger; + private readonly CancellationTokenSource _cancellationTokenSource; + private readonly MllpExtract _sut; + private readonly Mock _l7ApplicationConfigRepository = new Mock(); + private readonly Mock _externalAppDetailsRepository = new Mock(); + + public MllPExtractTests() + { + _logger = new Mock>(); + _cancellationTokenSource = new CancellationTokenSource(); + _sut = new MllpExtract(_l7ApplicationConfigRepository.Object, _externalAppDetailsRepository.Object, _logger.Object); + } + + [Fact(DisplayName = "Constructor Should Throw on missing arguments")] + public void Constructor_Should_Throw_on_missing_arguments() + { + Assert.Throws(() => new MllpExtract(null, null, null)); + Assert.Throws(() => new MllpExtract(_l7ApplicationConfigRepository.Object, null, null)); + Assert.Throws(() => new MllpExtract(_l7ApplicationConfigRepository.Object, _externalAppDetailsRepository.Object, null)); + + new MllpExtract(_l7ApplicationConfigRepository.Object, _externalAppDetailsRepository.Object, _logger.Object); + } + + [Fact(DisplayName = "ParseConfig Should Return Correct Item")] + public void ParseConfig_Should_Return_Correct_Item() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + var configs = new List { + new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "AZMED" } }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, + }; + + var message = new Message(SampleMessage); + var isParsed = message.ParseMessage(); + + var config = MllpExtract.GetConfig(configs, message); + Assert.Equal(correctid, config?.Id); + + message = new Message(AzMedMessage); + isParsed = message.ParseMessage(); + + config = MllpExtract.GetConfig(configs, message); + Assert.Equal(azCorrectid, config?.Id); + } + + [Fact(DisplayName = "Should Set MetaData On Hl7FileStorageMetadata Object")] + public async Task Should_Set_MetaData_On_Hl7FileStorageMetadata_Object() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + var configs = new List { + new Hl7ApplicationConfigEntity{ + Id= new Guid("00000000-0000-0000-0000-000000000001"), + SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "AZMED" } + ,DataLink = new DataKeyValuePair{ Key = "PID.1", Value = DataLinkType.StudyInstanceUid } + }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, + }; + + _l7ApplicationConfigRepository + .Setup(x => x.GetAllAsync(new CancellationToken())) + .ReturnsAsync(configs); + + _externalAppDetailsRepository.Setup(x => x.GetByStudyIdOutboundAsync("{StudyInstanceUID}", It.IsAny())) + .ReturnsAsync(new ExternalAppDetails + { + WorkflowInstanceId = "WorkflowInstanceId2", + ExportTaskID = "ExportTaskID2", + CorrelationId = "CorrelationId2", + DestinationFolder = "DestinationFolder2" + }); + + var message = new Message(AzMedMessage); + var isParsed = message.ParseMessage(); + + var meatData = new Hl7FileStorageMetadata(); + + await _sut.ExtractInfo(meatData, message); + + Assert.Equal("WorkflowInstanceId2", meatData.WorkflowInstanceId); + Assert.Equal("ExportTaskID2", meatData.TaskId); + Assert.Equal("CorrelationId2", meatData.CorrelationId); + Assert.Equal("DestinationFolder2", meatData.PayloadId); + } + + [Fact(DisplayName = "Should Set Original Patient And Study Uid")] + public async Task Should_Set_Original_Patient_And_Study_Uid() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + var configs = new List { + new Hl7ApplicationConfigEntity{ + Id= new Guid("00000000-0000-0000-0000-000000000001"), + SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "AZMED" } + ,DataLink = new DataKeyValuePair{ Key = "PID.1", Value = DataLinkType.StudyInstanceUid }, + DataMapping = new List{ + new StringKeyValuePair { Key = "PID.1", Value = DicomTag.StudyInstanceUID.ToString() }, + new StringKeyValuePair { Key = "OBR.3", Value = DicomTag.PatientID.ToString() }, + } + + }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, + }; + + _l7ApplicationConfigRepository + .Setup(x => x.GetAllAsync(new CancellationToken())) + .ReturnsAsync(configs); + + _externalAppDetailsRepository.Setup(x => x.GetByStudyIdOutboundAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new ExternalAppDetails + { + WorkflowInstanceId = "WorkflowInstanceId2", + ExportTaskID = "ExportTaskID2", + CorrelationId = "CorrelationId2", + DestinationFolder = "DestinationFolder2", + PatientId = "PatentID", + StudyInstanceUid = "StudyInstanceId" + }); + + var message = new Message(AzMedMessage); + var isParsed = message.ParseMessage(); + + var te = message.GetValue("OBR.1"); + + var meatData = new Hl7FileStorageMetadata(); + + message = await _sut.ExtractInfo(meatData, message); + + Assert.Equal("PatentID", message.GetValue("OBR.3")); + Assert.Equal("PatentID", message.GetValue("PID.2")); + Assert.Equal("StudyInstanceId", message.GetValue("PID.1")); + Assert.Equal("StudyInstanceId", message.GetValue("OBR.1")); + + } + } +} diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs old mode 100644 new mode 100755 index f9900619c..8b74f950f --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs @@ -20,6 +20,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using FellowOakDicom; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Configuration; @@ -38,6 +39,7 @@ public class MllpClientTest private readonly Hl7Configuration _config; private readonly Mock> _logger; private readonly CancellationTokenSource _cancellationTokenSource; + private readonly Mock _mIIpExtract = new Mock(); public MllpClientTest() { @@ -52,11 +54,12 @@ public MllpClientTest() [Fact(DisplayName = "Constructor")] public void Constructor() { - Assert.Throws(() => new MllpClient(null, null, null)); - Assert.Throws(() => new MllpClient(_tcpClient.Object, null, null)); - Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null)); + Assert.Throws(() => new MllpClient(null, null, null, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, null, null, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, null)); - new MllpClient(_tcpClient.Object, _config, _logger.Object); + new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); } [Fact(DisplayName = "ReceiveData - records exception thrown by network stream")] @@ -67,7 +70,7 @@ public async Task ReceiveData_ExceptionReadingStream() .ThrowsAsync(new Exception("error")); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -90,7 +93,7 @@ public async Task ReceiveData_ZeroByte() .ReturnsAsync(0); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -125,7 +128,7 @@ public async Task ReceiveData_InvalidMessage() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -166,7 +169,7 @@ public async Task ReceiveData_DisabledAck() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -207,7 +210,7 @@ public async Task ReceiveData_NeverSendAck() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -248,7 +251,7 @@ public async Task ReceiveData_ExceptionSendingAck() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -288,7 +291,7 @@ public async Task ReceiveData_CompleteWorkflow() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { @@ -334,7 +337,7 @@ public async Task ReceiveData_CompleteWorkflow_WithMultipleMessages() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); var action = new Func(async (client, results) => { diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 0c8abe39e..6c210b079 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -21,6 +21,7 @@ using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; +using HL7.Dotnetcore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -56,6 +57,7 @@ public class MllpServiceTest private readonly Mock> _logger; private readonly IServiceProvider _serviceProvider; private readonly Mock _storageInfoProvider; + private readonly Mock _mIIpExtract = new Mock(); public MllpServiceTest() { @@ -85,6 +87,7 @@ public MllpServiceTest() services.AddScoped(p => _payloadAssembler.Object); services.AddScoped(p => _fileSystem.Object); services.AddScoped(p => _storageInfoProvider.Object); + services.AddScoped(p => _mIIpExtract.Object); _serviceProvider = services.BuildServiceProvider(); _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); @@ -134,7 +137,7 @@ public async Task GivenTcpConnections_WhenConnectsAndDisconnectsFromMllpService_ var actions = new Dictionary>(); var mllpClients = new List>(); var checkEvent = new CountdownEvent(5); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { var client = new Mock(); @@ -182,7 +185,7 @@ public async Task GivenAMllpService_WhenMaximumConnectionLimitIsConfigure_Expect { var checkEvent = new CountdownEvent(_options.Value.Hl7.MaximumNumberOfConnections); var mllpClients = new List>(); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { var client = new Mock(); @@ -216,7 +219,7 @@ public async Task GivenConnectedTcpClients_WhenDisconnects_ExpectServiceToDispos var checkEvent = new ManualResetEventSlim(); var client = new Mock(); var callCount = 0; - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) @@ -274,7 +277,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT { var checkEvent = new ManualResetEventSlim(); var client = new Mock(); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) @@ -308,5 +311,44 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Exactly(3)); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); } + + [RetryFact(10, 250)] + public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageToBeRePopulated() + { + var checkEvent = new ManualResetEventSlim(); + var client = new Mock(); + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + .Returns(() => + { + client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) + .Callback, CancellationToken>((action, cancellationToken) => + { + var results = new MllpClientResult( + new List + { + new HL7.Dotnetcore.Message(""), + new HL7.Dotnetcore.Message(""), + new HL7.Dotnetcore.Message(""), + }, null); + action(client.Object, results); + checkEvent.Set(); + _cancellationTokenSource.Cancel(); + }); + client.Setup(p => p.Dispose()); + client.SetupGet(p => p.ClientId).Returns(Guid.NewGuid()); + return client.Object; + }); + + _tcpListener.Setup(p => p.AcceptTcpClientAsync(It.IsAny())) + .Returns(ValueTask.FromResult((new Mock()).Object)); + + var service = new MllpService(_serviceScopeFactory.Object, _options); + _ = service.StartAsync(_cancellationTokenSource.Token); + + Assert.True(checkEvent.Wait(3000)); + await Task.Delay(500).ConfigureAwait(false); + + _mIIpExtract.Verify(p => p.ExtractInfo(It.IsAny(), It.IsAny()), Times.Exactly(3)); + } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index f540f9174..cfeab453e 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -816,8 +816,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -827,10 +827,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -2075,7 +2075,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2088,8 +2088,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index a574afbed..6d4cb360b 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -20,11 +20,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.5-rc0006, )", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -76,16 +76,6 @@ "Swashbuckle.AspNetCore.SwaggerUI": "6.5.0" } }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0062", - "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -299,24 +289,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -341,17 +313,6 @@ "System.Text.Json": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -427,34 +388,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -497,55 +430,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -662,8 +546,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1072,11 +956,6 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" - }, "System.Diagnostics.Tools": { "type": "Transitive", "resolved": "4.3.0", @@ -1798,32 +1677,14 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0062, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 0437f4a5d..a7d285cbf 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -449,8 +449,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -460,10 +460,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1598,8 +1598,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 9e91af417..2f3a90f93 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -389,10 +389,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -592,8 +592,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index b40e1cf42..948c8b112 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index bf3fee9d0..f4895ca05 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -132,11 +132,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.5-rc0006, )", - "resolved": "1.0.5-rc0006", - "contentHash": "luSfBhU4hFwyGk7SS05sfKHwxcCYjXimfmaTjNDjFKKjIYbd3IPm8lYDPSiszbZB53jpgNvYDy+aWJY8YlVXZg==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5-rc0006", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -666,8 +666,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5-rc0006", - "contentHash": "Yr6Ix8AeKdciz7t9aeteYuDAiNpmv3FmpF9bvdvjVh46gBazf+HBdvXdbWWXgzNTd3yevsQGBKazQXN9ecqwog==", + "resolved": "1.0.5", + "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1954,7 +1954,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1967,8 +1967,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5-rc0006, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5-rc0006, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } From 70bd721a133d49a7a77865b3c65b9c2f87ffcd3c Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 11:28:00 +0000 Subject: [PATCH 38/75] fix package locks Signed-off-by: Neil South --- src/Api/Test/packages.lock.json | 2 +- src/Api/packages.lock.json | 2 +- src/CLI/Test/packages.lock.json | 2 +- src/CLI/packages.lock.json | 2 +- src/Client/Test/packages.lock.json | 2 +- src/Client/packages.lock.json | 2 +- src/Configuration/Test/packages.lock.json | 2 +- src/Configuration/packages.lock.json | 2 +- src/Database/Api/Test/packages.lock.json | 2 +- src/Database/Api/packages.lock.json | 2 +- src/Database/EntityFramework/Test/packages.lock.json | 2 +- src/Database/EntityFramework/packages.lock.json | 2 +- src/Database/MongoDB/Integration.Test/packages.lock.json | 2 +- src/Database/MongoDB/packages.lock.json | 2 +- src/Database/packages.lock.json | 2 +- src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs | 2 +- src/InformaticsGateway/Test/packages.lock.json | 2 +- src/InformaticsGateway/packages.lock.json | 2 +- src/Plug-ins/RemoteAppExecution/Test/packages.lock.json | 2 +- src/Plug-ins/RemoteAppExecution/packages.lock.json | 2 +- tests/Integration.Test/packages.lock.json | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 5d1fdf066..960260ab0 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -250,7 +250,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 7b9362503..7a0e13553 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -37,7 +37,7 @@ "type": "Direct", "requested": "[1.0.5, )", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 41efaefab..fbf0b8e0b 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -498,7 +498,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index f83666c82..998103f58 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -400,7 +400,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 6c873a044..b9ed06a16 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -560,7 +560,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index 51038a996..9c1cf1a50 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -156,7 +156,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index b6fc3ff08..9dd1f6fbb 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -258,7 +258,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index 73698c335..0e46e600b 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -156,7 +156,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index 14f526e45..b9bbb761e 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -232,7 +232,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index 3278ebc58..f3cf23d5d 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -162,7 +162,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 8226f9a77..92b75737f 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -393,7 +393,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index cee402d1a..fb3e4284b 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -316,7 +316,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index 426d87448..e7cebc469 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -275,7 +275,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index 364492146..05b4b6130 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -196,7 +196,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 57b20d41b..c25dcd416 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -355,7 +355,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs index a4f75d4e6..d49e861a6 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -66,7 +66,7 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess if (string.IsNullOrEmpty(details.DestinationFolder) is false) { meta.File.DestinationFolderOverride = true; - meta.File.UploadPath = $"{details.DestinationFolder}/{meta.Id}{Hl7FileStorageMetadata.FileExtension}"; + meta.File.UploadPath = $"{details.DestinationFolder}/{meta.DataTypeDirectoryName}/{meta.Id}{Hl7FileStorageMetadata.FileExtension}"; } message = RepopulateMessage(configItem, details, message); } diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index cfeab453e..44e9f81a8 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -817,7 +817,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 6d4cb360b..cf6615560 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -547,7 +547,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index a7d285cbf..ee2367651 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -450,7 +450,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 2f3a90f93..b4e38d44e 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -379,7 +379,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index f4895ca05..fefde1dd6 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -667,7 +667,7 @@ "Monai.Deploy.Messaging": { "type": "Transitive", "resolved": "1.0.5", - "contentHash": "D7JfvOxsfTOOrp9oFJas3fddEg5A7sDzro6pc8psMnX4H/pztKxmFe7cs/sUjN9OpygKFPY7OI4oPmeSsba+Wg==", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", From 03472939f2f3a66badee6fbac36113255cdf0af3 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 11:56:24 +0000 Subject: [PATCH 39/75] fixup tests Signed-off-by: Neil South --- .../Test/Services/HealthLevel7/MllPExtractTests.cs | 7 ++++--- .../Test/Services/HealthLevel7/MllpServiceTest.cs | 6 ++++++ .../Services/Http/Hl7ApplicationConfigControllerTest.cs | 6 +++--- 3 files changed, 13 insertions(+), 6 deletions(-) mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs index 700bec493..7b87fb683 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -97,14 +97,14 @@ public async Task Should_Set_MetaData_On_Hl7FileStorageMetadata_Object() var message = new Message(AzMedMessage); var isParsed = message.ParseMessage(); - var meatData = new Hl7FileStorageMetadata(); + var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; await _sut.ExtractInfo(meatData, message); Assert.Equal("WorkflowInstanceId2", meatData.WorkflowInstanceId); Assert.Equal("ExportTaskID2", meatData.TaskId); Assert.Equal("CorrelationId2", meatData.CorrelationId); - Assert.Equal("DestinationFolder2", meatData.PayloadId); + Assert.StartsWith("DestinationFolder2", meatData.File.UploadPath); } [Fact(DisplayName = "Should Set Original Patient And Study Uid")] @@ -146,7 +146,8 @@ public async Task Should_Set_Original_Patient_And_Study_Uid() var te = message.GetValue("OBR.1"); - var meatData = new Hl7FileStorageMetadata(); + var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; + message = await _sut.ExtractInfo(meatData, message); diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 6c210b079..403f51d71 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -277,6 +277,8 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT { var checkEvent = new ManualResetEventSlim(); var client = new Mock(); + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg) => Msg); _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { @@ -317,6 +319,10 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT { var checkEvent = new ManualResetEventSlim(); var client = new Mock(); + + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg) => Msg); + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { diff --git a/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs old mode 100644 new mode 100755 index 38d1bc89a..34dc2a2a8 --- a/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs @@ -196,7 +196,7 @@ public async Task Put_GiveExpectedInput_ReturnsInternalServerError() var validApplicationEntity = ValidApplicationEntity("0001,0001"); _repo.Setup(r => r.GetByIdAsync(It.IsAny())) .ReturnsAsync(validApplicationEntity); - _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) .Throws(new DatabaseException()); var result = await _controller.Put(validApplicationEntity); @@ -219,7 +219,7 @@ public async Task Post_GiveExpectedInput_ReturnsOK(string dicomStr) _repo.Setup(r => r.GetByIdAsync(It.IsAny())) .ReturnsAsync(validApplicationEntity); - _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(validApplicationEntity); var result = await _controller.Post(validApplicationEntity); @@ -309,7 +309,7 @@ public async Task Post_GiveExpectedInput_ReturnsInternalServerError2() var validApplicationEntity = ValidApplicationEntity("0001,0001"); _repo.Setup(r => r.GetByIdAsync(It.IsAny())) .ReturnsAsync(validApplicationEntity); - _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) .Throws(new Exception()); var result = await _controller.Post(validApplicationEntity); From f03fd890ad28cc19b273a0f4beb743335ae9bab2 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 12:34:28 +0000 Subject: [PATCH 40/75] adding headers Signed-off-by: Neil South --- .../Services/HealthLevel7/IMllpExtract.cs | 17 ++++++++++++++++- .../Services/HealthLevel7/MllpExtract.cs | 19 ++++++++++++++++++- .../Services/HealthLevel7/MllPExtractTests.cs | 17 +++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs index 27e9f1371..8fd8bbf37 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs @@ -1,4 +1,19 @@ - +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + using System.Threading.Tasks; using HL7.Dotnetcore; diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs index d49e861a6..94b2437fa 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -1,4 +1,21 @@ -using System; +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs index 7b87fb683..5ede3476a 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -1,4 +1,21 @@  +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; using System.Threading; using Moq; From 221e1ced3488b0d6a9825e90406d414006a91dfc Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 14:22:47 +0000 Subject: [PATCH 41/75] added migration Signed-off-by: Neil South --- .../20231123141944_addHl7Config.Designer.cs | 520 ++++++++++++++++++ .../Migrations/20231123141944_addHl7Config.cs | 106 ++++ .../InformaticsGatewayContextModelSnapshot.cs | 89 +++ ....Deploy.InformaticsGateway.Database.csproj | 4 + src/Database/packages.lock.json | 73 ++- .../Monai.Deploy.InformaticsGateway.csproj | 4 + src/InformaticsGateway/packages.lock.json | 37 +- 7 files changed, 797 insertions(+), 36 deletions(-) create mode 100755 src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs diff --git a/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs b/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs new file mode 100755 index 000000000..f1346c6dc --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs @@ -0,0 +1,520 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231123141944_addHl7Config")] + partial class addHl7Config + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("INTEGER"); + + b.HasKey("Key"); + + b.ToTable("DataKeyValuePair"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DataLinkKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("SendingIdKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("DataLinkKey"); + + b.HasIndex("SendingIdKey"); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Hl7ApplicationConfigEntityId") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.HasIndex("Hl7ApplicationConfigEntityId"); + + b.ToTable("StringKeyValuePair"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.HasOne("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", "DataLink") + .WithMany() + .HasForeignKey("DataLinkKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", "SendingId") + .WithMany() + .HasForeignKey("SendingIdKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DataLink"); + + b.Navigation("SendingId"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => + { + b.HasOne("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", null) + .WithMany("DataMapping") + .HasForeignKey("Hl7ApplicationConfigEntityId"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Navigation("DataMapping"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs b/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs new file mode 100755 index 000000000..679888525 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs @@ -0,0 +1,106 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class addHl7Config : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "DataKeyValuePair", + columns: table => new + { + Key = table.Column(type: "TEXT", nullable: false), + Value = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_DataKeyValuePair", x => x.Key); + }); + + migrationBuilder.CreateTable( + name: "Hl7ApplicationConfig", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + SendingIdKey = table.Column(type: "TEXT", nullable: false), + DataLinkKey = table.Column(type: "TEXT", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Hl7ApplicationConfig", x => x.Id); + table.ForeignKey( + name: "FK_Hl7ApplicationConfig_DataKeyValuePair_DataLinkKey", + column: x => x.DataLinkKey, + principalTable: "DataKeyValuePair", + principalColumn: "Key", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "StringKeyValuePair", + columns: table => new + { + Key = table.Column(type: "TEXT", nullable: false), + Value = table.Column(type: "TEXT", nullable: false), + Hl7ApplicationConfigEntityId = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_StringKeyValuePair", x => x.Key); + table.ForeignKey( + name: "FK_StringKeyValuePair_Hl7ApplicationConfig_Hl7ApplicationConfigEntityId", + column: x => x.Hl7ApplicationConfigEntityId, + principalTable: "Hl7ApplicationConfig", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_Hl7ApplicationConfig_DataLinkKey", + table: "Hl7ApplicationConfig", + column: "DataLinkKey"); + + migrationBuilder.CreateIndex( + name: "IX_Hl7ApplicationConfig_SendingIdKey", + table: "Hl7ApplicationConfig", + column: "SendingIdKey"); + + migrationBuilder.CreateIndex( + name: "IX_StringKeyValuePair_Hl7ApplicationConfigEntityId", + table: "StringKeyValuePair", + column: "Hl7ApplicationConfigEntityId"); + + migrationBuilder.AddForeignKey( + name: "FK_Hl7ApplicationConfig_StringKeyValuePair_SendingIdKey", + table: "Hl7ApplicationConfig", + column: "SendingIdKey", + principalTable: "StringKeyValuePair", + principalColumn: "Key", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Hl7ApplicationConfig_DataKeyValuePair_DataLinkKey", + table: "Hl7ApplicationConfig"); + + migrationBuilder.DropForeignKey( + name: "FK_Hl7ApplicationConfig_StringKeyValuePair_SendingIdKey", + table: "Hl7ApplicationConfig"); + + migrationBuilder.DropTable( + name: "DataKeyValuePair"); + + migrationBuilder.DropTable( + name: "StringKeyValuePair"); + + migrationBuilder.DropTable( + name: "Hl7ApplicationConfig"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs index 888d54c32..6fd769dc5 100755 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -17,6 +17,45 @@ protected override void BuildModel(ModelBuilder modelBuilder) #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("INTEGER"); + + b.HasKey("Key"); + + b.ToTable("DataKeyValuePair"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DataLinkKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("SendingIdKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("DataLinkKey"); + + b.HasIndex("SendingIdKey"); + + b.ToTable("Hl7ApplicationConfig"); + }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => { b.Property("Name") @@ -353,6 +392,25 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Payloads"); }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Hl7ApplicationConfigEntityId") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.HasIndex("Hl7ApplicationConfigEntityId"); + + b.ToTable("StringKeyValuePair"); + }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => { b.Property("Name") @@ -423,6 +481,37 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("StorageMetadataWrapperEntities"); }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.HasOne("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", "DataLink") + .WithMany() + .HasForeignKey("DataLinkKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", "SendingId") + .WithMany() + .HasForeignKey("SendingIdKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DataLink"); + + b.Navigation("SendingId"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => + { + b.HasOne("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", null) + .WithMany("DataMapping") + .HasForeignKey("Hl7ApplicationConfigEntityId"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Navigation("DataMapping"); + }); #pragma warning restore 612, 618 } } diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index 2fab0c504..39e7885f8 100755 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -68,6 +68,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index c25dcd416..0c969d34f 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -12,6 +12,15 @@ "MongoDB.Driver": "2.14.1" } }, + "Microsoft.EntityFrameworkCore.Tools": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "m9e6nFnkyRdKcrTFO8rl3ZihCIKrYdECw+fHZVbKz6TBMwKhih/N0sjPnNt0k7sZPvI8izKPkh1d+z4OR2qgXQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Design": "6.0.0" + } + }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Direct", "requested": "[6.0.22, )", @@ -85,6 +94,11 @@ "System.Threading.Channels": "6.0.0" } }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.8.26", + "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -132,6 +146,15 @@ "resolved": "6.0.22", "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "RFdomymyuPNffl+VPk7osdxCJQ0xlGuxr28ifdfFFNUaMK0OYiJOjr6w9z3kscOM2p2gdPWNI1IFUXllEyphow==", + "dependencies": { + "Humanizer.Core": "2.8.26", + "Microsoft.EntityFrameworkCore.Relational": "6.0.0" + } + }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", "resolved": "6.0.22", @@ -586,56 +609,56 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { - "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", - "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "1.0.5", + "Monai.Deploy.Messaging.RabbitMQ": "1.0.5", + "Monai.Deploy.Storage": "0.2.18", + "fo-dicom": "5.1.1" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "4.1.1", + "System.IO.Abstractions": "17.2.3" } }, "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", - "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" + "Monai.Deploy.InformaticsGateway.Api": "0.4.1", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", - "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "Monai.Deploy.InformaticsGateway.Api": "0.4.1", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "NLog": "5.2.4" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", - "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite": "6.0.22", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "0.4.1", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0", + "Polly": "7.2.4" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0", + "MongoDB.Driver": "2.21.0", + "Polly": "7.2.4" } } } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index 8b05d88c1..f1f927dd4 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,6 +38,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index cf6615560..c20df1cb4 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -18,6 +18,16 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Direct", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "dependencies": { + "Humanizer.Core": "2.8.26", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + } + }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", "requested": "[1.0.5, )", @@ -142,6 +152,11 @@ "System.Threading.Channels": "6.0.0" } }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.8.26", + "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -189,11 +204,11 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -203,20 +218,20 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, From 20d97c78cbe3a1bbc8dec40db405d01b27ef692c Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 14:39:26 +0000 Subject: [PATCH 42/75] fix licencing Signed-off-by: Neil South --- doc/dependency_decisions.yml | 22 ++++-- src/Client/Test/packages.lock.json | 48 ++++++------ ...icsGateway.Database.EntityFramework.csproj | 4 +- .../EntityFramework/Test/packages.lock.json | 26 +++---- .../EntityFramework/packages.lock.json | 34 ++++----- src/Database/packages.lock.json | 74 +++++++++---------- .../Test/packages.lock.json | 48 ++++++------ src/InformaticsGateway/packages.lock.json | 26 +++---- ...sGateway.PlugIns.RemoteAppExecution.csproj | 8 +- .../Test/packages.lock.json | 28 +++---- .../RemoteAppExecution/packages.lock.json | 54 +++++++------- tests/Integration.Test/packages.lock.json | 14 ++-- 12 files changed, 199 insertions(+), 187 deletions(-) mode change 100644 => 100755 src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 76a3d3473..0911839d3 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -321,6 +321,7 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 + - 6.0.25 :when: 2022-08-16 23:05:50.137694970 Z - - :approve - Microsoft.EntityFrameworkCore.Abstractions @@ -328,21 +329,24 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:51.008105271 Z + - 6.0.25 + - :when: 2022-08-16 23:05:51.008105271 Z - - :approve - Microsoft.EntityFrameworkCore.Analyzers - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:51.445711308 Z + - 6.0.25 + - :when: 2022-08-16 23:05:51.445711308 Z - - :approve - Microsoft.EntityFrameworkCore.Design - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:51.922790944 Z + - 6.0.25 + - :when: 2022-08-16 23:05:51.922790944 Z - - :approve - Microsoft.EntityFrameworkCore.InMemory - :who: mocsharp @@ -356,13 +360,21 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:52.828879230 Z + - 6.0.25 + - :when: 2022-08-16 23:05:52.828879230 Z +- - :approve + - Microsoft.EntityFrameworkCore.Tools + - :who: ndsouth + :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) + :versions: + - 6.0.25 + - :when: 2022-08-16 23:05:52.828879230 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.22 + - 6.0.25 :when: 2022-08-16 23:05:53.270526921 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite.Core diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index b9ed06a16..dd7893075 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -176,19 +176,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -198,39 +198,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -1887,7 +1887,7 @@ "type": "Project", "dependencies": { "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -1916,9 +1916,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj old mode 100644 new mode 100755 index b99824dd2..c8e15c6f2 --- a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj +++ b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj @@ -43,11 +43,11 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 92b75737f..a79c1a8d0 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -124,8 +124,8 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } @@ -156,29 +156,29 @@ }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -1503,7 +1503,7 @@ "type": "Project", "dependencies": { "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index fb3e4284b..722035486 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -19,21 +19,21 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "es9TKd0cpM263Ou0QMEETN7MDzD7kXDkThiiXl1+c/69v97AZlzeLoM5tDdC0RC4L74ZWyk3+WMnoDPL93DDyQ==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, @@ -132,8 +132,8 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } @@ -150,20 +150,20 @@ }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 0c969d34f..916aeec37 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -116,8 +116,8 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } @@ -157,29 +157,29 @@ }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -609,56 +609,56 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { - "Macross.Json.Extensions": "3.0.0", - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Monai.Deploy.InformaticsGateway.Common": "1.0.0", - "Monai.Deploy.Messaging": "1.0.5", - "Monai.Deploy.Messaging.RabbitMQ": "1.0.5", - "Monai.Deploy.Storage": "0.2.18", - "fo-dicom": "5.1.1" + "Macross.Json.Extensions": "[3.0.0, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", + "Monai.Deploy.Storage": "[0.2.18, )", + "fo-dicom": "[5.1.1, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "System.IO.Abstractions": "17.2.3" + "Ardalis.GuardClauses": "[4.1.1, )", + "System.IO.Abstractions": "[17.2.3, )" } }, "monai.deploy.informaticsgateway.configuration": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "0.4.1", - "Monai.Deploy.InformaticsGateway.Common": "1.0.0" + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", + "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )" } }, "monai.deploy.informaticsgateway.database.api": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Api": "0.4.1", - "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", - "NLog": "5.2.4" + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", + "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", + "NLog": "[5.2.4, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", - "Microsoft.EntityFrameworkCore.Sqlite": "6.0.22", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Monai.Deploy.InformaticsGateway.Api": "0.4.1", - "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", - "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0", - "Polly": "7.2.4" + "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", + "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", + "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", + "Polly": "[7.2.4, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { - "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0", - "MongoDB.Driver": "2.21.0", - "Polly": "7.2.4" + "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", + "MongoDB.Driver": "[2.21.0, )", + "Polly": "[7.2.4, )" } } } diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 44e9f81a8..578e48dae 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -419,19 +419,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -441,39 +441,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -2139,7 +2139,7 @@ "type": "Project", "dependencies": { "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -2168,9 +2168,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index c20df1cb4..8af1d35da 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -196,8 +196,8 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } @@ -237,20 +237,20 @@ }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -1749,7 +1749,7 @@ "type": "Project", "dependencies": { "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -1778,9 +1778,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj index bf2bc0cd2..f3de2abe0 100755 --- a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj +++ b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj @@ -47,13 +47,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index ee2367651..50e70c859 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -179,11 +179,11 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -193,20 +193,20 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, @@ -1629,9 +1629,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index b4e38d44e..c10ba4664 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -4,12 +4,12 @@ "net6.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -19,31 +19,31 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "es9TKd0cpM263Ou0QMEETN7MDzD7kXDkThiiXl1+c/69v97AZlzeLoM5tDdC0RC4L74ZWyk3+WMnoDPL93DDyQ==", + "requested": "[6.0.5, )", + "resolved": "6.0.5", + "contentHash": "zNjMWJ6MJ/Qm7S6wFBqVgn7DEpilbDMy0xgA7c4Y1yY9/LoaC2pWwWO4ePaYoPCZpLx/eTViWEr5ZXta/vK//Q==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.5" } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, @@ -191,29 +191,29 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index fefde1dd6..337948108 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -363,10 +363,10 @@ }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, @@ -2025,7 +2025,7 @@ "type": "Project", "dependencies": { "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -2054,9 +2054,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", From 1d57f954437de00669e468bba03e302d750a4267 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 14:43:06 +0000 Subject: [PATCH 43/75] fix up packages Signed-off-by: Neil South --- doc/dependency_decisions.yml | 1 + ...Monai.Deploy.InformaticsGateway.Api.csproj | 2 +- src/Api/Test/packages.lock.json | 6 +- src/Api/packages.lock.json | 6 +- src/CLI/Test/packages.lock.json | 6 +- src/CLI/packages.lock.json | 6 +- src/Client/Test/packages.lock.json | 26 ++++---- src/Client/packages.lock.json | 6 +- src/Configuration/Test/packages.lock.json | 6 +- src/Configuration/packages.lock.json | 6 +- src/Database/Api/Test/packages.lock.json | 6 +- src/Database/Api/packages.lock.json | 6 +- ...icsGateway.Database.EntityFramework.csproj | 2 +- ...teway.Database.EntityFramework.Test.csproj | 2 +- .../EntityFramework/Test/packages.lock.json | 28 ++++---- .../EntityFramework/packages.lock.json | 20 +++--- ....Deploy.InformaticsGateway.Database.csproj | 2 +- .../Integration.Test/packages.lock.json | 6 +- src/Database/MongoDB/packages.lock.json | 6 +- src/Database/packages.lock.json | 42 ++++++------ ...onai.Deploy.InformaticsGateway.Test.csproj | 2 +- .../Test/packages.lock.json | 34 +++++----- src/InformaticsGateway/packages.lock.json | 26 ++++---- ...way.PlugIns.RemoteAppExecution.Test.csproj | 6 +- .../Test/packages.lock.json | 32 +++++----- .../RemoteAppExecution/packages.lock.json | 2 +- ...InformaticsGateway.Integration.Test.csproj | 4 +- tests/Integration.Test/packages.lock.json | 64 +++++++++---------- 28 files changed, 181 insertions(+), 180 deletions(-) mode change 100644 => 100755 src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 0911839d3..f54a2b686 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -382,6 +382,7 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 + - 6.0.25 :when: 2022-08-16 23:05:53.706997823 Z - - :approve - Microsoft.Extensions.ApiDescription.Server diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index 05bbef5d0..f4b8450b0 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -54,7 +54,7 @@ - + diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 960260ab0..c3b2fbbdd 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -116,8 +116,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -1278,7 +1278,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 7a0e13553..2f0038d42 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -29,9 +29,9 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Monai.Deploy.Messaging": { "type": "Direct", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index fbf0b8e0b..7ae5d5d97 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -164,8 +164,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", @@ -1561,7 +1561,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 998103f58..75418ec51 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -115,8 +115,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", @@ -542,7 +542,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index dd7893075..49b143571 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -336,10 +336,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -347,17 +347,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -1827,7 +1827,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", @@ -1866,7 +1866,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1886,7 +1886,7 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index 9c1cf1a50..d3be0afb3 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -60,8 +60,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -275,7 +275,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 9dd1f6fbb..9265712dc 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -124,8 +124,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -1291,7 +1291,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index 0e46e600b..5af67fda9 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -60,8 +60,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -275,7 +275,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index b9bbb761e..93a1cc3a7 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -98,8 +98,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -1265,7 +1265,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index f3cf23d5d..f86d76521 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -66,8 +66,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -281,7 +281,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj index c8e15c6f2..d9ad95499 100755 --- a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj +++ b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj @@ -42,7 +42,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj old mode 100644 new mode 100755 index c9ad64d69..abff60683 --- a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj +++ b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index a79c1a8d0..40ce6d70b 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -10,11 +10,11 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22" + "Microsoft.EntityFrameworkCore": "6.0.25" } }, "Microsoft.NET.Test.Sdk": { @@ -132,11 +132,11 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -146,13 +146,13 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", @@ -1469,7 +1469,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", @@ -1502,7 +1502,7 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 722035486..c80430fab 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -4,12 +4,12 @@ "net6.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -140,13 +140,13 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", @@ -473,7 +473,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index 39e7885f8..b4094d404 100755 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -72,7 +72,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index e7cebc469..8ad2d5e4f 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -132,8 +132,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -1396,7 +1396,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index 05b4b6130..b248f4c03 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -86,8 +86,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -374,7 +374,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 916aeec37..3c1e951e4 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -23,13 +23,13 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { @@ -124,11 +124,11 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -138,13 +138,13 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Design": { "type": "Transitive", @@ -280,10 +280,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -291,8 +291,8 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", @@ -610,7 +610,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", @@ -643,7 +643,7 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj index 0f1df6ef4..7c303125e 100755 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 578e48dae..5820049ac 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -31,11 +31,11 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22" + "Microsoft.EntityFrameworkCore": "6.0.25" } }, "Microsoft.NET.Test.Sdk": { @@ -579,10 +579,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -590,17 +590,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -2086,7 +2086,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", @@ -2118,7 +2118,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -2138,7 +2138,7 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 8af1d35da..630572169 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -356,10 +356,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -367,17 +367,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -1696,7 +1696,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", @@ -1728,7 +1728,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1748,7 +1748,7 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj b/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj old mode 100644 new mode 100755 index a1070e061..22f46686c --- a/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj +++ b/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj @@ -43,9 +43,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 50e70c859..4d70f5c72 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -10,31 +10,31 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22" + "Microsoft.EntityFrameworkCore": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -171,8 +171,8 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } @@ -1596,7 +1596,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index c10ba4664..14b902761 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -590,7 +590,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index 948c8b112..2d79b05c2 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -30,8 +30,8 @@ - - + + diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index 337948108..c3b9e5483 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -44,12 +44,12 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -59,11 +59,11 @@ }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, @@ -345,21 +345,21 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", @@ -372,11 +372,11 @@ }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -453,10 +453,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -464,17 +464,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -1965,7 +1965,7 @@ "type": "Project", "dependencies": { "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.Messaging": "[1.0.5, )", "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", @@ -2004,7 +2004,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -2024,7 +2024,7 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", From 810eb66ede2554fad05be838cabd16f6a5e42b49 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 23 Nov 2023 15:40:05 +0000 Subject: [PATCH 44/75] more dependancy fixups Signed-off-by: Neil South --- doc/dependency_decisions.yml | 15 ++++++++++----- ...onai.Deploy.InformaticsGateway.Database.csproj | 2 +- src/Database/packages.lock.json | 14 +++++++------- .../Services/HealthLevel7/MllPExtractTests.cs | 14 +++++++------- ...aticsGateway.PlugIns.RemoteAppExecution.csproj | 2 +- .../RemoteAppExecution/packages.lock.json | 8 ++++---- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index f54a2b686..dc7dcac0a 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -314,7 +314,8 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:49.698463427 Z + - 6.0.25 + - :when: 2022-08-16 23:05:49.698463427 Z - - :approve - Microsoft.EntityFrameworkCore - :who: mocsharp @@ -353,7 +354,8 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:52.375150938 Z + - 6.0.25 + - :when: 2022-08-16 23:05:52.375150938 Z - - :approve - Microsoft.EntityFrameworkCore.Relational - :who: mocsharp @@ -525,7 +527,8 @@ :versions: - 6.0.21 - 6.0.22 - :when: 2022-08-29 18:11:22.090772006 Z + - 6.0.25 + - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - :who: mocsharp @@ -533,14 +536,16 @@ :versions: - 6.0.21 - 6.0.22 - :when: 2022-08-29 18:11:22.090772006 Z + - 6.0.25 + - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore - :who: mocsharp :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-29 18:11:22.090772006 Z + - 6.0.25 + - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.FileProviders.Abstractions - :who: mocsharp diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index b4094d404..bf29f1d77 100755 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -68,7 +68,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 3c1e951e4..9fa7405f1 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -14,11 +14,11 @@ }, "Microsoft.EntityFrameworkCore.Tools": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "m9e6nFnkyRdKcrTFO8rl3ZihCIKrYdECw+fHZVbKz6TBMwKhih/N0sjPnNt0k7sZPvI8izKPkh1d+z4OR2qgXQ==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "2iPMR+DHXh2Xn9qoJ0ejzdHblpns73e1pZ/pyRbYDQi0HPJyq1/pTYDda1owJ5W2lxAGDg8l5Fl1jVp97fTR1g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Design": "6.0.0" + "Microsoft.EntityFrameworkCore.Design": "6.0.25" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { @@ -148,11 +148,11 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "RFdomymyuPNffl+VPk7osdxCJQ0xlGuxr28ifdfFFNUaMK0OYiJOjr6w9z3kscOM2p2gdPWNI1IFUXllEyphow==", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.0" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Relational": { diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs index 5ede3476a..ff25d27ac 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -36,7 +36,7 @@ namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 public class MllPExtractTests { private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; - private const string AzMedMessage = "MSH|^~\\&|Rayvolve|AZMED|RIS|{InstitutionName}|{YYYYMMDDHHMMSS}||ORU^R01|{UniqueIdentifier}|P|2.5\r\nPID|{StudyInstanceUID}|{AccessionNumber}\r\nOBR|{StudyInstanceUID}||{AccessionNumber}|Rayvolve^{AlgorithmUsed}||||||||||||{AccessionNumber}|||||||F||{PriorityValues, ex: A^ASAP^HL70078}\r\nTQ1|||||||||{PriorityValues, ex: A^ASAP^HL70078}\r\nOBX|1|ST|113014^DICOM Study^DCM||{StudyInstanceUID}||||||O\r\nOBX|2|TX|59776-5^Procedure Findings^LN||{Textual findingsm, ex:\"Fracture detected\")}|||{Abnormal flag, ex : A^Abnormal^HL70078}|||F||||{ACR flag, ex : RID49482^Category 3 Non critical Actionable Finding^RadLex}\r\n"; + private const string ABCDEMessage = "MSH|^~\\&|Rayvolve|ABCDE|RIS|{InstitutionName}|{YYYYMMDDHHMMSS}||ORU^R01|{UniqueIdentifier}|P|2.5\r\nPID|{StudyInstanceUID}|{AccessionNumber}\r\nOBR|{StudyInstanceUID}||{AccessionNumber}|Rayvolve^{AlgorithmUsed}||||||||||||{AccessionNumber}|||||||F||{PriorityValues, ex: A^ASAP^HL70078}\r\nTQ1|||||||||{PriorityValues, ex: A^ASAP^HL70078}\r\nOBX|1|ST|113014^DICOM Study^DCM||{StudyInstanceUID}||||||O\r\nOBX|2|TX|59776-5^Procedure Findings^LN||{Textual findingsm, ex:\"Fracture detected\")}|||{Abnormal flag, ex : A^Abnormal^HL70078}|||F||||{ACR flag, ex : RID49482^Category 3 Non critical Actionable Finding^RadLex}\r\n"; private readonly Mock> _logger; private readonly CancellationTokenSource _cancellationTokenSource; @@ -67,7 +67,7 @@ public void ParseConfig_Should_Return_Correct_Item() var correctid = new Guid("00000000-0000-0000-0000-000000000002"); var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); var configs = new List { - new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "AZMED" } }, + new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } }, new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, }; @@ -77,7 +77,7 @@ public void ParseConfig_Should_Return_Correct_Item() var config = MllpExtract.GetConfig(configs, message); Assert.Equal(correctid, config?.Id); - message = new Message(AzMedMessage); + message = new Message(ABCDEMessage); isParsed = message.ParseMessage(); config = MllpExtract.GetConfig(configs, message); @@ -92,7 +92,7 @@ public async Task Should_Set_MetaData_On_Hl7FileStorageMetadata_Object() var configs = new List { new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), - SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "AZMED" } + SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } ,DataLink = new DataKeyValuePair{ Key = "PID.1", Value = DataLinkType.StudyInstanceUid } }, new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, @@ -111,7 +111,7 @@ public async Task Should_Set_MetaData_On_Hl7FileStorageMetadata_Object() DestinationFolder = "DestinationFolder2" }); - var message = new Message(AzMedMessage); + var message = new Message(ABCDEMessage); var isParsed = message.ParseMessage(); var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; @@ -132,7 +132,7 @@ public async Task Should_Set_Original_Patient_And_Study_Uid() var configs = new List { new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), - SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "AZMED" } + SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } ,DataLink = new DataKeyValuePair{ Key = "PID.1", Value = DataLinkType.StudyInstanceUid }, DataMapping = new List{ new StringKeyValuePair { Key = "PID.1", Value = DicomTag.StudyInstanceUID.ToString() }, @@ -158,7 +158,7 @@ public async Task Should_Set_Original_Patient_And_Study_Uid() StudyInstanceUid = "StudyInstanceId" }); - var message = new Message(AzMedMessage); + var message = new Message(ABCDEMessage); var isParsed = message.ParseMessage(); var te = message.GetValue("OBR.1"); diff --git a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj index f3de2abe0..b02fccd0a 100755 --- a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj +++ b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj @@ -48,7 +48,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 14b902761..5c4215fea 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -19,12 +19,12 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.5, )", - "resolved": "6.0.5", - "contentHash": "zNjMWJ6MJ/Qm7S6wFBqVgn7DEpilbDMy0xgA7c4Y1yY9/LoaC2pWwWO4ePaYoPCZpLx/eTViWEr5ZXta/vK//Q==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.5" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Relational": { From ff5797b6f5a45c9732893f9f6e6bb9d8a2ee0fef Mon Sep 17 00:00:00 2001 From: Migle Markeviciute Date: Thu, 23 Nov 2023 11:03:47 +0000 Subject: [PATCH 45/75] Add HL7 destination configuration Signed-off-by: Migle Markeviciute --- src/Api/HL7DestinationEntity.cs | 40 +++ src/Api/Test/HL7DestinationEntityTest.cs | 53 +++ src/Configuration/ValidationExtensions.cs | 15 + .../IHL7DestinationEntityRepository.cs | 36 +++ .../HL7DestinationEntityConfiguration.cs | 43 +++ .../InformaticsGatewayContext.cs | 2 + .../HL7DestinationEntityRepository.cs | 143 ++++++++ .../HL7DestinationEntityRepositoryTest.cs | 159 +++++++++ .../Test/SqliteDatabaseFixture.cs | 19 ++ .../HL7DestinationEntityConfiguration.cs | 34 ++ .../HL7DestinationEntityRepositoryTest.cs | 166 ++++++++++ .../Integration.Test/MongoDatabaseFixture.cs | 17 + .../HL7DestinationEntityRepository.cs | 170 ++++++++++ .../Logging/Log.8000.HttpServices.cs | 22 ++ .../Services/Http/HL7DestinationController.cs | 306 ++++++++++++++++++ 15 files changed, 1225 insertions(+) create mode 100644 src/Api/HL7DestinationEntity.cs create mode 100644 src/Api/Test/HL7DestinationEntityTest.cs create mode 100644 src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs create mode 100644 src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs create mode 100644 src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs create mode 100644 src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs create mode 100644 src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs create mode 100644 src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs create mode 100644 src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs create mode 100644 src/InformaticsGateway/Services/Http/HL7DestinationController.cs diff --git a/src/Api/HL7DestinationEntity.cs b/src/Api/HL7DestinationEntity.cs new file mode 100644 index 000000000..bd9ceda70 --- /dev/null +++ b/src/Api/HL7DestinationEntity.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2020 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Monai.Deploy.InformaticsGateway.Api +{ + /// + /// HL7 Destination Entity + /// + /// + /// + /// { + /// "name": "MYPACS", + /// "hostIp": "10.20.100.200", + /// "aeTitle": "MONAIPACS", + /// "port": 1104 + /// } + /// + /// + public class HL7DestinationEntity : BaseApplicationEntity + { + /// + /// Gets or sets the port to connect to. + /// + public int Port { get; set; } + } +} diff --git a/src/Api/Test/HL7DestinationEntityTest.cs b/src/Api/Test/HL7DestinationEntityTest.cs new file mode 100644 index 000000000..d1eab3a70 --- /dev/null +++ b/src/Api/Test/HL7DestinationEntityTest.cs @@ -0,0 +1,53 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Api.Test +{ + public class HL7DestinationEntityTest + { + [Fact] + public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToBeUsed() + { + var entity = new HL7DestinationEntity + { + AeTitle = "AET", + }; + + entity.SetDefaultValues(); + + Assert.Equal(entity.AeTitle, entity.Name); + } + + [Fact] + public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotOverwrite() + { + var entity = new HL7DestinationEntity + { + AeTitle = "AET", + HostIp = "IP", + Name = "Name" + }; + + entity.SetDefaultValues(); + + Assert.Equal("AET", entity.AeTitle); + Assert.Equal("IP", entity.HostIp); + Assert.Equal("Name", entity.Name); + } + } +} diff --git a/src/Configuration/ValidationExtensions.cs b/src/Configuration/ValidationExtensions.cs index 676852061..09e7bc932 100755 --- a/src/Configuration/ValidationExtensions.cs +++ b/src/Configuration/ValidationExtensions.cs @@ -58,6 +58,21 @@ public static bool IsValid(this DestinationApplicationEntity destinationApplicat return valid; } + public static bool IsValid(this HL7DestinationEntity hl7destinationEntity, out IList validationErrors) + { + Guard.Against.Null(hl7destinationEntity, nameof(hl7destinationEntity)); + + validationErrors = new List(); + + var valid = true; + valid &= !string.IsNullOrWhiteSpace(hl7destinationEntity.Name); + valid &= IsAeTitleValid(hl7destinationEntity.GetType().Name, hl7destinationEntity.AeTitle, validationErrors); + valid &= IsValidHostNameIp(hl7destinationEntity.AeTitle, hl7destinationEntity.HostIp, validationErrors); + valid &= IsPortValid(hl7destinationEntity.GetType().Name, hl7destinationEntity.Port, validationErrors); + + return valid; + } + public static bool IsValid(this SourceApplicationEntity sourceApplicationEntity, out IList validationErrors) { Guard.Against.Null(sourceApplicationEntity, nameof(sourceApplicationEntity)); diff --git a/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs b/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs new file mode 100644 index 000000000..86183e828 --- /dev/null +++ b/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs @@ -0,0 +1,36 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IHL7DestinationEntityRepository + { + Task> ToListAsync(CancellationToken cancellationToken = default); + + Task FindByNameAsync(string name, CancellationToken cancellationToken = default); + + Task AddAsync(HL7DestinationEntity item, CancellationToken cancellationToken = default); + + Task UpdateAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default); + + Task RemoveAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default); + + Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs new file mode 100644 index 000000000..eef88d768 --- /dev/null +++ b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs @@ -0,0 +1,43 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class HL7DestinationEntityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(j => j.Name); + builder.Property(j => j.AeTitle).IsRequired(); + builder.Property(j => j.Port).IsRequired(); + builder.Property(j => j.HostIp).IsRequired(); + builder.Property(j => j.CreatedBy).IsRequired(false); + builder.Property(j => j.UpdatedBy).IsRequired(false); + builder.Property(j => j.DateTimeCreated).IsRequired(); + builder.Property(j => j.DateTimeUpdated).IsRequired(false); + + builder.HasIndex(p => p.Name, "idx_destination_name").IsUnique(); + builder.HasIndex(p => new { p.Name, p.AeTitle, p.HostIp, p.Port }, "idx_source_all").IsUnique(); + + builder.Ignore(p => p.Id); + } + } +} diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index b656c8294..242ac690d 100755 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -37,6 +37,7 @@ public InformaticsGatewayContext(DbContextOptions opt public virtual DbSet MonaiApplicationEntities { get; set; } public virtual DbSet SourceApplicationEntities { get; set; } public virtual DbSet DestinationApplicationEntities { get; set; } + public virtual DbSet HL7DestinationEntities { get; set; } public virtual DbSet InferenceRequests { get; set; } public virtual DbSet Payloads { get; set; } public virtual DbSet StorageMetadataWrapperEntities { get; set; } @@ -53,6 +54,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.ApplyConfiguration(new MonaiApplicationEntityConfiguration()); modelBuilder.ApplyConfiguration(new SourceApplicationEntityConfiguration()); modelBuilder.ApplyConfiguration(new DestinationApplicationEntityConfiguration()); + modelBuilder.ApplyConfiguration(new HL7DestinationEntityConfiguration()); modelBuilder.ApplyConfiguration(new InferenceRequestConfiguration()); modelBuilder.ApplyConfiguration(new PayloadConfiguration()); modelBuilder.ApplyConfiguration(new StorageMetadataWrapperEntityConfiguration()); diff --git a/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs b/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs new file mode 100644 index 000000000..6e6243d6e --- /dev/null +++ b/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs @@ -0,0 +1,143 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class HL7DestinationEntityRepository : IHL7DestinationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public HL7DestinationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(HL7DestinationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item, nameof(item)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var func = predicate.Compile(); + return await Task.FromResult(_dataset.Any(func)).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name, nameof(name)); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs new file mode 100644 index 000000000..d4ce5e2f2 --- /dev/null +++ b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs @@ -0,0 +1,159 @@ +/* + * Copyright 2022-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class HL7DestinationEntityRepositoryTest + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public HL7DestinationEntityRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithHL7DestinationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new DatabaseOptions()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(aet).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.HostIp, actual!.HostIp); + Assert.Equal(aet.Port, actual!.Port); + Assert.Equal(aet.Name, actual!.Name); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("1.2.3.4", actual!.HostIp); + Assert.Equal(114, actual!.Port); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenHL7DestinationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + expected!.Port = 1000; + expected!.HostIp = "loalhost"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + Assert.Equal(expected.HostIp, dbResult!.HostIp); + Assert.Equal(expected.Port, dbResult!.Port); + } + } +} diff --git a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs index 79cf63780..19219a3a3 100755 --- a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs @@ -60,6 +60,25 @@ public void InitDatabaseWithDestinationApplicationEntities() DatabaseContext.SaveChanges(); } + public void InitDatabaseWithHL7DestinationEntities() + { + var aet1 = new HL7DestinationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1" }; + var aet2 = new HL7DestinationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2" }; + var aet3 = new HL7DestinationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3" }; + var aet4 = new HL7DestinationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4" }; + var aet5 = new HL7DestinationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + public void InitDatabaseWithMonaiApplicationEntities() { var aet1 = new MonaiApplicationEntity { AeTitle = "AET1", Name = "AET1" }; diff --git a/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs new file mode 100644 index 000000000..c13b89aac --- /dev/null +++ b/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs @@ -0,0 +1,34 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class HL7DestinationEntityConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs new file mode 100644 index 000000000..1ba292dd1 --- /dev/null +++ b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs @@ -0,0 +1,166 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; +using MongoDB.Driver; +using Moq; + + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test +{ + [Collection("MongoDatabase")] + public class HL7DestinationEntityRepositoryTest + { + private readonly MongoDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public HL7DestinationEntityRepositoryTest(MongoDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithHL7DestinationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new DatabaseOptions()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.Client); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + await store.AddAsync(aet).ConfigureAwait(false); + + var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.HostIp, actual!.HostIp); + Assert.Equal(aet.Port, actual!.Port); + Assert.Equal(aet.Name, actual!.Name); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("1.2.3.4", actual!.HostIp); + Assert.Equal(114, actual!.Port); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenHL7DestinationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + expected!.Port = 1000; + expected!.HostIp = "loalhost"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + Assert.Equal(expected.HostIp, dbResult!.HostIp); + Assert.Equal(expected.Port, dbResult!.Port); + } + } +} diff --git a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs index bafc7b581..f1d48885e 100755 --- a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs +++ b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs @@ -65,6 +65,23 @@ public void InitDatabaseWithDestinationApplicationEntities() collection.InsertOne(aet5); } + public void InitDatabaseWithHL7DestinationEntities() + { + var collection = Database.GetCollection(nameof(HL7DestinationEntity)); + Clear(collection); + var aet1 = new HL7DestinationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1", DateTimeCreated = DateTime.UtcNow }; + var aet2 = new HL7DestinationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2", DateTimeCreated = DateTime.UtcNow }; + var aet3 = new HL7DestinationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3", DateTimeCreated = DateTime.UtcNow }; + var aet4 = new HL7DestinationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4", DateTimeCreated = DateTime.UtcNow }; + var aet5 = new HL7DestinationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5", DateTimeCreated = DateTime.UtcNow }; + + collection.InsertOne(aet1); + collection.InsertOne(aet2); + collection.InsertOne(aet3); + collection.InsertOne(aet4); + collection.InsertOne(aet5); + } + public void InitDatabaseWithMonaiApplicationEntities() { var collection = Database.GetCollection(nameof(MonaiApplicationEntity)); diff --git a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs new file mode 100644 index 000000000..198f0b126 --- /dev/null +++ b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs @@ -0,0 +1,170 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class HL7DestinationEntityRepository : IHL7DestinationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public HL7DestinationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(HL7DestinationEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.Name); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + + var indexDefinitionAll = Builders.IndexKeys.Combine( + Builders.IndexKeys.Ascending(_ => _.Name), + Builders.IndexKeys.Ascending(_ => _.AeTitle), + Builders.IndexKeys.Ascending(_ => _.HostIp), + Builders.IndexKeys.Ascending(_ => _.Port)); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionAll, options)); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name, nameof(name)); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection + .Find(x => x.Name == name) + .FirstOrDefaultAsync().ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task AddAsync(HL7DestinationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item, nameof(item)); + + return await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(item, cancellationToken: cancellationToken).ConfigureAwait(false); + return item; + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.ReplaceOneAsync(p => p.Id == entity.Id, entity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.Name == entity.Name), cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.FindAsync(predicate, cancellationToken: cancellationToken).ConfigureAwait(false); + return await result.AnyAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs index aebdb7e23..ec6d41ce8 100644 --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -186,5 +186,27 @@ public static partial class Log [LoggerMessage(EventId = 8400, Level = LogLevel.Error, Message = "Unexpected error occurred in PUT {endpoint} API.")] public static partial void PutHl7ApplicationConfigException(this ILogger logger, string endpoint, Exception ex); + + // HL7 Destination Controller + [LoggerMessage(EventId = 8401, Level = LogLevel.Information, Message = "HL7 destination added AE Title={aeTitle}, Host/IP={hostIp}.")] + public static partial void HL7DestinationEntityAdded(this ILogger logger, string aeTitle, string hostIp); + + [LoggerMessage(EventId = 8402, Level = LogLevel.Information, Message = "HL7 destination deleted {name}.")] + public static partial void HL7DestinationEntityDeleted(this ILogger logger, string name); + + [LoggerMessage(EventId = 8403, Level = LogLevel.Error, Message = "Error querying HL7 destinations.")] + public static partial void ErrorListingHL7DestinationEntities(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 8404, Level = LogLevel.Error, Message = "Error adding new HL7 destination.")] + public static partial void ErrorAddingHL7DestinationEntity(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 8405, Level = LogLevel.Error, Message = "Error deleting HL7 destination.")] + public static partial void ErrorDeletingHL7DestinationEntity(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 8406, Level = LogLevel.Error, Message = "Error C-ECHO to HL7 destination {name}.")] + public static partial void ErrorCEechoHL7DestinationEntity(this ILogger logger, string name, Exception ex); + + [LoggerMessage(EventId = 8407, Level = LogLevel.Information, Message = "HL7 destination updated {name}: AE Title={aeTitle}, Host/IP={hostIp}, Port={port}.")] + public static partial void HL7DestinationEntityUpdated(this ILogger logger, string name, string aeTitle, string hostIp, int port); } } diff --git a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs new file mode 100644 index 000000000..b98474881 --- /dev/null +++ b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs @@ -0,0 +1,306 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2020 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Net.Mime; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.Services.Scu; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [ApiController] + [Route("config/hl7-destination")] + public class HL7DestinationController : ControllerBase + { + private readonly ILogger _logger; + private readonly IHL7DestinationEntityRepository _repository; + private readonly IDataPlugInEngineFactory _outputDataPlugInEngineFactory; + private readonly IScuQueue _scuQueue; + + public HL7DestinationController( + ILogger logger, + IHL7DestinationEntityRepository repository, + IScuQueue scuQueue, + IDataPlugInEngineFactory outputDataPlugInEngineFactory) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + _scuQueue = scuQueue ?? throw new ArgumentNullException(nameof(scuQueue)); + _outputDataPlugInEngineFactory = outputDataPlugInEngineFactory ?? throw new ArgumentNullException(nameof(outputDataPlugInEngineFactory)); + } + + [HttpGet] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task>> Get() + { + try + { + return Ok(await _repository.ToListAsync(HttpContext.RequestAborted).ConfigureAwait(false)); + } + catch (Exception ex) + { + _logger.ErrorQueryingDatabase(ex); + return Problem(title: "Error querying database.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpGet("{name}")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ActionName(nameof(GetAeTitle))] + public async Task> GetAeTitle(string name) + { + try + { + var hl7DestinationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); + + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + return Ok(hl7DestinationEntity); + } + catch (Exception ex) + { + _logger.ErrorListingHL7DestinationEntities(ex); + return Problem(title: "Error querying HL7 destinations.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpGet("cecho/{name}")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [ProducesResponseType(StatusCodes.Status502BadGateway)] + [ActionName(nameof(GetAeTitle))] + public async Task CEcho(string name) + { + var traceId = HttpContext?.TraceIdentifier ?? Guid.NewGuid().ToString(); + try + { + if (string.IsNullOrWhiteSpace(name)) + { + return NotFound(); + } + + var hl7DestinationEntity = await _repository.FindByNameAsync(name, HttpContext!.RequestAborted).ConfigureAwait(false); + + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + var request = new ScuWorkRequest( + traceId, + RequestType.CEcho, + hl7DestinationEntity.HostIp, + hl7DestinationEntity.Port, + hl7DestinationEntity.AeTitle, + HttpContext.RequestAborted + ); + var response = await _scuQueue.Queue(request, HttpContext.RequestAborted).ConfigureAwait(false); + + if (response.Status != ResponseStatus.Success) + { + return Problem( + title: "C-ECHO Failure", + instance: traceId, + detail: response.Message, + statusCode: StatusCodes.Status502BadGateway); + } + + return Ok(); + } + catch (Exception ex) + { + _logger.ErrorCEechoHL7DestinationEntity(name, ex); + return Problem( + title: $"Error performing C-ECHO", + instance: traceId, + statusCode: StatusCodes.Status500InternalServerError, + detail: ex.Message); + } + } + + [HttpPost] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status409Conflict)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [Produces("application/json")] + public async Task> Create(HL7DestinationEntity item) + { + try + { + item.SetDefaultValues(); + item.SetAuthor(User, EditMode.Create); + + await ValidateCreateAsync(item).ConfigureAwait(false); + + await _repository.AddAsync(item, HttpContext.RequestAborted).ConfigureAwait(false); + _logger.HL7DestinationEntityAdded(item.AeTitle, item.HostIp); + return CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item); + } + catch (ObjectExistsException ex) + { + return Problem(title: "HL7 destination already exists", statusCode: StatusCodes.Status409Conflict, detail: ex.Message); + } + catch (ConfigurationException ex) + { + return Problem(title: "Validation error", statusCode: StatusCodes.Status400BadRequest, detail: ex.Message); + } + catch (Exception ex) + { + _logger.ErrorAddingHL7DestinationEntity(ex); + return Problem(title: "Error adding new HL7 destination", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpPut] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> Edit(HL7DestinationEntity? item) + { + try + { + if (item is null) + { + return NotFound(); + } + + var hl7DestinationEntity = await _repository.FindByNameAsync(item.Name, HttpContext.RequestAborted).ConfigureAwait(false); + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + item.SetDefaultValues(); + + hl7DestinationEntity.AeTitle = item.AeTitle; + hl7DestinationEntity.HostIp = item.HostIp; + hl7DestinationEntity.Port = item.Port; + hl7DestinationEntity.SetAuthor(User, EditMode.Update); + + await ValidateUpdateAsync(hl7DestinationEntity).ConfigureAwait(false); + + _ = _repository.UpdateAsync(hl7DestinationEntity, HttpContext.RequestAborted); + _logger.HL7DestinationEntityUpdated(item.Name, item.AeTitle, item.HostIp, item.Port); + return Ok(hl7DestinationEntity); + } + catch (ConfigurationException ex) + { + return Problem(title: "Validation error.", statusCode: (int)System.Net.HttpStatusCode.BadRequest, detail: ex.Message); + } + catch (Exception ex) + { + _logger.ErrorDeletingHL7DestinationEntity(ex); + return Problem(title: "Error updating HL7 destination.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpDelete("{name}")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> Delete(string name) + { + try + { + var hl7DestinationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + await _repository.RemoveAsync(hl7DestinationEntity, HttpContext.RequestAborted).ConfigureAwait(false); + + _logger.HL7DestinationEntityDeleted(name); + return Ok(hl7DestinationEntity); + } + catch (Exception ex) + { + _logger.ErrorDeletingHL7DestinationEntity(ex); + return Problem(title: "Error deleting HL7 destination.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpGet("plug-ins")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public ActionResult GetPlugIns() + { + try + { + return Ok(_outputDataPlugInEngineFactory.RegisteredPlugIns()); + } + catch (Exception ex) + { + _logger.ErrorReadingDataInputPlugIns(ex); + return Problem(title: "Error reading data input plug-ins.", statusCode: (int)System.Net.HttpStatusCode.InternalServerError, detail: ex.Message); + } + } + + private async Task ValidateCreateAsync(HL7DestinationEntity item) + { + if (await _repository.ContainsAsync(p => p.Name.Equals(item.Name), HttpContext.RequestAborted).ConfigureAwait(false)) + { + throw new ObjectExistsException($"A HL7 destination with the same name '{item.Name}' already exists."); + } + if (await _repository.ContainsAsync(p => p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) + { + throw new ObjectExistsException($"A HL7 destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); + } + if (!item.IsValid(out var validationErrors)) + { + throw new ConfigurationException(string.Join(Environment.NewLine, validationErrors)); + } + } + + private async Task ValidateUpdateAsync(HL7DestinationEntity item) + { + if (await _repository.ContainsAsync(p => !p.Name.Equals(item.Name) && p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) + { + throw new ObjectExistsException($"A HL7 destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); + } + if (!item.IsValid(out var validationErrors)) + { + throw new ConfigurationException(string.Join(Environment.NewLine, validationErrors)); + } + } + } +} From 223793a9eea3c816d487a5113175dafc95a0d4af Mon Sep 17 00:00:00 2001 From: Migle Markeviciute Date: Thu, 23 Nov 2023 14:14:10 +0000 Subject: [PATCH 46/75] Add HL7 destination configuration Signed-off-by: Migle Markeviciute --- src/Database/DatabaseManager.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index 040848b7e..cb40c9a0d 100755 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -84,6 +84,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi ServiceLifetime.Transient); services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(EntityFramework.Repositories.DestinationApplicationEntityRepository)); + services.AddScoped(typeof(IHL7DestinationEntityRepository), typeof(EntityFramework.Repositories.HL7DestinationEntityRepository)); services.AddScoped(typeof(IInferenceRequestRepository), typeof(EntityFramework.Repositories.InferenceRequestRepository)); services.AddScoped(typeof(IMonaiApplicationEntityRepository), typeof(EntityFramework.Repositories.MonaiApplicationEntityRepository)); services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(EntityFramework.Repositories.SourceApplicationEntityRepository)); @@ -101,6 +102,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddSingleton(s => new MongoClient(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey])); services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(MongoDB.Repositories.DestinationApplicationEntityRepository)); + services.AddScoped(typeof(IHL7DestinationEntityRepository), typeof(MongoDB.Repositories.HL7DestinationEntityRepository)); services.AddScoped(typeof(IInferenceRequestRepository), typeof(MongoDB.Repositories.InferenceRequestRepository)); services.AddScoped(typeof(IMonaiApplicationEntityRepository), typeof(MongoDB.Repositories.MonaiApplicationEntityRepository)); services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(MongoDB.Repositories.SourceApplicationEntityRepository)); From 13eaf7312d6fe970dc1f2f2ed955d0447c54f739 Mon Sep 17 00:00:00 2001 From: Migle Markeviciute Date: Fri, 24 Nov 2023 13:54:32 +0000 Subject: [PATCH 47/75] Fix build issue Signed-off-by: Migle Markeviciute --- src/Api/HL7DestinationEntity.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Api/HL7DestinationEntity.cs b/src/Api/HL7DestinationEntity.cs index bd9ceda70..33655bdde 100644 --- a/src/Api/HL7DestinationEntity.cs +++ b/src/Api/HL7DestinationEntity.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// HL7 Destination Entity From 2ef7c4daf97675ddc2a90fbb8034336ac2d568ec Mon Sep 17 00:00:00 2001 From: Migle Markeviciute Date: Fri, 24 Nov 2023 14:52:16 +0000 Subject: [PATCH 48/75] Fix issues Signed-off-by: Migle Markeviciute --- src/Api/Test/HL7DestinationEntityTest.cs | 1 + .../Api/Repositories/IHL7DestinationEntityRepository.cs | 2 +- .../Configuration/HL7DestinationEntityConfiguration.cs | 2 +- .../Repositories/HL7DestinationEntityRepository.cs | 2 +- .../EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs | 2 +- .../MongoDB/Configurations/HL7DestinationEntityConfiguration.cs | 2 +- .../Integration.Test/HL7DestinationEntityRepositoryTest.cs | 2 +- .../MongoDB/Repositories/HL7DestinationEntityRepository.cs | 2 +- .../Services/Http/HL7DestinationController.cs | 1 + 9 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Api/Test/HL7DestinationEntityTest.cs b/src/Api/Test/HL7DestinationEntityTest.cs index d1eab3a70..181f1fd9e 100644 --- a/src/Api/Test/HL7DestinationEntityTest.cs +++ b/src/Api/Test/HL7DestinationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test diff --git a/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs b/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs index 86183e828..c46dc3503 100644 --- a/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs +++ b/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs @@ -15,7 +15,7 @@ */ using System.Linq.Expressions; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs index eef88d768..703dad6f3 100644 --- a/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs @@ -17,7 +17,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs b/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs index 6e6243d6e..2c0ab03ae 100644 --- a/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs index d4ce5e2f2..1f24a40f8 100644 --- a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs index c13b89aac..a91466b05 100644 --- a/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs +++ b/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs index 1ba292dd1..dbdb29251 100644 --- a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs index 198f0b126..37676d848 100644 --- a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; diff --git a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs index b98474881..080d1f46f 100644 --- a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs +++ b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs @@ -23,6 +23,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; From f28ff76542bdded07667150d9b3b975a7e6d4880 Mon Sep 17 00:00:00 2001 From: Migle Markeviciute Date: Fri, 24 Nov 2023 16:57:46 +0000 Subject: [PATCH 49/75] Add ef migration Signed-off-by: Migle Markeviciute --- .../20231124164229_AddHL7Repo.Designer.cs | 561 ++++++++++++++++++ .../Migrations/20231124164229_AddHL7Repo.cs | 58 ++ .../InformaticsGatewayContextModelSnapshot.cs | 45 +- .../Services/Http/HL7DestinationController.cs | 76 +-- 4 files changed, 665 insertions(+), 75 deletions(-) create mode 100644 src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs create mode 100644 src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs diff --git a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs new file mode 100644 index 000000000..b71f114e6 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs @@ -0,0 +1,561 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231124164229_AddHL7Repo")] + partial class AddHL7Repo + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("INTEGER"); + + b.HasKey("Key"); + + b.ToTable("DataKeyValuePair"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DataLinkKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("SendingIdKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("DataLinkKey"); + + b.HasIndex("SendingIdKey"); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all2"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Hl7ApplicationConfigEntityId") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.HasIndex("Hl7ApplicationConfigEntityId"); + + b.ToTable("StringKeyValuePair"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.HasOne("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", "DataLink") + .WithMany() + .HasForeignKey("DataLinkKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", "SendingId") + .WithMany() + .HasForeignKey("SendingIdKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DataLink"); + + b.Navigation("SendingId"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => + { + b.HasOne("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", null) + .WithMany("DataMapping") + .HasForeignKey("Hl7ApplicationConfigEntityId"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Navigation("DataMapping"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs new file mode 100644 index 000000000..00d909dcb --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs @@ -0,0 +1,58 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class AddHL7Repo : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameIndex( + name: "idx_source_all1", + table: "SourceApplicationEntities", + newName: "idx_source_all2"); + + migrationBuilder.CreateTable( + name: "HL7DestinationEntities", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + Port = table.Column(type: "INTEGER", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false), + AeTitle = table.Column(type: "TEXT", nullable: false), + HostIp = table.Column(type: "TEXT", nullable: false), + CreatedBy = table.Column(type: "TEXT", nullable: true), + UpdatedBy = table.Column(type: "TEXT", nullable: true), + DateTimeUpdated = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_HL7DestinationEntities", x => x.Name); + }); + + migrationBuilder.CreateIndex( + name: "idx_destination_name1", + table: "HL7DestinationEntities", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "idx_source_all1", + table: "HL7DestinationEntities", + columns: new[] { "Name", "AeTitle", "HostIp", "Port" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "HL7DestinationEntities"); + + migrationBuilder.RenameIndex( + name: "idx_source_all2", + table: "SourceApplicationEntities", + newName: "idx_source_all1"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs index 6fd769dc5..d1fe579dc 100755 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -15,7 +15,7 @@ partial class InformaticsGatewayContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => { @@ -190,6 +190,47 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("ExternalAppDetails"); }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => { b.Property("Name") @@ -323,7 +364,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") .IsUnique() - .HasDatabaseName("idx_source_all1"); + .HasDatabaseName("idx_source_all2"); b.HasIndex(new[] { "Name" }, "idx_source_name") .IsUnique(); diff --git a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs index 080d1f46f..ae5a44785 100644 --- a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs +++ b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs @@ -24,13 +24,10 @@ using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Models; -using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Services.Common; -using Monai.Deploy.InformaticsGateway.Services.Scu; namespace Monai.Deploy.InformaticsGateway.Services.Http { @@ -40,19 +37,13 @@ public class HL7DestinationController : ControllerBase { private readonly ILogger _logger; private readonly IHL7DestinationEntityRepository _repository; - private readonly IDataPlugInEngineFactory _outputDataPlugInEngineFactory; - private readonly IScuQueue _scuQueue; public HL7DestinationController( ILogger logger, - IHL7DestinationEntityRepository repository, - IScuQueue scuQueue, - IDataPlugInEngineFactory outputDataPlugInEngineFactory) + IHL7DestinationEntityRepository repository) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - _scuQueue = scuQueue ?? throw new ArgumentNullException(nameof(scuQueue)); - _outputDataPlugInEngineFactory = outputDataPlugInEngineFactory ?? throw new ArgumentNullException(nameof(outputDataPlugInEngineFactory)); } [HttpGet] @@ -106,51 +97,7 @@ public async Task> GetAeTitle(string name) [ActionName(nameof(GetAeTitle))] public async Task CEcho(string name) { - var traceId = HttpContext?.TraceIdentifier ?? Guid.NewGuid().ToString(); - try - { - if (string.IsNullOrWhiteSpace(name)) - { - return NotFound(); - } - - var hl7DestinationEntity = await _repository.FindByNameAsync(name, HttpContext!.RequestAborted).ConfigureAwait(false); - - if (hl7DestinationEntity is null) - { - return NotFound(); - } - - var request = new ScuWorkRequest( - traceId, - RequestType.CEcho, - hl7DestinationEntity.HostIp, - hl7DestinationEntity.Port, - hl7DestinationEntity.AeTitle, - HttpContext.RequestAborted - ); - var response = await _scuQueue.Queue(request, HttpContext.RequestAborted).ConfigureAwait(false); - - if (response.Status != ResponseStatus.Success) - { - return Problem( - title: "C-ECHO Failure", - instance: traceId, - detail: response.Message, - statusCode: StatusCodes.Status502BadGateway); - } - - return Ok(); - } - catch (Exception ex) - { - _logger.ErrorCEechoHL7DestinationEntity(name, ex); - return Problem( - title: $"Error performing C-ECHO", - instance: traceId, - statusCode: StatusCodes.Status500InternalServerError, - detail: ex.Message); - } + throw new NotImplementedException(); } [HttpPost] @@ -249,7 +196,7 @@ public async Task> Delete(string name) await _repository.RemoveAsync(hl7DestinationEntity, HttpContext.RequestAborted).ConfigureAwait(false); - _logger.HL7DestinationEntityDeleted(name); + _logger.HL7DestinationEntityDeleted(name.Substring(0, 10)); return Ok(hl7DestinationEntity); } catch (Exception ex) @@ -259,23 +206,6 @@ public async Task> Delete(string name) } } - [HttpGet("plug-ins")] - [Produces("application/json")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public ActionResult GetPlugIns() - { - try - { - return Ok(_outputDataPlugInEngineFactory.RegisteredPlugIns()); - } - catch (Exception ex) - { - _logger.ErrorReadingDataInputPlugIns(ex); - return Problem(title: "Error reading data input plug-ins.", statusCode: (int)System.Net.HttpStatusCode.InternalServerError, detail: ex.Message); - } - } - private async Task ValidateCreateAsync(HL7DestinationEntity item) { if (await _repository.ContainsAsync(p => p.Name.Equals(item.Name), HttpContext.RequestAborted).ConfigureAwait(false)) From f9a30b7888cce314384349034703584160afa044 Mon Sep 17 00:00:00 2001 From: Migle Markeviciute Date: Mon, 27 Nov 2023 09:29:10 +0000 Subject: [PATCH 50/75] Update ef migration Signed-off-by: Migle Markeviciute --- .../Migrations/20231124164229_AddHL7Repo.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs index 00d909dcb..f36a6b630 100644 --- a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs +++ b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs @@ -8,11 +8,6 @@ public partial class AddHL7Repo : Migration { protected override void Up(MigrationBuilder migrationBuilder) { - migrationBuilder.RenameIndex( - name: "idx_source_all1", - table: "SourceApplicationEntities", - newName: "idx_source_all2"); - migrationBuilder.CreateTable( name: "HL7DestinationEntities", columns: table => new @@ -48,11 +43,6 @@ protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "HL7DestinationEntities"); - - migrationBuilder.RenameIndex( - name: "idx_source_all2", - table: "SourceApplicationEntities", - newName: "idx_source_all1"); } } } From 84c807ba3c4d8535b41d27ebf8d7ce4bc554218d Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 4 Dec 2023 13:41:47 +0000 Subject: [PATCH 51/75] add HL7 eport Signed-off-by: Neil South --- src/Api/Hl7ApplicationConfigEntity.cs | 26 +- src/Client/IInformaticsGatewayClient.cs | 5 + src/Client/InformaticsGatewayClient.cs | 4 + .../MessageBrokerConfigurationKeys.cs | 14 + .../Hl7ApplicationConfigConfiguration.cs | 58 +- .../InformaticsGatewayContext.cs | 1 + .../Migrations/20231123141944_addHl7Config.cs | 106 ---- .../20231124164229_AddHL7Repo.Designer.cs | 561 ------------------ ...13501_Hl7DEstinationAndConfig.Designer.cs} | 133 ++--- ...20231204113501_Hl7DEstinationAndConfig.cs} | 36 +- .../InformaticsGatewayContextModelSnapshot.cs | 84 +-- .../Logging/Log.500.ExportService.cs | 3 + .../Logging/Log.5000.DataPlugins.cs | 4 + .../Logging/Log.800.Hl7Service.cs | 11 + src/InformaticsGateway/Program.cs | 28 +- .../Services/Common/OutputDataPluginEngine.cs | 1 + .../Services/Export/DicomWebExportService.cs | 36 +- .../Services/Export/ExportServiceBase.cs | 74 ++- .../Services/Export/ExtAppScuExportService.cs | 4 +- .../Services/Export/Hl7ExportService.cs | 163 +++++ .../Services/Export/ScuExportService.cs | 35 +- .../Services/HealthLevel7/Hl7SendException.cs | 40 ++ .../HealthLevel7/IMllpClientFactory.cs | 6 +- .../Services/HealthLevel7/IMllpService.cs | 27 + .../Services/HealthLevel7/MllpClient.cs | 5 +- .../Services/HealthLevel7/MllpExtract.cs | 7 +- .../Services/HealthLevel7/MllpService.cs | 89 ++- .../Services/HealthLevel7/Resources.cs | 1 + .../Services/Http/HL7DestinationController.cs | 2 + .../Repositories/MonaiServiceLocatorTest.cs | 5 +- .../Services/Export/ExportHl7ServiceTests.cs | 384 ++++++++++++ .../Services/HealthLevel7/MllPExtractTests.cs | 25 + .../Services/HealthLevel7/MllpClientTest.cs | 27 +- .../Services/HealthLevel7/MllpServiceTest.cs | 11 +- src/InformaticsGateway/appsettings.json | 7 +- tests/Integration.Test/Common/Assertions.cs | 7 +- tests/Integration.Test/Common/DataProvider.cs | 0 .../Common/DicomCEchoDataClient.cs | 1 + .../Common/DicomCStoreDataClient.cs | 1 + .../Common/DicomWebDataSink.cs | 1 + tests/Integration.Test/Common/FhirDataSink.cs | 1 + tests/Integration.Test/Common/Hl7DataSink.cs | 1 + tests/Integration.Test/Common/IDataClient.cs | 2 + .../Integration.Test/Common/MinioDataSink.cs | 33 ++ .../Features/HL7Export.feature | 32 + tests/Integration.Test/Hooks/TestHooks.cs | 11 + .../StepDefinitions/Hl7StepDefinitions.cs | 237 ++++++++ tests/Integration.Test/appsettings.json | 2 +- 48 files changed, 1394 insertions(+), 958 deletions(-) mode change 100644 => 100755 src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs delete mode 100755 src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs delete mode 100644 src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs rename src/Database/EntityFramework/Migrations/{20231123141944_addHl7Config.Designer.cs => 20231204113501_Hl7DEstinationAndConfig.Designer.cs} (86%) rename src/Database/EntityFramework/Migrations/{20231124164229_AddHL7Repo.cs => 20231204113501_Hl7DEstinationAndConfig.cs} (55%) mode change 100644 => 100755 create mode 100755 src/InformaticsGateway/Services/Export/Hl7ExportService.cs create mode 100755 src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs create mode 100755 src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/HealthLevel7/Resources.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/HL7DestinationController.cs create mode 100755 src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs mode change 100644 => 100755 tests/Integration.Test/Common/Assertions.cs mode change 100644 => 100755 tests/Integration.Test/Common/DataProvider.cs mode change 100644 => 100755 tests/Integration.Test/Common/DicomCEchoDataClient.cs mode change 100644 => 100755 tests/Integration.Test/Common/DicomCStoreDataClient.cs mode change 100644 => 100755 tests/Integration.Test/Common/DicomWebDataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/FhirDataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/Hl7DataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/IDataClient.cs create mode 100755 tests/Integration.Test/Features/HL7Export.feature create mode 100755 tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs index f7a111ca1..aefa605cf 100755 --- a/src/Api/Hl7ApplicationConfigEntity.cs +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -16,8 +16,8 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using FellowOakDicom; using Monai.Deploy.InformaticsGateway.Api.Storage; @@ -28,6 +28,13 @@ namespace Monai.Deploy.InformaticsGateway.Api { public class Hl7ApplicationConfigEntity : MongoDBEntityBase { + /// + /// Gets or sets the name of a Hl7 application entity. + /// This value must be unique. + /// + [Key, Column(Order = 0)] + public string Name { get; set; } = default!; + /// /// Gets or sets the sending identifier. /// @@ -48,6 +55,11 @@ public class Hl7ApplicationConfigEntity : MongoDBEntityBase [JsonProperty("data_mapping")] public List DataMapping { get; set; } = new(); + /// + /// Optional list of data input plug-in type names to be executed by the . + /// + public List PlugInAssemblies { get; set; } = default!; + public IEnumerable Validate() { var errors = new List(); @@ -116,6 +128,12 @@ public static implicit operator StringKeyValuePair(KeyValuePair public static List FromDictionary(Dictionary dictionary) => dictionary.Select(kvp => new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }).ToList(); + public override bool Equals(object? obj) => Equals(obj as StringKeyValuePair); + + public bool Equals(StringKeyValuePair? other) => other != null && Key == other.Key && Value == other.Value; + + public override int GetHashCode() => HashCode.Combine(Key, Value); + } public class DataKeyValuePair : IKeyValuePair @@ -128,6 +146,12 @@ public static implicit operator DataKeyValuePair(KeyValuePair Equals(obj as DataKeyValuePair); + + public bool Equals(DataKeyValuePair? other) => other != null && Key == other.Key && Value == other.Value; + + public override int GetHashCode() => HashCode.Combine(Key, Value); } public interface IKeyValuePair diff --git a/src/Client/IInformaticsGatewayClient.cs b/src/Client/IInformaticsGatewayClient.cs index c9279d474..3db89516e 100755 --- a/src/Client/IInformaticsGatewayClient.cs +++ b/src/Client/IInformaticsGatewayClient.cs @@ -54,6 +54,11 @@ public interface IInformaticsGatewayClient /// IAeTitleService VirtualAeTitle { get; } + /// + /// Provides APIs to list, create, delete Virtual AE Titles. + /// + IAeTitleService HL7Destinations { get; } + /// /// Configures the service URI of the DICOMweb service. /// diff --git a/src/Client/InformaticsGatewayClient.cs b/src/Client/InformaticsGatewayClient.cs index ddb809434..fe9a81145 100755 --- a/src/Client/InformaticsGatewayClient.cs +++ b/src/Client/InformaticsGatewayClient.cs @@ -49,6 +49,9 @@ public class InformaticsGatewayClient : IInformaticsGatewayClient /// public IAeTitleService VirtualAeTitle { get; } + /// + public IAeTitleService HL7Destinations { get; } + /// /// Initializes a new instance of the InformaticsGatewayClient class that connects to the specified URI using the credentials provided. /// @@ -67,6 +70,7 @@ public InformaticsGatewayClient(HttpClient httpClient, ILogger("config/source", _httpClient, _logger); DicomDestinations = new AeTitleService("config/destination", _httpClient, _logger); VirtualAeTitle = new AeTitleService("config/vae", _httpClient, _logger); + HL7Destinations = new AeTitleService("config/hl7-destination", _httpClient, _logger); } /// diff --git a/src/Configuration/MessageBrokerConfigurationKeys.cs b/src/Configuration/MessageBrokerConfigurationKeys.cs index 0ef705f77..54c4da5a3 100755 --- a/src/Configuration/MessageBrokerConfigurationKeys.cs +++ b/src/Configuration/MessageBrokerConfigurationKeys.cs @@ -55,5 +55,19 @@ public class MessageBrokerConfigurationKeys /// [ConfigurationKeyName("externalAppRequest")] public string ExternalAppRequest { get; set; } = "md.externalapp.request"; + + /// + /// Gets or sets the topic for publishing workflow requests. + /// Defaults to `md.export.request`. + /// + [ConfigurationKeyName("exportHl7")] + public string ExportHL7 { get; set; } = "md.export.hl7"; + + /// + /// Gets or sets the topic for publishing export complete requests. + /// Defaults to `md_export_complete`. + /// + [ConfigurationKeyName("exportHl7Complete")] + public string ExportHl7Complete { get; set; } = "md.export.hl7complete"; } } diff --git a/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs old mode 100644 new mode 100755 index 41ad63ad3..cfd9a186b --- a/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs @@ -14,7 +14,10 @@ * limitations under the License. */ +using System.Text.Json.Serialization; +using System.Text.Json; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Monai.Deploy.InformaticsGateway.Api; @@ -24,7 +27,60 @@ internal class Hl7ApplicationConfigConfiguration : IEntityTypeConfiguration builder) { - builder.HasKey(j => j.Id); + var valueComparer = new ValueComparer>( + (c1, c2) => c1!.SequenceEqual(c2!), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => c.ToList()); + + var jsonSerializerSettings = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + builder.HasKey(j => j.Name); + builder.Property(j => j.SendingId).HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize(v, jsonSerializerSettings)!) + .IsRequired() + .Metadata + .SetValueComparer( + new ValueComparer( + (c1, c2) => c1 == c2, + c => c.GetHashCode(), + c => c)); + + builder.Property(j => j.DataLink).HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize(v, jsonSerializerSettings)!) + .IsRequired() + .Metadata + .SetValueComparer( + new ValueComparer( + (c1, c2) => c1 == c2, + c => c.GetHashCode(), + c => c)); + + builder.Property(j => j.DateTimeCreated).IsRequired(); + builder.Property(j => j.PlugInAssemblies) + .HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize>(v, jsonSerializerSettings)!) + .Metadata.SetValueComparer(valueComparer); + + builder.Property(j => j.DataMapping) + .HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize>(v, jsonSerializerSettings)!) + .Metadata + .SetValueComparer( + new ValueComparer>( + (c1, c2) => c1!.SequenceEqual(c2!), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => c.ToList())); + + builder.HasIndex(p => p.Name, "idx_hl7_name").IsUnique(); + + builder.Ignore(p => p.Id); } } } diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index 242ac690d..40af12bde 100755 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -60,6 +60,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.ApplyConfiguration(new StorageMetadataWrapperEntityConfiguration()); modelBuilder.ApplyConfiguration(new DicomAssociationInfoConfiguration()); modelBuilder.ApplyConfiguration(new VirtualApplicationEntityConfiguration()); + modelBuilder.ApplyConfiguration(new Hl7ApplicationConfigConfiguration()); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) diff --git a/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs b/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs deleted file mode 100755 index 679888525..000000000 --- a/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Monai.Deploy.InformaticsGateway.Database.Migrations -{ - public partial class addHl7Config : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "DataKeyValuePair", - columns: table => new - { - Key = table.Column(type: "TEXT", nullable: false), - Value = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_DataKeyValuePair", x => x.Key); - }); - - migrationBuilder.CreateTable( - name: "Hl7ApplicationConfig", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - SendingIdKey = table.Column(type: "TEXT", nullable: false), - DataLinkKey = table.Column(type: "TEXT", nullable: false), - DateTimeCreated = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Hl7ApplicationConfig", x => x.Id); - table.ForeignKey( - name: "FK_Hl7ApplicationConfig_DataKeyValuePair_DataLinkKey", - column: x => x.DataLinkKey, - principalTable: "DataKeyValuePair", - principalColumn: "Key", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "StringKeyValuePair", - columns: table => new - { - Key = table.Column(type: "TEXT", nullable: false), - Value = table.Column(type: "TEXT", nullable: false), - Hl7ApplicationConfigEntityId = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_StringKeyValuePair", x => x.Key); - table.ForeignKey( - name: "FK_StringKeyValuePair_Hl7ApplicationConfig_Hl7ApplicationConfigEntityId", - column: x => x.Hl7ApplicationConfigEntityId, - principalTable: "Hl7ApplicationConfig", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_Hl7ApplicationConfig_DataLinkKey", - table: "Hl7ApplicationConfig", - column: "DataLinkKey"); - - migrationBuilder.CreateIndex( - name: "IX_Hl7ApplicationConfig_SendingIdKey", - table: "Hl7ApplicationConfig", - column: "SendingIdKey"); - - migrationBuilder.CreateIndex( - name: "IX_StringKeyValuePair_Hl7ApplicationConfigEntityId", - table: "StringKeyValuePair", - column: "Hl7ApplicationConfigEntityId"); - - migrationBuilder.AddForeignKey( - name: "FK_Hl7ApplicationConfig_StringKeyValuePair_SendingIdKey", - table: "Hl7ApplicationConfig", - column: "SendingIdKey", - principalTable: "StringKeyValuePair", - principalColumn: "Key", - onDelete: ReferentialAction.Cascade); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Hl7ApplicationConfig_DataKeyValuePair_DataLinkKey", - table: "Hl7ApplicationConfig"); - - migrationBuilder.DropForeignKey( - name: "FK_Hl7ApplicationConfig_StringKeyValuePair_SendingIdKey", - table: "Hl7ApplicationConfig"); - - migrationBuilder.DropTable( - name: "DataKeyValuePair"); - - migrationBuilder.DropTable( - name: "StringKeyValuePair"); - - migrationBuilder.DropTable( - name: "Hl7ApplicationConfig"); - } - } -} diff --git a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs b/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs deleted file mode 100644 index b71f114e6..000000000 --- a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.Designer.cs +++ /dev/null @@ -1,561 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework; - -#nullable disable - -namespace Monai.Deploy.InformaticsGateway.Database.Migrations -{ - [DbContext(typeof(InformaticsGatewayContext))] - [Migration("20231124164229_AddHL7Repo")] - partial class AddHL7Repo - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => - { - b.Property("Key") - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("INTEGER"); - - b.HasKey("Key"); - - b.ToTable("DataKeyValuePair"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("DataLinkKey") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("SendingIdKey") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("DataLinkKey"); - - b.HasIndex("SendingIdKey"); - - b.ToTable("Hl7ApplicationConfig"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT"); - - b.Property("AeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DateTimeUpdated") - .HasColumnType("TEXT"); - - b.Property("HostIp") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Port") - .HasColumnType("INTEGER"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex(new[] { "Name" }, "idx_destination_name") - .IsUnique(); - - b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") - .IsUnique(); - - b.ToTable("DestinationApplicationEntities"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CalledAeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CallingAeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CorrelationId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DateTimeDisconnected") - .HasColumnType("TEXT"); - - b.Property("Duration") - .HasColumnType("TEXT"); - - b.Property("Errors") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("FileCount") - .HasColumnType("INTEGER"); - - b.Property("PayloadIds") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("RemoteHost") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("RemotePort") - .HasColumnType("INTEGER"); - - b.HasKey("Id"); - - b.ToTable("DicomAssociationHistories"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CorrelationId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DestinationFolder") - .HasColumnType("TEXT"); - - b.Property("ExportTaskID") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("PatientId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("PatientIdOutBound") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("StudyInstanceUid") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("StudyInstanceUidOutBound") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("WorkflowInstanceId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("ExternalAppDetails"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT"); - - b.Property("AeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DateTimeUpdated") - .HasColumnType("TEXT"); - - b.Property("HostIp") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Port") - .HasColumnType("INTEGER"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex(new[] { "Name" }, "idx_destination_name") - .IsUnique() - .HasDatabaseName("idx_destination_name1"); - - b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") - .IsUnique() - .HasDatabaseName("idx_source_all1"); - - b.ToTable("HL7DestinationEntities"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnOrder(0); - - b.Property("AeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("AllowedSopClasses") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DateTimeUpdated") - .HasColumnType("TEXT"); - - b.Property("Grouping") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("IgnoredSopClasses") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("PlugInAssemblies") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Timeout") - .HasColumnType("INTEGER"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.Property("Workflows") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex(new[] { "Name" }, "idx_monaiae_name") - .IsUnique(); - - b.ToTable("MonaiApplicationEntities"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => - { - b.Property("InferenceRequestId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("InputMetadata") - .HasColumnType("TEXT"); - - b.Property("InputResources") - .HasColumnType("TEXT"); - - b.Property("OutputResources") - .HasColumnType("TEXT"); - - b.Property("Priority") - .HasColumnType("INTEGER"); - - b.Property("State") - .HasColumnType("INTEGER"); - - b.Property("Status") - .HasColumnType("INTEGER"); - - b.Property("TransactionId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("TryCount") - .HasColumnType("INTEGER"); - - b.HasKey("InferenceRequestId"); - - b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") - .IsUnique(); - - b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); - - b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") - .IsUnique(); - - b.ToTable("InferenceRequests"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT"); - - b.Property("AeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DateTimeUpdated") - .HasColumnType("TEXT"); - - b.Property("HostIp") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") - .IsUnique() - .HasDatabaseName("idx_source_all2"); - - b.HasIndex(new[] { "Name" }, "idx_source_name") - .IsUnique(); - - b.ToTable("SourceApplicationEntities"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => - { - b.Property("PayloadId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CorrelationId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DataOrigins") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DataTrigger") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DestinationFolder") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Files") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Key") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("MachineName") - .HasColumnType("TEXT"); - - b.Property("RetryCount") - .HasColumnType("INTEGER"); - - b.Property("State") - .HasColumnType("INTEGER"); - - b.Property("TaskId") - .HasColumnType("TEXT"); - - b.Property("Timeout") - .HasColumnType("INTEGER"); - - b.Property("WorkflowInstanceId") - .HasColumnType("TEXT"); - - b.HasKey("PayloadId"); - - b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") - .IsUnique(); - - b.HasIndex(new[] { "State" }, "idx_payload_state"); - - b.ToTable("Payloads"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => - { - b.Property("Key") - .HasColumnType("TEXT"); - - b.Property("Hl7ApplicationConfigEntityId") - .HasColumnType("TEXT"); - - b.Property("Value") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Key"); - - b.HasIndex("Hl7ApplicationConfigEntityId"); - - b.ToTable("StringKeyValuePair"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => - { - b.Property("Name") - .HasColumnType("TEXT") - .HasColumnOrder(0); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("DateTimeUpdated") - .HasColumnType("TEXT"); - - b.Property("PlugInAssemblies") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.Property("VirtualAeTitle") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Workflows") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Name"); - - b.HasIndex(new[] { "Name" }, "idx_virtualae_name") - .IsUnique(); - - b.ToTable("VirtualApplicationEntities"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => - { - b.Property("CorrelationId") - .HasColumnType("TEXT"); - - b.Property("Identity") - .HasColumnType("TEXT"); - - b.Property("DateTimeCreated") - .HasColumnType("TEXT"); - - b.Property("IsUploaded") - .HasColumnType("INTEGER"); - - b.Property("TypeName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Value") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("CorrelationId", "Identity"); - - b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); - - b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); - - b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); - - b.ToTable("StorageMetadataWrapperEntities"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.HasOne("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", "DataLink") - .WithMany() - .HasForeignKey("DataLinkKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", "SendingId") - .WithMany() - .HasForeignKey("SendingIdKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("DataLink"); - - b.Navigation("SendingId"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => - { - b.HasOne("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", null) - .WithMany("DataMapping") - .HasForeignKey("Hl7ApplicationConfigEntityId"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.Navigation("DataMapping"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs similarity index 86% rename from src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs rename to src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs index f1346c6dc..742aec068 100755 --- a/src/Database/EntityFramework/Migrations/20231123141944_addHl7Config.Designer.cs +++ b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs @@ -11,49 +11,43 @@ namespace Monai.Deploy.InformaticsGateway.Database.Migrations { [DbContext(typeof(InformaticsGatewayContext))] - [Migration("20231123141944_addHl7Config")] - partial class addHl7Config + [Migration("20231204113501_Hl7DEstinationAndConfig")] + partial class Hl7DEstinationAndConfig { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => - { - b.Property("Key") - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("INTEGER"); - - b.HasKey("Key"); - - b.ToTable("DataKeyValuePair"); - }); + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => { - b.Property("Id") - .ValueGeneratedOnAdd() + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() .HasColumnType("TEXT"); - b.Property("DataLinkKey") + b.Property("DataMapping") .IsRequired() .HasColumnType("TEXT"); b.Property("DateTimeCreated") .HasColumnType("TEXT"); - b.Property("SendingIdKey") + b.Property("PlugInAssemblies") .IsRequired() .HasColumnType("TEXT"); - b.HasKey("Id"); + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); - b.HasIndex("DataLinkKey"); + b.HasKey("Name"); - b.HasIndex("SendingIdKey"); + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); b.ToTable("Hl7ApplicationConfig"); }); @@ -192,6 +186,47 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("ExternalAppDetails"); }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => { b.Property("Name") @@ -325,7 +360,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") .IsUnique() - .HasDatabaseName("idx_source_all1"); + .HasDatabaseName("idx_source_all2"); b.HasIndex(new[] { "Name" }, "idx_source_name") .IsUnique(); @@ -394,25 +429,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("Payloads"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => - { - b.Property("Key") - .HasColumnType("TEXT"); - - b.Property("Hl7ApplicationConfigEntityId") - .HasColumnType("TEXT"); - - b.Property("Value") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Key"); - - b.HasIndex("Hl7ApplicationConfigEntityId"); - - b.ToTable("StringKeyValuePair"); - }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => { b.Property("Name") @@ -483,37 +499,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("StorageMetadataWrapperEntities"); }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.HasOne("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", "DataLink") - .WithMany() - .HasForeignKey("DataLinkKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", "SendingId") - .WithMany() - .HasForeignKey("SendingIdKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("DataLink"); - - b.Navigation("SendingId"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => - { - b.HasOne("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", null) - .WithMany("DataMapping") - .HasForeignKey("Hl7ApplicationConfigEntityId"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.Navigation("DataMapping"); - }); #pragma warning restore 612, 618 } } diff --git a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs old mode 100644 new mode 100755 similarity index 55% rename from src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs rename to src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs index f36a6b630..7dbf72215 --- a/src/Database/EntityFramework/Migrations/20231124164229_AddHL7Repo.cs +++ b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs @@ -1,13 +1,30 @@ -using Microsoft.EntityFrameworkCore.Migrations; +using System; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace Monai.Deploy.InformaticsGateway.Database.Migrations { - public partial class AddHL7Repo : Migration + public partial class Hl7DEstinationAndConfig : Migration { protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.CreateTable( + name: "Hl7ApplicationConfig", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + SendingId = table.Column(type: "TEXT", nullable: false), + DataLink = table.Column(type: "TEXT", nullable: false), + DataMapping = table.Column(type: "TEXT", nullable: false), + PlugInAssemblies = table.Column(type: "TEXT", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Hl7ApplicationConfig", x => x.Name); + }); + migrationBuilder.CreateTable( name: "HL7DestinationEntities", columns: table => new @@ -26,6 +43,12 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_HL7DestinationEntities", x => x.Name); }); + migrationBuilder.CreateIndex( + name: "idx_hl7_name", + table: "Hl7ApplicationConfig", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "idx_destination_name1", table: "HL7DestinationEntities", @@ -33,7 +56,7 @@ protected override void Up(MigrationBuilder migrationBuilder) unique: true); migrationBuilder.CreateIndex( - name: "idx_source_all1", + name: "idx_source_all_HL7Destination", table: "HL7DestinationEntities", columns: new[] { "Name", "AeTitle", "HostIp", "Port" }, unique: true); @@ -41,8 +64,15 @@ protected override void Up(MigrationBuilder migrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "Hl7ApplicationConfig"); + migrationBuilder.DropTable( name: "HL7DestinationEntities"); + + migrationBuilder.DropIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities"); } } } diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs index d1fe579dc..cec0093f1 100755 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -17,41 +17,35 @@ protected override void BuildModel(ModelBuilder modelBuilder) #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", b => - { - b.Property("Key") - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("INTEGER"); - - b.HasKey("Key"); - - b.ToTable("DataKeyValuePair"); - }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => { - b.Property("Id") - .ValueGeneratedOnAdd() + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() .HasColumnType("TEXT"); - b.Property("DataLinkKey") + b.Property("DataMapping") .IsRequired() .HasColumnType("TEXT"); b.Property("DateTimeCreated") .HasColumnType("TEXT"); - b.Property("SendingIdKey") + b.Property("PlugInAssemblies") .IsRequired() .HasColumnType("TEXT"); - b.HasKey("Id"); + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); - b.HasIndex("DataLinkKey"); + b.HasKey("Name"); - b.HasIndex("SendingIdKey"); + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); b.ToTable("Hl7ApplicationConfig"); }); @@ -433,25 +427,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Payloads"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => - { - b.Property("Key") - .HasColumnType("TEXT"); - - b.Property("Hl7ApplicationConfigEntityId") - .HasColumnType("TEXT"); - - b.Property("Value") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Key"); - - b.HasIndex("Hl7ApplicationConfigEntityId"); - - b.ToTable("StringKeyValuePair"); - }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => { b.Property("Name") @@ -522,37 +497,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("StorageMetadataWrapperEntities"); }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.HasOne("Monai.Deploy.InformaticsGateway.Api.DataKeyValuePair", "DataLink") - .WithMany() - .HasForeignKey("DataLinkKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", "SendingId") - .WithMany() - .HasForeignKey("SendingIdKey") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("DataLink"); - - b.Navigation("SendingId"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.StringKeyValuePair", b => - { - b.HasOne("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", null) - .WithMany("DataMapping") - .HasForeignKey("Hl7ApplicationConfigEntityId"); - }); - - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => - { - b.Navigation("DataMapping"); - }); #pragma warning restore 612, 618 } } diff --git a/src/InformaticsGateway/Logging/Log.500.ExportService.cs b/src/InformaticsGateway/Logging/Log.500.ExportService.cs index 1588b94eb..3fb1ff065 100755 --- a/src/InformaticsGateway/Logging/Log.500.ExportService.cs +++ b/src/InformaticsGateway/Logging/Log.500.ExportService.cs @@ -135,5 +135,8 @@ public static partial class Log [LoggerMessage(EventId = 537, Level = LogLevel.Error, Message = "Error executing OutputDataEngine plug-in.")] public static partial void OutputDataEngineBlockException(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 538, Level = LogLevel.Error, Message = "Error exporting to Hl7 destination. Waiting {timeSpan} before next retry. Retry attempt {retryCount}.")] + public static partial void HL7ExportErrorWithRetry(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); } } diff --git a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs index b83aef765..0dbfd93ff 100755 --- a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs +++ b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using System; using Microsoft.Extensions.Logging; namespace Monai.Deploy.InformaticsGateway.Logging @@ -40,5 +41,8 @@ public static partial class Log [LoggerMessage(EventId = 5006, Level = LogLevel.Debug, Message = "Adding SCP Listener {serviceName} on port {port}")] public static partial void AddingScpListener(this ILogger logger, string serviceName, int port); + + [LoggerMessage(EventId = 5007, Level = LogLevel.Error, Message = "Error executing plug-in: {plugin}.")] + public static partial void ErrorAddingOutputDataPlugIn(this ILogger logger, Exception d, string plugin); } } diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs index 8a7b3e8c8..a3235b8a0 100755 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -90,5 +90,16 @@ public static partial class Log [LoggerMessage(EventId = 822, Level = LogLevel.Debug, Message = "HL7 changing value {hl7Tag} from {oldValue} to {newValue}")] public static partial void ChangingHl7Values(this ILogger logger, string hl7Tag, string oldValue, string newValue); + [LoggerMessage(EventId = 823, Level = LogLevel.Error, Message = "HL7 destination stream not writable")] + public static partial void Hl7ClientStreamNotWritable(this ILogger logger); + + [LoggerMessage(EventId = 824, Level = LogLevel.Error, Message = "HL7 Ack missing start or end characters")] + public static partial void Hl7AckMissingStartOrEndCharacters(this ILogger logger); + + [LoggerMessage(EventId = 825, Level = LogLevel.Error, Message = "HL7 Execption sending Hl7 meassage")] + public static partial void Hl7SendException(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 826, Level = LogLevel.Debug, Message = "HL7 meassage sent received {ack}")] + public static partial void Hl7MessageSent(this ILogger logger, string ack); } } diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 0f8aaab8f..9586ee88c 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -133,16 +133,9 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - //services.AddSingleton(); services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); - //services.AddSingleton(); + services.AddSingleton(); + var timeout = TimeSpan.FromSeconds(hostContext.Configuration.GetValue("InformaticsGateway:dicomWeb:clientTimeout", DicomWebConfiguration.DefaultClientTimeout)); services @@ -160,16 +153,17 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => .SetHandlerLifetime(timeout); #pragma warning disable CS8603 // Possible null reference return. - services.AddHostedService(/*p => p.GetService()*/); - services.AddHostedService(/*p => p.GetService()*/); - services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); services.AddHostedService(); - services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(); services.AddHostedService(); - services.AddHostedService(/*p => p.GetService()*/); - services.AddHostedService(/*p => p.GetService()*/); - services.AddHostedService(/*p => p.GetService()*/); - services.AddHostedService(/*p => p.GetService()*/); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); #pragma warning restore CS8603 // Possible null reference return. }) diff --git a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs index 2d386b053..ecbf77a93 100755 --- a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs @@ -80,6 +80,7 @@ private IReadOnlyList LoadPlugIns(IServiceProvider servicePro } catch (Exception ex) { + _logger.ErrorAddingOutputDataPlugIn(ex, plugin); exceptions.Add(new PlugInLoadingException($"Error loading plug-in '{plugin}'.", ex)); } } diff --git a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs index f6825922d..9eca29da2 100755 --- a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs +++ b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs @@ -21,7 +21,6 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using System.Threading.Tasks.Dataflow; using Ardalis.GuardClauses; using FellowOakDicom; using Microsoft.Extensions.DependencyInjection; @@ -46,7 +45,6 @@ internal class DicomWebExportService : ExportServiceBase { private readonly ILoggerFactory _loggerFactory; private readonly IHttpClientFactory _httpClientFactory; - private readonly IServiceScopeFactory _serviceScopeFactory; private readonly ILogger _logger; private readonly IOptions _configuration; private readonly IDicomToolkit _dicomToolkit; @@ -66,7 +64,6 @@ public DicomWebExportService( { _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); @@ -77,42 +74,13 @@ public DicomWebExportService( protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) { - var (exportFlow, reportingActionBlock) = SetupActionBlocks(); - - lock (SyncRoot) - { - var exportRequest = eventArgs.Message.ConvertTo(); - if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) - { - _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); - return; - } - - exportRequest.MessageId = eventArgs.Message.MessageId; - exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; - - var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); - - ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); - if (!exportFlow.Post(exportRequestWithDetails)) - { - _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); - MessageSubscriber.Reject(eventArgs.Message); - } - else - { - _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); - } - } - - exportFlow.Complete(); - await reportingActionBlock.Completion.ConfigureAwait(false); + await BaseProcessMessage(eventArgs); } protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) { using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); - using var scope = _serviceScopeFactory.CreateScope(); + using var scope = ServiceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); foreach (var transaction in exportRequestData.Destinations) diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index 6065c0e2c..935f87817 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -57,7 +57,7 @@ public abstract class ExportServiceBase : IHostedService, IMonaiService, IDispos private readonly CancellationTokenSource _cancellationTokenSource; private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; + protected readonly IServiceScopeFactory ServiceScopeFactory; private readonly InformaticsGatewayConfiguration _configuration; protected readonly IMessageBrokerSubscriberService MessageSubscriber; protected readonly IMessageBrokerPublisherService MessagePublisher; @@ -73,6 +73,8 @@ public abstract class ExportServiceBase : IHostedService, IMonaiService, IDispos public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; public abstract string ServiceName { get; } + protected string ExportCompleteTopic { get; set; } + /// /// Override the ExportDataBlockCallback method to customize export logic. /// Must update State to either Succeeded or Failed. @@ -92,10 +94,11 @@ protected ExportServiceBase( { _cancellationTokenSource = new CancellationTokenSource(); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); - _scope = _serviceScopeFactory.CreateScope(); + ServiceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); + _scope = ServiceScopeFactory.CreateScope(); _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); + if (configuration is null) { throw new ArgumentNullException(nameof(configuration)); @@ -103,6 +106,7 @@ protected ExportServiceBase( _configuration = configuration.Value; + ExportCompleteTopic = _configuration.Messaging.Topics.ExportComplete; MessageSubscriber = _scope.ServiceProvider.GetRequiredService(); MessagePublisher = _scope.ServiceProvider.GetRequiredService(); _storageInfoProvider = _scope.ServiceProvider.GetRequiredService(); @@ -125,12 +129,16 @@ public Task StartAsync(CancellationToken cancellationToken) return Task.CompletedTask; } - public Task StopAsync(CancellationToken cancellationToken) + public async Task StopAsync(CancellationToken cancellationToken) { _cancellationTokenSource.Cancel(); _logger.ServiceStopping(ServiceName); Status = ServiceStatus.Stopped; - return Task.CompletedTask; +#pragma warning disable CA2016 // Forward the 'CancellationToken' parameter to methods + await Task.Delay(250).ConfigureAwait(false); +#pragma warning restore CA2016 // Forward the 'CancellationToken' parameter to methods + _cancellationTokenSource.Dispose(); + return; } private void SetupPolling() @@ -292,7 +300,7 @@ private IEnumerable DownloadPayloadActionCallback(Expo { Guard.Against.Null(exportRequest, nameof(exportRequest)); using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequest.ExportTaskId }, { "CorrelationId", exportRequest.CorrelationId } }); - var scope = _serviceScopeFactory.CreateScope(); + var scope = ServiceScopeFactory.CreateScope(); var storageService = scope.ServiceProvider.GetRequiredService(); foreach (var file in exportRequest.Files) @@ -331,7 +339,7 @@ private IEnumerable DownloadPayloadActionCallback(Expo } } - private async Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) + protected virtual async Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) { using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "WorkflowInstanceId", exportDataRequest.WorkflowInstanceId }, @@ -411,7 +419,7 @@ private void FinaliseMessage(JsonMessage jsonMessage) .Execute(() => { _logger.PublishingExportCompleteEvent(); - MessagePublisher.Publish(_configuration.Messaging.Topics.ExportComplete, jsonMessage.ToMessage()); + MessagePublisher.Publish(ExportCompleteTopic, jsonMessage.ToMessage()); }); Policy @@ -449,19 +457,16 @@ private async Task LookupDestinationAsync(string d throw new ConfigurationException("Export task does not have destination set."); } - using var scope = _serviceScopeFactory.CreateScope(); + using var scope = ServiceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); - if (destination is null) - { - throw new ConfigurationException($"Specified destination '{destinationName}' does not exist."); - } - - return destination; + return destination is null + ? throw new ConfigurationException($"Specified destination '{destinationName}' does not exist.") + : destination; } - protected async Task GetDestination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + protected virtual async Task GetDestination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) { try { @@ -474,7 +479,7 @@ private async Task LookupDestinationAsync(string d } } - protected async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + protected virtual async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) { Guard.Against.Null(exportRequestData, nameof(exportRequestData)); @@ -577,6 +582,41 @@ protected async Task ExecuteExport(ExportRequestDataMessage exportRequestData, M } }).ConfigureAwait(false); + protected async Task BaseProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var exportRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) + { + _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); + return; + } + + exportRequest.MessageId = eventArgs.Message.MessageId; + exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + + ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); + } + } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + + } + public void Dispose() { // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method diff --git a/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs b/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs index 0e6c5a225..fb602be5d 100755 --- a/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs +++ b/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs @@ -37,13 +37,12 @@ namespace Monai.Deploy.InformaticsGateway.Services.Export public class ExtAppScuExportService : ExportServiceBase { private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IOptions _configuration; private readonly IExternalAppDetailsRepository _repository; private readonly IDicomToolkit _dicomToolkit; protected override ushort Concurrency { get; } public override string RoutingKey { get; } - public override string ServiceName => "DICOM Export Service"; + public override string ServiceName => "External App Export Service"; public ExtAppScuExportService( ILogger logger, @@ -54,7 +53,6 @@ public ExtAppScuExportService( : base(logger, configuration, serviceScopeFactory, dicomToolkit) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _repository = repository ?? throw new ArgumentNullException(nameof(repository)); _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); diff --git a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs new file mode 100755 index 000000000..16ed9a345 --- /dev/null +++ b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs @@ -0,0 +1,163 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using Monai.Deploy.Messaging.Common; +using Polly; + +namespace Monai.Deploy.InformaticsGateway.Services.Export +{ + internal class Hl7ExportService : ExportServiceBase + { + private readonly ILogger _logger; + private readonly InformaticsGatewayConfiguration _configuration; + private readonly IMllpService _mllpService; + + protected override ushort Concurrency { get; } + public override string RoutingKey { get; } + public override string ServiceName => "DICOM Export HL7 Service"; + + + public Hl7ExportService( + ILogger logger, + IServiceScopeFactory serviceScopeFactory, + IOptions configuration, + IDicomToolkit dicomToolkit) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _configuration = configuration.Value ?? throw new ArgumentNullException(nameof(configuration)); + + _mllpService = serviceScopeFactory.CreateScope().ServiceProvider.GetRequiredService(); + RoutingKey = $"{configuration.Value.Messaging.Topics.ExportHL7}"; + ExportCompleteTopic = $"{configuration.Value.Messaging.Topics.ExportHl7Complete}"; + Concurrency = _configuration.Dicom.Scu.MaximumNumberOfAssociations; + } + + + protected override Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + return BaseProcessMessage(eventArgs); + } + + + protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) + { + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary + { + { "ExportTaskId", exportRequestData.ExportTaskId }, + { "CorrelationId", exportRequestData.CorrelationId }, + { "Filename", exportRequestData.Filename } + }); + + foreach (var destinationName in exportRequestData.Destinations) + { + await HandleDesination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + } + + return exportRequestData; + } + + protected override async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + Guard.Against.Null(exportRequestData, nameof(exportRequestData)); + + var destination = await GetHL7Destination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + if (destination is null) + { + return; + } + + try + { + await ExecuteHl7Export(exportRequestData, destination!, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + HandleCStoreException(ex, exportRequestData); + } + } + + private async Task ExecuteHl7Export( + ExportRequestDataMessage exportRequestData, + HL7DestinationEntity destination, + CancellationToken cancellationToken) => await Policy + .Handle() + .WaitAndRetryAsync( + _configuration.Export.Retries.RetryDelays, + (exception, timeSpan, retryCount, context) => + { + _logger.HL7ExportErrorWithRetry(timeSpan, retryCount, exception); + }) + .ExecuteAsync(async () => + { + await _mllpService.SendMllp( + IPAddress.Parse(destination.HostIp), + destination.Port, Encoding.UTF8.GetString(exportRequestData.FileContent), + cancellationToken + ).ConfigureAwait(false); + }).ConfigureAwait(false); + + + private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(destinationName)) + { + throw new ConfigurationException("Export task does not have destination set."); + } + + using var scope = ServiceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); + var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); + + return destination is null + ? throw new ConfigurationException($"Specified destination '{destinationName}' does not exist.") + : destination; + } + + private async Task GetHL7Destination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + try + { + return await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); + } + catch (ConfigurationException ex) + { + HandleCStoreException(ex, exportRequestData); + return null; + } + } + + protected override Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) + { + return Task.FromResult(exportDataRequest); + } + } +} diff --git a/src/InformaticsGateway/Services/Export/ScuExportService.cs b/src/InformaticsGateway/Services/Export/ScuExportService.cs index e3fc6fdbe..09d47a48a 100755 --- a/src/InformaticsGateway/Services/Export/ScuExportService.cs +++ b/src/InformaticsGateway/Services/Export/ScuExportService.cs @@ -34,9 +34,7 @@ namespace Monai.Deploy.InformaticsGateway.Services.Export internal class ScuExportService : ExportServiceBase { private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IOptions _configuration; - private readonly IDicomToolkit _dicomToolkit; protected override ushort Concurrency { get; } public override string RoutingKey { get; } @@ -50,9 +48,7 @@ public ScuExportService( : base(logger, configuration, serviceScopeFactory, dicomToolkit) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); RoutingKey = $"{configuration.Value.Messaging.Topics.ExportRequestPrefix}.{_configuration.Value.Dicom.Scu.AgentName}"; Concurrency = _configuration.Value.Dicom.Scu.MaximumNumberOfAssociations; @@ -60,36 +56,7 @@ public ScuExportService( protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) { - var (exportFlow, reportingActionBlock) = SetupActionBlocks(); - - lock (SyncRoot) - { - var exportRequest = eventArgs.Message.ConvertTo(); - if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) - { - _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); - return; - } - - exportRequest.MessageId = eventArgs.Message.MessageId; - exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; - - var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); - - ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); - if (!exportFlow.Post(exportRequestWithDetails)) - { - _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); - MessageSubscriber.Reject(eventArgs.Message); - } - else - { - _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); - } - } - - exportFlow.Complete(); - await reportingActionBlock.Completion.ConfigureAwait(false); + await BaseProcessMessage(eventArgs); } protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) diff --git a/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs b/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs new file mode 100755 index 000000000..ebb73e6aa --- /dev/null +++ b/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +{ + internal class Hl7SendException : Exception + { + public Hl7SendException() + { + } + + public Hl7SendException(string message) : base(message) + { + } + + public Hl7SendException(string message, Exception innerException) : base(message, innerException) + { + } + + protected Hl7SendException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs index fd3c09bd1..fe2c1b8a5 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs @@ -22,12 +22,12 @@ namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 { internal interface IMllpClientFactory { - IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, IMllpExtract mIIpExtract, ILogger logger); + IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger); } internal class MllpClientFactory : IMllpClientFactory { - public IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, IMllpExtract mIIpExtract, ILogger logger) - => new MllpClient(client, configurations, mIIpExtract, logger); + public IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger) + => new MllpClient(client, configurations, logger); } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs new file mode 100755 index 000000000..6272464b2 --- /dev/null +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs @@ -0,0 +1,27 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Net; +using System.Threading; +using System.Threading.Tasks; + +namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +{ + public interface IMllpService + { + Task SendMllp(IPAddress address, int port, string hl7Message, CancellationToken cancellationToken); + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index 3caef1a4f..b3c87372b 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -38,7 +38,6 @@ internal sealed class MllpClient : IMllpClient private readonly List _exceptions; private readonly List _messages; private readonly IDisposable _loggerScope; - private readonly IMllpExtract _mIIpExtract; private bool _disposedValue; public Guid ClientId { get; } @@ -48,12 +47,11 @@ public string ClientIp get { return _client.RemoteEndPoint.ToString() ?? string.Empty; } } - public MllpClient(ITcpClientAdapter client, Hl7Configuration configurations, IMllpExtract mIIpExtract, ILogger logger) + public MllpClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger) { _client = client ?? throw new ArgumentNullException(nameof(client)); _configurations = configurations ?? throw new ArgumentNullException(nameof(configurations)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _mIIpExtract = mIIpExtract ?? throw new ArgumentNullException(nameof(_mIIpExtract)); ClientId = Guid.NewGuid(); _exceptions = new List(); @@ -145,6 +143,7 @@ private async Task> ReceiveData(INetworkStream clientStream, Canc } } while (true); } + linkedCancellationTokenSource.Dispose(); return messages; } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs index 94b2437fa..d27e7a71e 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -65,7 +65,7 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess } // extract data for the given fields // Use Id to get record from Db - var details = await GetExtAppDetails(configItem, message); + var details = await GetExtAppDetails(configItem, message).ConfigureAwait(false); if (details is null) { @@ -101,9 +101,9 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess switch (type) { case DataLinkType.PatientId: - return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()); + return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; case DataLinkType.StudyInstanceUid: - return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()); + return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; default: break; } @@ -115,7 +115,6 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess { foreach (var item in config) { - var t = message.GetValue(item.SendingId.Key); if (item.SendingId.Value == message.GetValue(item.SendingId.Key)) { return item; diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 33e0d72ed..8a4a99cd4 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -18,9 +18,13 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO.Abstractions; +using System.Net; +using System.Net.Sockets; +using System.Text; using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; +using HL7.Dotnetcore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -37,7 +41,7 @@ namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 { - internal sealed class MllpService : IHostedService, IDisposable, IMonaiService + internal sealed class MllpService : IMllpService, IHostedService, IDisposable, IMonaiService { private const int SOCKET_OPERATION_CANCELLED = 125; private bool _disposedValue; @@ -133,7 +137,7 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) continue; } - mllpClient = _mllpClientFactory.CreateClient(client, _configuration.Value.Hl7, _mIIpExtract, _logginFactory.CreateLogger()); + mllpClient = _mllpClientFactory.CreateClient(client, _configuration.Value.Hl7, _logginFactory.CreateLogger()); _ = mllpClient.Start(OnDisconnect, cancellationToken); _activeTasks.TryAdd(mllpClient.ClientId, mllpClient); } @@ -219,6 +223,87 @@ private void Dispose(bool disposing) } } + public async Task SendMllp(IPAddress address, int port, string hl7Message, CancellationToken cancellationToken) + { + try + { + var body = $"{Resources.AsciiVT}{hl7Message}{Resources.AsciiFS}{Resources.AcsiiCR}"; + var sendMessageByteBuffer = Encoding.UTF8.GetBytes(body); + await WriteMessage(sendMessageByteBuffer, address, port).ConfigureAwait(false); + } + catch (ArgumentOutOfRangeException) + { + _logger.Hl7AckMissingStartOrEndCharacters(); + throw new Hl7SendException("ACK missing start or end characters"); + } + catch (Exception ex) + { + _logger.Hl7SendException(ex); + throw new Hl7SendException("Send exception"); + } + } + + private async Task WriteMessage(byte[] sendMessageByteBuffer, IPAddress address, int port) + { + + using var tcpClient = new TcpClient(); + + tcpClient.Connect(address, port); + + var networkStream = new NetworkStream(tcpClient.Client); + + if (networkStream.CanWrite) + { + networkStream.Write(sendMessageByteBuffer, 0, sendMessageByteBuffer.Length); + networkStream.Flush(); + } + else + { + _logger.Hl7ClientStreamNotWritable(); + throw new Hl7SendException("Client stream not writable"); + } + + _logger.Hl7MessageSent(Encoding.UTF8.GetString(sendMessageByteBuffer)); + + await EnsureAck(networkStream).ConfigureAwait(false); + } + + private async Task EnsureAck(NetworkStream networkStream) + { + using var s_cts = new CancellationTokenSource(); + s_cts.CancelAfter(_configuration.Value.Hl7.ClientTimeoutMilliseconds); + var buffer = new byte[2048]; + + // get the SentHl7Message + networkStream.ReadTimeout = 5000; + networkStream.WriteTimeout = 5000; + + // wait for responce + while (!s_cts.IsCancellationRequested && networkStream.DataAvailable == false) + { + await Task.Delay(20).ConfigureAwait(false); + } + + var bytesRead = await networkStream.ReadAsync(buffer).ConfigureAwait(false); + + if (bytesRead == 0 || s_cts.IsCancellationRequested) + { + throw new Hl7SendException("ACK message contains no ACK!"); + } + + var _rawHl7Messages = MessageHelper.ExtractMessages(Encoding.UTF8.GetString(buffer)); + foreach (var message in _rawHl7Messages) + { + var hl7Message = new Message(message); + hl7Message.ParseMessage(); + if (hl7Message.MessageStructure == "ACK") + { + return; + } + } + throw new Hl7SendException("ACK message contains no ACK!"); + } + public void Dispose() { // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method diff --git a/src/InformaticsGateway/Services/HealthLevel7/Resources.cs b/src/InformaticsGateway/Services/HealthLevel7/Resources.cs old mode 100644 new mode 100755 index 62b0ed23a..f3b30bf3c --- a/src/InformaticsGateway/Services/HealthLevel7/Resources.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/Resources.cs @@ -22,6 +22,7 @@ internal static class Resources public const char AsciiVT = (char)0x0B; public const char AsciiFS = (char)0x1C; + public const char AcsiiCR = (char)13; public const string AcknowledgmentTypeNever = "NE"; public const string AcknowledgmentTypeError = "ER"; diff --git a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs old mode 100644 new mode 100755 index ae5a44785..194adb1ed --- a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs +++ b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs @@ -95,7 +95,9 @@ public async Task> GetAeTitle(string name) [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status502BadGateway)] [ActionName(nameof(GetAeTitle))] +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously public async Task CEcho(string name) +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously { throw new NotImplementedException(); } diff --git a/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs b/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs index d459bddb7..d7a3dc915 100755 --- a/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs +++ b/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs @@ -55,7 +55,8 @@ public void GetMonaiServices() items => items.ServiceName.Equals("ScuExportService"), items => items.ServiceName.Equals("PayloadNotificationService"), items => items.ServiceName.Equals("HL7 Service"), - items => items.ServiceName.Equals("ExtAppScuExportService")); + items => items.ServiceName.Equals("ExtAppScuExportService"), + items => items.ServiceName.Equals("Hl7ExportService")); } [Fact(DisplayName = "GetServiceStatus")] @@ -64,7 +65,7 @@ public void GetServiceStatus() var serviceLocator = new MonaiServiceLocator(_serviceProvider.Object); var result = serviceLocator.GetServiceStatus(); - Assert.Equal(10, result.Count); + Assert.Equal(11, result.Count); foreach (var svc in result.Keys) { Assert.Equal(ServiceStatus.Running, result[svc]); diff --git a/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs b/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs new file mode 100755 index 000000000..216709cbf --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs @@ -0,0 +1,384 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Export; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using Monai.Deploy.InformaticsGateway.Services.Storage; +using Monai.Deploy.InformaticsGateway.SharedTest; +using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Storage.API; +using Moq; +using xRetry; +using Xunit; + + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Export +{ + [Collection("Hl7 Export Listener")] + public class ExportHl7ServiceTests + { + private readonly Mock _storageService = new Mock(); + private readonly Mock _messageSubscriberService = new Mock(); + private readonly Mock _messagePublisherService = new Mock(); + private readonly Mock> _logger = new Mock>(); + private readonly Mock _extAppScpLogger = new Mock(); + private readonly Mock _serviceScopeFactory = new Mock(); + private readonly IOptions _configuration; + private readonly Mock _dicomToolkit = new Mock(); + private readonly Mock _storageInfoProvider = new Mock(); + private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); + private readonly Mock _mllpService = new Mock(); + private readonly Mock _outputDataPlugInEngine = new Mock(); + private readonly Mock _repository = new Mock(); + private readonly int _port = 1104; + + public ExportHl7ServiceTests() + { + _configuration = Options.Create(new InformaticsGatewayConfiguration()); + + var services = new ServiceCollection(); + services.AddScoped(p => _messagePublisherService.Object); + services.AddScoped(p => _messageSubscriberService.Object); + services.AddScoped(p => _storageService.Object); + services.AddScoped(p => _storageInfoProvider.Object); + services.AddScoped(p => _mllpService.Object); + services.AddScoped(p => _outputDataPlugInEngine.Object); + services.AddScoped(p => _repository.Object); + + var serviceProvider = services.BuildServiceProvider(); + + var scope = new Mock(); + scope.Setup(x => x.ServiceProvider).Returns(serviceProvider); + + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(scope.Object); + _configuration.Value.Export.Retries.DelaysMilliseconds = new[] { 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + _storageInfoProvider.Setup(p => p.HasSpaceAvailableForExport).Returns(true); + _outputDataPlugInEngine.Setup(p => p.Configure(It.IsAny>())); + _outputDataPlugInEngine.Setup(p => p.ExecutePlugInsAsync(It.IsAny())) + .Returns((ExportRequestDataMessage message) => Task.FromResult(message)); + } + + [RetryFact(1, 250, DisplayName = "Constructor - throws on null params")] + public void Constructor_ThrowsOnNullParams() + { + Assert.Throws(() => new Hl7ExportService(null, null, null, null)); + Assert.Throws(() => new Hl7ExportService(_logger.Object, null, null, null)); + Assert.Throws(() => new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, null, null)); + Assert.Throws(() => new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, null)); + } + + + [RetryFact(10, 250, DisplayName = "When no destination is defined")] + public async Task ShallFailWhenNoDestinationIsDefined() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs(string.Empty)); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Export task does not have destination set.", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "When destination is not configured")] + public async Task ShallFailWhenDestinationIsNotConfigured() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(HL7DestinationEntity)); + + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging($"Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); + } + + [RetryFact(1, 250, DisplayName = "HL7 message rejected")] + public async Task No_Ack_Sent() + { + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new HL7DestinationEntity { HostIp = "192.168.0.0", Port = _port }; + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _mllpService.Setup(p => p.SendMllp(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Throws(new Hl7SendException("Send exception")); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + + await StopAndVerify(service); + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.Verify(x => x.Log( + LogLevel.Error, + 538, // this is the eventId of the log we're looking for + It.Is((v, t) => true), + It.IsAny(), + It.Is>((v, t) => true))); + } + + [RetryFact(1, 250, DisplayName = "Failed to load message content")] + public async Task Error_Loading_HL7_Content() + { + + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new HL7DestinationEntity { HostIp = "192.168.0.0", Port = _port }; + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.FromResult(null)); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.DownloadError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging("Error downloading payload.", LogLevel.Error, Times.AtLeastOnce()); + _logger.VerifyLoggingMessageBeginsWith("Error downloading payload. Waiting ", LogLevel.Error, Times.AtLeastOnce()); + } + + [RetryFact(2, 250, DisplayName = "success after Hl7 send")] + public async Task Success_After_Hl7Send() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new HL7DestinationEntity { HostIp = "192.168.0.0", Port = _port }; + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Success, FileExportStatus.Success))), Times.Once()); + } + + + + + private bool CheckMessage(Message message, ExportStatus exportStatus, FileExportStatus fileExportStatus) + { + Guard.Against.Null(message, nameof(message)); + + var exportEvent = message.ConvertTo(); + return exportEvent.Status == exportStatus && + exportEvent.FileStatuses.First().Value == fileExportStatus; + } + + private static MessageReceivedEventArgs CreateMessageReceivedEventArgs(string destination) + { + var exportRequestEvent = new ExportRequestEvent + { + ExportTaskId = Guid.NewGuid().ToString(), + CorrelationId = Guid.NewGuid().ToString(), + Destinations = new string[] { destination }, + Files = new[] { "file1" }, + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = Guid.NewGuid().ToString(), + }; + var jsonMessage = new JsonMessage(exportRequestEvent, MessageBrokerConfiguration.InformaticsGatewayApplicationId, exportRequestEvent.CorrelationId, exportRequestEvent.DeliveryTag); + + return new MessageReceivedEventArgs(jsonMessage.ToMessage(), CancellationToken.None); + } + + private async Task StopAndVerify(Hl7ExportService service) + { + await service.StopAsync(_cancellationTokenSource.Token); + _logger.VerifyLogging($"{service.ServiceName} is stopping.", LogLevel.Information, Times.Once()); + await Task.Delay(500); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs index ff25d27ac..d8809e333 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -37,6 +37,7 @@ public class MllPExtractTests { private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; private const string ABCDEMessage = "MSH|^~\\&|Rayvolve|ABCDE|RIS|{InstitutionName}|{YYYYMMDDHHMMSS}||ORU^R01|{UniqueIdentifier}|P|2.5\r\nPID|{StudyInstanceUID}|{AccessionNumber}\r\nOBR|{StudyInstanceUID}||{AccessionNumber}|Rayvolve^{AlgorithmUsed}||||||||||||{AccessionNumber}|||||||F||{PriorityValues, ex: A^ASAP^HL70078}\r\nTQ1|||||||||{PriorityValues, ex: A^ASAP^HL70078}\r\nOBX|1|ST|113014^DICOM Study^DCM||{StudyInstanceUID}||||||O\r\nOBX|2|TX|59776-5^Procedure Findings^LN||{Textual findingsm, ex:\"Fracture detected\")}|||{Abnormal flag, ex : A^Abnormal^HL70078}|||F||||{ACR flag, ex : RID49482^Category 3 Non critical Actionable Finding^RadLex}\r\n"; + private const string VendorMessage = "MSH|^~\\&|Vendor INSIGHT CXR |Vendor Inc.|||20231130091315||ORU^R01|ORU20231130091315834|P|2.4||||||UNICODE UTF-8\r\nPID|1||2.25.82866891564990604580806081805518233357\r\nPV1|1|O\r\nORC|RE||||SC\r\nOBR|1|||CXR0001^Chest X-ray Report|||20230418142212.134||||||||||||||||||P|||||||Vendor\r\nNTE|1||Bilateral lungs are clear without remarkable opacity.\\X0A\\Cardiomediastinal contour appears normal.\\X0A\\Pneumothorax is not seen.\\X0A\\Pleural Effusion is present on the bilateral sides.\\X0A\\\\X0A\\Threshold value\\X0A\\Atelectasis: 15\\X0A\\Calcification: 15\\X0A\\Cardiomegaly: 15\\X0A\\Consolidation: 15\\X0A\\Fibrosis: 15\\X0A\\Mediastinal Widening: 15\\X0A\\Nodule: 15\\X0A\\Pleural Effusion: 15\\X0A\\Pneumoperitoneum: 15\\X0A\\Pneumothorax: 15\\X0A\\\r\nZDS|2.25.97606619386020057921123852316852071139||2.25.337759261491022538565548360794987622189|Vendor INSIGHT CXR|v3.1.5.3\r\nOBX|1|NM|RAB0001^Abnormality Score||50.82||||||P|||20230418142212.134||Vendor"; private readonly Mock> _logger; private readonly CancellationTokenSource _cancellationTokenSource; @@ -174,5 +175,29 @@ public async Task Should_Set_Original_Patient_And_Study_Uid() Assert.Equal("StudyInstanceId", message.GetValue("OBR.1")); } + + [Fact(DisplayName = "ParseConfig Should Return Correct Item for vendor")] + public void ParseConfig_Should_Return_Correct_Item_For_Vendor() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + + var configs = new List { + new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "Vendor Inc." } }, + }; + + var message = new Message(VendorMessage); + var isParsed = message.ParseMessage(); + + var config = MllpExtract.GetConfig(configs, message); + Assert.Equal(correctid, config?.Id); + + message = new Message(ABCDEMessage); + isParsed = message.ParseMessage(); + + config = MllpExtract.GetConfig(configs, message); + Assert.Equal(azCorrectid, config?.Id); + } } } diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs index 8b74f950f..033efea81 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs @@ -20,7 +20,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -using FellowOakDicom; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Configuration; @@ -54,12 +53,12 @@ public MllpClientTest() [Fact(DisplayName = "Constructor")] public void Constructor() { - Assert.Throws(() => new MllpClient(null, null, null, null)); - Assert.Throws(() => new MllpClient(_tcpClient.Object, null, null, null)); - Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null, null)); - Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, null)); + Assert.Throws(() => new MllpClient(null, null, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, null, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null)); - new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + new MllpClient(_tcpClient.Object, _config, _logger.Object); } [Fact(DisplayName = "ReceiveData - records exception thrown by network stream")] @@ -70,7 +69,7 @@ public async Task ReceiveData_ExceptionReadingStream() .ThrowsAsync(new Exception("error")); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -93,7 +92,7 @@ public async Task ReceiveData_ZeroByte() .ReturnsAsync(0); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -128,7 +127,7 @@ public async Task ReceiveData_InvalidMessage() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -169,7 +168,7 @@ public async Task ReceiveData_DisabledAck() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -210,7 +209,7 @@ public async Task ReceiveData_NeverSendAck() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -251,7 +250,7 @@ public async Task ReceiveData_ExceptionSendingAck() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -291,7 +290,7 @@ public async Task ReceiveData_CompleteWorkflow() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { @@ -337,7 +336,7 @@ public async Task ReceiveData_CompleteWorkflow_WithMultipleMessages() }); _tcpClient.Setup(p => p.GetStream()).Returns(stream.Object); - var client = new MllpClient(_tcpClient.Object, _config, _mIIpExtract.Object, _logger.Object); + var client = new MllpClient(_tcpClient.Object, _config, _logger.Object); var action = new Func(async (client, results) => { diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 403f51d71..52757d6d0 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -18,7 +18,6 @@ using System.Collections.Generic; using System.IO.Abstractions; using System.Net; -using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using HL7.Dotnetcore; @@ -137,7 +136,7 @@ public async Task GivenTcpConnections_WhenConnectsAndDisconnectsFromMllpService_ var actions = new Dictionary>(); var mllpClients = new List>(); var checkEvent = new CountdownEvent(5); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { var client = new Mock(); @@ -185,7 +184,7 @@ public async Task GivenAMllpService_WhenMaximumConnectionLimitIsConfigure_Expect { var checkEvent = new CountdownEvent(_options.Value.Hl7.MaximumNumberOfConnections); var mllpClients = new List>(); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { var client = new Mock(); @@ -219,7 +218,7 @@ public async Task GivenConnectedTcpClients_WhenDisconnects_ExpectServiceToDispos var checkEvent = new ManualResetEventSlim(); var client = new Mock(); var callCount = 0; - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) @@ -279,7 +278,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT var client = new Mock(); _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny())) .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg) => Msg); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) @@ -323,7 +322,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny())) .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg) => Msg); - _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) diff --git a/src/InformaticsGateway/appsettings.json b/src/InformaticsGateway/appsettings.json index 6ccdc1d4c..61dc5b0dc 100755 --- a/src/InformaticsGateway/appsettings.json +++ b/src/InformaticsGateway/appsettings.json @@ -83,11 +83,16 @@ "password": "password", "virtualHost": "monaideploy", "exchange": "monaideploy", - "externalAppRequest": "md.externalapp.request", "deadLetterExchange": "monaideploy-dead-letter", "deliveryLimit": 3, "requeueDelay": 30 + }, + "topics": { + "externalAppRequest": "md.externalapp.request", + "exportHl7": "md.export.hl7", + "exportHl7Complete": "md.export.hl7complete" } + }, "storage": { "localTemporaryStoragePath": "/payloads", diff --git a/tests/Integration.Test/Common/Assertions.cs b/tests/Integration.Test/Common/Assertions.cs old mode 100644 new mode 100755 index 09d7eeb5f..f0d861570 --- a/tests/Integration.Test/Common/Assertions.cs +++ b/tests/Integration.Test/Common/Assertions.cs @@ -34,7 +34,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.Common { - internal class Assertions + public class Assertions { private readonly Configurations _configurations; private readonly InformaticsGatewayConfiguration _options; @@ -401,5 +401,10 @@ private void CompareDicomFiles(DicomFile left, DicomFile right, DicomTag[] dicom left.Dataset.GetString(tag).Should().Be(right.Dataset.GetString(tag)); } } + + public static void ShouldBeInMessageDictionary(Dictionary messages, HL7.Dotnetcore.Message message) + { + messages.Values.FirstOrDefault(m => m.HL7Message == message.HL7Message).Should().NotBeNull(); + } } } diff --git a/tests/Integration.Test/Common/DataProvider.cs b/tests/Integration.Test/Common/DataProvider.cs old mode 100644 new mode 100755 diff --git a/tests/Integration.Test/Common/DicomCEchoDataClient.cs b/tests/Integration.Test/Common/DicomCEchoDataClient.cs old mode 100644 new mode 100755 index 49918c0e2..645224589 --- a/tests/Integration.Test/Common/DicomCEchoDataClient.cs +++ b/tests/Integration.Test/Common/DicomCEchoDataClient.cs @@ -71,5 +71,6 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) dataProvider.DimseRsponse = DicomStatus.Cancel; } } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/DicomCStoreDataClient.cs b/tests/Integration.Test/Common/DicomCStoreDataClient.cs old mode 100644 new mode 100755 index bd010a8d0..bda321154 --- a/tests/Integration.Test/Common/DicomCStoreDataClient.cs +++ b/tests/Integration.Test/Common/DicomCStoreDataClient.cs @@ -115,5 +115,6 @@ private async Task SendBatchAsync(List files, string callingAeTitle, await dicomClient.SendAsync(); countdownEvent.Wait(timeout); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/DicomWebDataSink.cs b/tests/Integration.Test/Common/DicomWebDataSink.cs old mode 100644 new mode 100755 index 07ad2ee76..fb1bf9644 --- a/tests/Integration.Test/Common/DicomWebDataSink.cs +++ b/tests/Integration.Test/Common/DicomWebDataSink.cs @@ -81,5 +81,6 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) stopwatch.Stop(); _outputHelper.WriteLine($"Time to upload to DICOMWeb={0}s...", stopwatch.Elapsed.TotalSeconds); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/FhirDataSink.cs b/tests/Integration.Test/Common/FhirDataSink.cs old mode 100644 new mode 100755 index 5db77db96..931442e50 --- a/tests/Integration.Test/Common/FhirDataSink.cs +++ b/tests/Integration.Test/Common/FhirDataSink.cs @@ -59,5 +59,6 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) stopwatch.Stop(); _outputHelper.WriteLine($"Time to upload FHIR data={0}s...", stopwatch.Elapsed.TotalSeconds); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/Hl7DataSink.cs b/tests/Integration.Test/Common/Hl7DataSink.cs old mode 100644 new mode 100755 index 0c340e686..65fc0000c --- a/tests/Integration.Test/Common/Hl7DataSink.cs +++ b/tests/Integration.Test/Common/Hl7DataSink.cs @@ -140,5 +140,6 @@ private async Task SendBatchAsync(DataProvider dataProvider, params object[] arg stopwatch.Stop(); _outputHelper.WriteLine($"Took {stopwatch.Elapsed.TotalSeconds}s to send {messages.Count} messages."); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/IDataClient.cs b/tests/Integration.Test/Common/IDataClient.cs old mode 100644 new mode 100755 index 254572b93..07ff97069 --- a/tests/Integration.Test/Common/IDataClient.cs +++ b/tests/Integration.Test/Common/IDataClient.cs @@ -19,5 +19,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.Common internal interface IDataClient { Task SendAsync(DataProvider dataProvider, params object[] args); + + Task SaveHl7Async(DataProvider dataProvider, params object[] args); } } diff --git a/tests/Integration.Test/Common/MinioDataSink.cs b/tests/Integration.Test/Common/MinioDataSink.cs index dde07d4a1..f54d61f2e 100755 --- a/tests/Integration.Test/Common/MinioDataSink.cs +++ b/tests/Integration.Test/Common/MinioDataSink.cs @@ -15,6 +15,7 @@ */ using System.Diagnostics; +using System.Text; using Minio; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; @@ -69,6 +70,38 @@ await _retryPolicy.ExecuteAsync(async () => }); } + public async Task SaveHl7Async(DataProvider dataProvider, params object[] args) + { + await _retryPolicy.ExecuteAsync(async () => + { + var minioClient = CreateMinioClient(); + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + _outputHelper.WriteLine($"Uploading {dataProvider.HL7Specs.Files.Count} files to MinIO..."); + + foreach (var key in dataProvider.HL7Specs.Files.Keys) + { + var file = dataProvider.HL7Specs.Files[key]; + var filename = $"{args[0]}/{key.Replace(".txt", ".hl7")}"; + var byteArray = Encoding.ASCII.GetBytes(file.HL7Message); + var stream = new MemoryStream(byteArray); + + stream.Position = 0; + var puObjectArgs = new PutObjectArgs(); + puObjectArgs.WithBucket(_options.Storage.StorageServiceBucketName) + .WithObject(filename) + .WithStreamData(stream) + .WithObjectSize(stream.Length); + await minioClient.PutObjectAsync(puObjectArgs); + } + + stopwatch.Stop(); + _outputHelper.WriteLine($"Time to upload to Minio={0}s...", stopwatch.Elapsed.TotalSeconds); + }); + } + private MinioClient CreateMinioClient() => new MinioClient() .WithEndpoint(_options.Storage.Settings["endpoint"]) .WithCredentials(_options.Storage.Settings["accessKey"], _options.Storage.Settings["accessToken"]) diff --git a/tests/Integration.Test/Features/HL7Export.feature b/tests/Integration.Test/Features/HL7Export.feature new file mode 100755 index 000000000..b40748c8e --- /dev/null +++ b/tests/Integration.Test/Features/HL7Export.feature @@ -0,0 +1,32 @@ + +# Copyright 2023 MONAI Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# @ignored + +Feature: HL7 Export + +This feature tests the Export Hl7. + + @messaging_workflow_request @messaging + Scenario: End-to-end test of HL7 exporting + Given a HL7 message that is exported to the test host + When the HL7 Export message is received with 6 messages acked true + Then ensure that exportcomplete messages are sent with success + + + Scenario: End-to-end test of HL7 exporting with no Ack + Given a HL7 message that is exported to the test host + When the HL7 Export message is received with 6 messages acked false + Then ensure that exportcomplete messages are sent with failure diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 0b9c2f48a..6f1d24e3b 100755 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -42,6 +42,7 @@ public sealed class TestHooks private static RabbitMqConsumer s_rabbitMqConsumer_WorkflowRequest; private static RabbitMqConsumer s_rabbitMqConsumer_ArtifactRecieved; private static RabbitMqConsumer s_rabbitMqConsumer_ExportComplete; + private static RabbitMqConsumer s_rabbitMqConsumer_ExportHL7Complete; private static IDatabaseDataProvider s_database; private static DicomScp s_dicomServer; private static DataProvider s_dataProvider; @@ -131,12 +132,20 @@ private static void SetupRabbitMq(ISpecFlowOutputHelper outputHelper, IServiceSc s_rabbitMqConsumer_ExportComplete = new RabbitMqConsumer(rabbitMqSubscriber_ExportComplete, s_options.Value.Messaging.Topics.ExportComplete, outputHelper); + var rabbitMqSubscriber_ExportHL7Complete = new RabbitMQMessageSubscriberService( + Options.Create(s_options.Value.Messaging), + scope.ServiceProvider.GetRequiredService>(), + s_rabbitMqConnectionFactory); + + s_rabbitMqConsumer_ExportHL7Complete = new RabbitMqConsumer(rabbitMqSubscriber_ExportComplete, s_options.Value.Messaging.Topics.ExportHl7Complete, outputHelper); + var rabbitMqSubscriber_ArtifactRecieved = new RabbitMQMessageSubscriberService( Options.Create(s_options.Value.Messaging), scope.ServiceProvider.GetRequiredService>(), s_rabbitMqConnectionFactory); s_rabbitMqConsumer_ArtifactRecieved = new RabbitMqConsumer(rabbitMqSubscriber_ArtifactRecieved, s_options.Value.Messaging.Topics.ArtifactRecieved, outputHelper); + } private static IDatabaseDataProvider GetDatabase(IServiceProvider serviceProvider, ISpecFlowOutputHelper outputHelper) @@ -173,6 +182,7 @@ public void SetUp(ScenarioContext scenarioContext, ISpecFlowOutputHelper outputH _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_WorkflowRequest, "WorkflowRequestSubscriber"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ExportComplete, "ExportCompleteSubscriber"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ArtifactRecieved, "ArtifactRecievedSubscriber"); + _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ExportHL7Complete, "ExportHL7CompleteSubscriber"); _objectContainer.RegisterInstanceAs(s_dataProvider, "DataProvider"); _objectContainer.RegisterInstanceAs(s_assertions, "Assertions"); _objectContainer.RegisterInstanceAs(s_storescu, "StoreSCU"); @@ -192,6 +202,7 @@ public static void Shtudown() s_rabbitMqConsumer_WorkflowRequest.Dispose(); s_rabbitMqConsumer_ExportComplete.Dispose(); + s_rabbitMqConsumer_ExportHL7Complete.Dispose(); s_rabbitMqConsumer_ArtifactRecieved.Dispose(); s_rabbitMqConnectionFactory.Dispose(); } diff --git a/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs new file mode 100755 index 000000000..be93a8bce --- /dev/null +++ b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs @@ -0,0 +1,237 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using BoDi; +using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Client; +using Monai.Deploy.InformaticsGateway.Client.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Integration.Test.Common; +using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Messaging.RabbitMQ; +using System.Net; +using System.Net.Sockets; +using System.Text; + +namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions +{ + [Binding] + [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] + + internal class Hl7StepDEfinitions + { + private static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + private static readonly DicomTag[] DicomTags = new[] { DicomTag.AccessionNumber, DicomTag.StudyDescription, DicomTag.SeriesDescription, DicomTag.PatientAddress, DicomTag.PatientAge, DicomTag.PatientName }; + private static readonly List DefaultDicomTags = new() { DicomTag.PatientID, DicomTag.StudyInstanceUID, DicomTag.SeriesInstanceUID, DicomTag.SOPInstanceUID }; + + private readonly ObjectContainer _objectContainer; + private readonly InformaticsGatewayClient _informaticsGatewayClient; + private readonly IDataClient _dataSinkMinio; + private readonly DicomScp _dicomServer; + private readonly Configurations _configuration; + private string _dicomDestination; + private readonly DataProvider _dataProvider; + private readonly RabbitMqConsumer _receivedExportHL7CompletedMessages; + private readonly RabbitMQMessagePublisherService _messagePublisher; + private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; + private Dictionary _originalHL7Files; + private ExportRequestEvent _exportRequestEvent; + private readonly Assertions _assertions; + private readonly string _correlationId = Guid.NewGuid().ToString(); + private readonly string _exportTaskId = Guid.NewGuid().ToString(); + private readonly string _workflowInstanceId = Guid.NewGuid().ToString(); + internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromSeconds(30); + private readonly string _hl7SendAddress = "127.0.0.1"; + private readonly int _hl7Port = 2574; + private JsonMessage _messageToSend; + + private readonly List _hl7Messages = new List(); + private TcpListener _tcpListener; + + public Hl7StepDEfinitions(ObjectContainer objectContainer, Configurations configuration) + { + _objectContainer = objectContainer ?? throw new ArgumentNullException(nameof(objectContainer)); + _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); + _dataSinkMinio = objectContainer.Resolve("MinioClient"); + _dicomServer = objectContainer.Resolve("DicomScp"); + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _dataProvider = objectContainer.Resolve("DataProvider"); + _receivedExportHL7CompletedMessages = objectContainer.Resolve("ExportHL7CompleteSubscriber"); + _messagePublisher = objectContainer.Resolve("MessagingPublisher"); + _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); + _assertions = objectContainer.Resolve("Assertions"); + + DefaultDicomTags.AddRange(DicomTags); + _dicomServer.ClearFilesAndUseHashes = false; //we need to store actual files to send the data back to MIG + } + + [Given(@"a HL7 message that is exported to the test host")] + public async Task GivenAHLMessageThatIsExportedToTheTestHost() + { + HL7DestinationEntity destination; + try + { + destination = await _informaticsGatewayClient.HL7Destinations.Create(new HL7DestinationEntity + { + Name = _dicomServer.FeatureScpAeTitle, + AeTitle = _dicomServer.FeatureScpAeTitle, + HostIp = _hl7SendAddress, + Port = _hl7Port + }, CancellationToken.None); + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && ex.ProblemDetails.Detail.Contains("already exists")) + { + destination = await _informaticsGatewayClient.HL7Destinations.GetAeTitle(_dicomServer.FeatureScpAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + _dicomDestination = destination.Name; + + // Generate a study with multiple series + //_dataProvider.GenerateDicomData("MG", 1, 1); + await _dataProvider.GenerateHl7Messages("2.3"); + + _originalHL7Files = new Dictionary(_dataProvider.HL7Specs.Files); + + var path = "hl7filepath"; + await _dataSinkMinio.SaveHl7Async(_dataProvider, path); + + // Emit a export request event + _exportRequestEvent = new ExportRequestEvent + { + CorrelationId = _correlationId, + Destinations = new string[] { destination.Name }, + ExportTaskId = _exportTaskId, + Files = _dataProvider.HL7Specs.Files.Keys.Select(f => $"{path}/{f.Replace(".txt", ".hl7")}"), + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = _workflowInstanceId, + PayloadId = "ThisIs/My/Output/Folder", + }; + + _messageToSend = new JsonMessage( + _exportRequestEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + _exportRequestEvent.CorrelationId, + string.Empty); + + } + + [When(@"the HL7 Export message is received with (.*) messages acked (.*)")] + public async Task WhenTheHL7ExportMessageIsReceivedWithMessagesAcked(int messageCount, bool acked) + { + var cancellationToken = new CancellationToken(); + + _tcpListener = new System.Net.Sockets.TcpListener(IPAddress.Parse(_hl7SendAddress), _hl7Port); + _tcpListener.Start(); + + await _messagePublisher.Publish("md.export.hl7", _messageToSend.ToMessage()); + + List recievedMessages = new List(); + + for (int i = 0; i < messageCount; i++) + { + using var _client = await _tcpListener.AcceptTcpClientAsync(cancellationToken).ConfigureAwait(false); + await GetMessageAsync(_client, acked, cancellationToken); + if (_hl7Messages.Count == messageCount) + { break; } + } + + _tcpListener.Stop(); + } + + private async Task GetMessageAsync(TcpClient _client, bool acked, CancellationToken cancellationToken) + { + var messages = new List(); + using var _clientStream = _client.GetStream(); + _clientStream.ReadTimeout = 5000; + _clientStream.WriteTimeout = 5000; + var buffer = new byte[10240]; + + var s_cts = new CancellationTokenSource(); + s_cts.CancelAfter(60000); + + var bytesRead = _clientStream.Read(buffer, 0, buffer.Length); + + + if (bytesRead == 0 || s_cts.IsCancellationRequested) + { + return; + } + + var data = Encoding.UTF8.GetString(buffer.ToArray()); + + var _rawHl7Messages = HL7.Dotnetcore.MessageHelper.ExtractMessages(data); + foreach (var message in _rawHl7Messages) + { + var hl7Message = new HL7.Dotnetcore.Message(message); + hl7Message.ParseMessage(); + _hl7Messages.Add(hl7Message); + if (acked) + { await SendAcknowledgment(_clientStream, hl7Message, cancellationToken); } + } + return; + } + + [Then(@"ensure that exportcomplete messages are sent with (.*)")] + public async Task ThenEnsureThatExportcompleteMessagesAreSentWithSuscess(string valid) + { + var success = await _receivedExportHL7CompletedMessages.WaitforAsync(1, TimeSpan.FromSeconds(600)); + Assert.Equal(1, _receivedExportHL7CompletedMessages.Messages.Count); + var message = _receivedExportHL7CompletedMessages.Messages.First(); + var exportEvent = message.ConvertTo(); + var status = exportEvent.Status; + if (valid == "success") + { + Assert.Equal(ExportStatus.Success, status); + } + else if (valid == "failure") + { + Assert.Equal(ExportStatus.Failure, status); + } + + foreach (var hl7message in _hl7Messages) + { + Assertions.ShouldBeInMessageDictionary(_originalHL7Files, hl7message); + } + } + + private async Task SendAcknowledgment(NetworkStream networkStream, HL7.Dotnetcore.Message message, CancellationToken cancellationToken) + { + if (message == null) { return; } + var ackMessage = message.GetACK(); + var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); + { + try + { + await networkStream.WriteAsync(ackData, cancellationToken).ConfigureAwait(false); + await networkStream.FlushAsync(cancellationToken).ConfigureAwait(false); + } + catch (Exception) + { + throw; + } + } + } + } +} diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index 4fe3f720e..e16ccb4b4 100755 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -81,7 +81,7 @@ "hl7": { "port": 2575, "maximumNumberOfConnections": 10, - "clientTimeout": 60000, + "clientTimeout": 200, "sendAck": true } }, From af4c41677c5e0542a2aea75c8603bb90e55eb369 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 8 Dec 2023 12:13:33 +0000 Subject: [PATCH 52/75] adding HL7 plugin Signed-off-by: Neil South --- .github/workflows/ci.yml | 4 +- .gitignore | 1 + doc/dependency_decisions.yml | 46 +- src/Api/HL7DestinationEntity.cs | 40 ++ src/Api/Hl7ApplicationConfigEntity.cs | 170 +++++ .../HealthLevel7 => Api/Mllp}/IMllpClient.cs | 6 +- src/Api/Mllp/IMllpExtract.cs | 30 + src/Api/Mllp/IMllpService.cs | 27 + .../Mllp}/MllpClientResult.cs | 4 +- src/Api/{ => Models}/BaseApplicationEntity.cs | 3 +- .../DestinationApplicationEntity.cs | 2 +- src/Api/{ => Models}/DicomAssociationInfo.cs | 3 +- .../{ => Models}/ExportRequestDataMessage.cs | 2 +- src/Api/Models/ExternalAppDetails.cs | 39 ++ .../{ => Models}/MonaiApplicationEntity.cs | 3 +- ...Monai.Deploy.InformaticsGateway.Api.csproj | 7 +- src/Api/PlugIns/IInputHL7DataPlugIn.cs | 35 ++ src/Api/PlugIns/IInputHL7DataPlugInEngine.cs | 42 ++ src/Api/PlugIns/IOutputDataPlugin.cs | 1 + src/Api/PlugIns/IOutputDataPluginEngine.cs | 1 + src/Api/SourceApplicationEntity.cs | 2 + src/Api/Storage/DicomFileStorageMetadata.cs | 48 +- src/Api/Storage/FileStorageMetadata.cs | 5 +- src/Api/Storage/Hl7FileStorageMetadata.cs | 3 +- src/Api/{ => Storage}/MongoDBEntityBase.cs | 2 +- src/Api/Storage/Payload.cs | 10 +- src/Api/Storage/StorageObjectMetadata.cs | 9 +- src/Api/Test/BaseApplicationEntityTest.cs | 5 +- .../Test/DestinationApplicationEntityTest.cs | 5 +- src/Api/Test/HL7DestinationEntityTest.cs | 54 ++ .../Test/Hl7ApplicationConfigEntityTest.cs | 190 ++++++ src/Api/Test/MonaiApplicationEntityTest.cs | 5 +- .../Storage/DicomFileStorageMetadataTest.cs | 37 +- src/Api/Test/packages.lock.json | 26 +- src/Api/VirtualApplicationEntity.cs | 1 + src/Api/packages.lock.json | 26 +- src/CLI/Commands/AetCommand.cs | 2 +- src/CLI/Commands/DestinationCommand.cs | 2 +- .../Services/ConfigurationOptionAccessor.cs | 20 + src/CLI/Test/AetCommandTest.cs | 2 +- src/CLI/Test/DestinationCommandTest.cs | 2 +- src/CLI/Test/packages.lock.json | 26 +- src/CLI/packages.lock.json | 26 +- src/Client/IInformaticsGatewayClient.cs | 6 + src/Client/InformaticsGatewayClient.cs | 5 + src/Client/Services/AeTitle{T}Service.cs | 2 +- src/Client/Test/AeTitleServiceTest.cs | 1 + src/Client/Test/packages.lock.json | 91 +-- src/Client/packages.lock.json | 26 +- .../MessageBrokerConfigurationKeys.cs | 22 + src/Configuration/ScpConfiguration.cs | 6 + .../Test/ValidationExtensionsTest.cs | 1 + src/Configuration/Test/packages.lock.json | 26 +- src/Configuration/ValidationExtensions.cs | 16 + src/Configuration/packages.lock.json | 26 +- ...IDestinationApplicationEntityRepository.cs | 2 +- .../IDicomAssociationInfoRepository.cs | 2 +- .../IExternalAppDeatilsRepository.cs | 31 + .../IHL7DestinationEntityRepository.cs | 36 ++ .../IHl7ApplicationConfigRepository.cs | 35 ++ .../IMonaiApplicationEntityRepository.cs | 2 +- .../InferenceRequestRepositoryBase.cs | 3 +- src/Database/Api/StorageMetadataWrapper.cs | 1 - src/Database/Api/Test/packages.lock.json | 26 +- src/Database/Api/packages.lock.json | 26 +- src/Database/DatabaseManager.cs | 6 + src/Database/DatabaseMigrationManager.cs | 2 +- ...stinationApplicationEntityConfiguration.cs | 2 +- .../DicomAssociationInfoConfiguration.cs | 2 +- .../ExternalAppDetailsConfiguration.cs | 44 ++ .../HL7DestinationEntityConfiguration.cs | 43 ++ .../Hl7ApplicationConfigConfiguration.cs | 86 +++ .../MonaiApplicationEntityConfiguration.cs | 2 +- .../InformaticsGatewayContext.cs | 7 + .../20231120161347_202311201611.Designer.cs | 431 +++++++++++++ .../Migrations/20231120161347_202311201611.cs | 50 ++ ...113501_Hl7DEstinationAndConfig.Designer.cs | 505 +++++++++++++++ .../20231204113501_Hl7DEstinationAndConfig.cs | 78 +++ .../20231207154732_Hl7Plugins.Designer.cs | 508 +++++++++++++++ .../Migrations/20231207154732_Hl7Plugins.cs | 27 + .../InformaticsGatewayContextModelSnapshot.cs | 136 +++- ...icsGateway.Database.EntityFramework.csproj | 6 +- .../DestinationApplicationEntityRepository.cs | 2 +- .../DicomAssociationInfoRepository.cs | 2 +- .../ExternalAppDetailsRepository.cs | 110 ++++ .../HL7DestinationEntityRepository.cs | 143 +++++ .../Hl7ApplicationConfigRepository.cs | 95 +++ .../MonaiApplicationEntityRepository.cs | 2 +- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../DicomAssociationInfoRepositoryTest.cs | 2 +- .../Test/ExternalAppDetailsRepositoryTest.cs | 116 ++++ .../HL7DestinationEntityRepositoryTest.cs | 159 +++++ .../Test/InMemoryDatabaseFixture.cs | 1 + ...teway.Database.EntityFramework.Test.csproj | 2 +- .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../Test/SqliteDatabaseFixture.cs | 31 + .../EntityFramework/Test/packages.lock.json | 74 ++- .../EntityFramework/packages.lock.json | 74 ++- ....Deploy.InformaticsGateway.Database.csproj | 6 +- ...stinationApplicationEntityConfiguration.cs | 2 +- .../DicomAssociationInfoConfiguration.cs | 2 +- .../ExternalAppDetailsConfiguration.cs | 33 + .../HL7DestinationEntityConfiguration.cs | 34 + .../MonaiApplicationEntityConfiguration.cs | 2 +- .../MongoDBEntityBaseConfiguration.cs | 2 +- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../DicomAssociationInfoRepositoryTest.cs | 2 +- .../ExternalAppDetailsRepositoryTest.cs | 136 ++++ .../HL7DestinationEntityRepositoryTest.cs | 166 +++++ .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../Integration.Test/MongoDatabaseFixture.cs | 29 + .../Integration.Test/packages.lock.json | 26 +- .../MongoDB/MongoDatabaseMigrationManager.cs | 1 + .../DestinationApplicationEntityRepository.cs | 2 +- .../DicomAssociationInfoRepository.cs | 2 +- .../ExternalAppDetailsRepository.cs | 139 ++++ .../HL7DestinationEntityRepository.cs | 173 +++++ .../Hl7ApplicationConfigRepository.cs | 152 +++++ .../MonaiApplicationEntityRepository.cs | 2 +- src/Database/MongoDB/packages.lock.json | 26 +- src/Database/packages.lock.json | 111 ++-- .../Common/DestinationNotSuppliedException.cs | 43 ++ src/InformaticsGateway/InternalVisibleTo.cs | 0 .../Logging/Log.100.200.ScpService.cs | 9 +- .../Logging/Log.4000.ObjectUploadService.cs | 4 +- .../Logging/Log.500.ExportService.cs | 3 + .../Logging/Log.5000.DataPlugins.cs | 7 + .../Logging/Log.700.PayloadService.cs | 7 +- .../Logging/Log.800.Hl7Service.cs | 37 ++ .../Logging/Log.8000.HttpServices.cs | 29 + .../Monai.Deploy.InformaticsGateway.csproj | 6 +- src/InformaticsGateway/Program.cs | 37 +- .../Properties/launchSettings.json | 17 - .../Common/IInputDataPluginEngineFactory.cs | 7 + .../Common/InputHL7DataPlugInEngine.cs | 93 +++ .../Services/Common/OutputDataPluginEngine.cs | 5 +- .../Services/Common/ScpInputTypeEnum.cs | 24 + .../Connectors/DataRetrievalService.cs | 5 +- .../Services/Connectors/PayloadAssembler.cs | 4 +- .../PayloadNotificationActionHandler.cs | 2 +- .../Services/DicomWeb/ContentTypes.cs | 1 + .../Services/Export/DicomWebExportService.cs | 17 +- .../Export/ExportRequestEventDetails.cs | 19 +- .../Services/Export/ExportServiceBase.cs | 458 ++++++++++---- .../Services/Export/ExtAppScuExportService.cs | 166 +++++ .../Services/Export/ExternalAppExeception.cs | 40 ++ .../Services/Export/Hl7ExportService.cs | 164 +++++ .../Services/Export/ScuExportService.cs | 178 +----- .../Services/HealthLevel7/Hl7SendException.cs | 40 ++ .../HealthLevel7/IMllpClientFactory.cs | 5 +- .../Services/HealthLevel7/MllpClient.cs | 7 +- .../Services/HealthLevel7/MllpExtract.cs | 165 +++++ .../Services/HealthLevel7/MllpService.cs | 148 ++++- .../Services/HealthLevel7/Resources.cs | 1 + .../Http/DestinationAeTitleController.cs | 1 + .../Http/DicomAssociationInfoController.cs | 2 +- .../Services/Http/HL7DestinationController.cs | 239 +++++++ .../Services/Http/HealthController.cs | 0 .../Http/Hl7ApplicationConfigController.cs | 171 +++++ .../Services/Http/MonaiAeTitleController.cs | 1 + .../Services/Http/Startup.cs | 2 - .../Services/Scp/ApplicationEntityHandler.cs | 57 +- .../Services/Scp/ApplicationEntityManager.cs | 10 +- .../Services/Scp/ExternalAppScpService.cs | 94 +++ .../Scp/ExternalAppScpServiceInternal.cs | 71 +++ .../Services/Scp/IApplicationEntityHandler.cs | 5 +- .../Services/Scp/IApplicationEntityManager.cs | 3 +- .../Scp/IMonaiAeChangedNotificationService.cs | 2 +- .../Services/Scp/ScpService.cs | 86 +-- .../Services/Scp/ScpServiceBase.cs | 131 ++++ .../Services/Scp/ScpServiceInternal.cs | 181 +----- .../Services/Scp/ScpServiceInternalBase.cs | 207 ++++++ .../Services/Scu/ScuService.cs | 1 - .../Services/Storage/ObjectUploadService.cs | 2 +- ...onai.Deploy.InformaticsGateway.Test.csproj | 3 +- .../Test/Plug-ins/TestInputHL7DataPlugs.cs | 37 ++ .../Test/Plug-ins/TestOutputDataPlugIns.cs | 2 +- .../Repositories/MonaiServiceLocatorTest.cs | 7 +- .../InputHL7DataPlugInEngineFactoryTest.cs | 69 ++ .../Common/InputHL7DataPlugInEngineTest.cs | 145 +++++ .../Common/OutputDataPluginEngineTest.cs | 2 +- .../Export/DicomWebExportServiceTest.cs | 2 +- .../Services/Export/ExportHl7ServiceTests.cs | 385 ++++++++++++ .../Services/Export/ExportServiceBaseTest.cs | 56 +- .../Services/Export/ExtAppScuServiceTest.cs | 595 ++++++++++++++++++ .../Services/Export/ScuExportServiceTest.cs | 6 +- .../Services/HealthLevel7/MllPExtractTests.cs | 204 ++++++ .../Services/HealthLevel7/MllpClientTest.cs | 3 + .../Services/HealthLevel7/MllpServiceTest.cs | 64 +- .../Http/DestinationAeTitleControllerTest.cs | 2 +- .../DicomAssociationInfoControllerTest.cs | 2 +- .../Hl7ApplicationConfigControllerTest.cs | 322 ++++++++++ .../Http/MonaiAeTitleControllerTest.cs | 2 +- .../Scp/ApplicationEntityHandlerTest.cs | 40 +- .../Scp/ApplicationEntityManagerTest.cs | 11 +- .../MonaiAeChangedNotificationServiceTest.cs | 2 +- .../Test/Services/Scp/ScpServiceTest.cs | 67 +- src/InformaticsGateway/Test/appsettings.json | 2 +- .../Test/packages.lock.json | 121 ++-- .../appsettings.Development.json | 5 +- src/InformaticsGateway/appsettings.Test.json | 2 +- src/InformaticsGateway/appsettings.json | 8 +- src/InformaticsGateway/packages.lock.json | 245 ++------ .../RemoteAppExecution/DicomDeidentifier.cs | 2 +- ...sGateway.PlugIns.RemoteAppExecution.csproj | 8 +- .../RemoteAppExecution/RemoteAppExecution.cs | 2 +- .../Test/DicomDeidentifierTest.cs | 2 +- ...way.PlugIns.RemoteAppExecution.Test.csproj | 6 +- .../Test/packages.lock.json | 80 +-- .../RemoteAppExecution/packages.lock.json | 76 +-- tests/Integration.Test/Common/Assertions.cs | 7 +- tests/Integration.Test/Common/DataProvider.cs | 0 .../Common/DicomCEchoDataClient.cs | 1 + .../Common/DicomCStoreDataClient.cs | 1 + .../Common/DicomWebDataSink.cs | 1 + tests/Integration.Test/Common/FhirDataSink.cs | 1 + tests/Integration.Test/Common/Hl7DataSink.cs | 1 + tests/Integration.Test/Common/IDataClient.cs | 2 + .../Integration.Test/Common/MinioDataSink.cs | 33 + .../Drivers/MongoDBDataProvider.cs | 1 + .../Features/ExternalApp.feature | 27 + .../Features/HL7Export.feature | 32 + .../Features/RemoteAppExecutionPlugIn.feature | 1 + tests/Integration.Test/Hooks/TestHooks.cs | 11 + ...InformaticsGateway.Integration.Test.csproj | 6 +- .../DicomDimseScpServicesStepDefinitions.cs | 1 + .../ExportServicesStepDefinitions.cs | 2 +- .../ExteralAppStepDefinitions.cs | 258 ++++++++ .../StepDefinitions/Hl7StepDefinitions.cs | 237 +++++++ ...emoteAppExecutionPlugInsStepDefinitions.cs | 4 +- tests/Integration.Test/appsettings.json | 22 +- tests/Integration.Test/packages.lock.json | 223 +++++-- 232 files changed, 10240 insertions(+), 1403 deletions(-) mode change 100644 => 100755 .github/workflows/ci.yml create mode 100644 src/Api/HL7DestinationEntity.cs create mode 100755 src/Api/Hl7ApplicationConfigEntity.cs rename src/{InformaticsGateway/Services/HealthLevel7 => Api/Mllp}/IMllpClient.cs (88%) mode change 100644 => 100755 create mode 100755 src/Api/Mllp/IMllpExtract.cs create mode 100755 src/Api/Mllp/IMllpService.cs rename src/{InformaticsGateway/Services/HealthLevel7 => Api/Mllp}/MllpClientResult.cs (91%) rename src/Api/{ => Models}/BaseApplicationEntity.cs (96%) mode change 100644 => 100755 rename src/Api/{ => Models}/DestinationApplicationEntity.cs (95%) mode change 100644 => 100755 rename src/Api/{ => Models}/DicomAssociationInfo.cs (94%) mode change 100644 => 100755 rename src/Api/{ => Models}/ExportRequestDataMessage.cs (98%) create mode 100755 src/Api/Models/ExternalAppDetails.cs rename src/Api/{ => Models}/MonaiApplicationEntity.cs (98%) create mode 100755 src/Api/PlugIns/IInputHL7DataPlugIn.cs create mode 100755 src/Api/PlugIns/IInputHL7DataPlugInEngine.cs mode change 100644 => 100755 src/Api/PlugIns/IOutputDataPlugin.cs mode change 100644 => 100755 src/Api/PlugIns/IOutputDataPluginEngine.cs mode change 100644 => 100755 src/Api/Storage/DicomFileStorageMetadata.cs mode change 100644 => 100755 src/Api/Storage/FileStorageMetadata.cs mode change 100644 => 100755 src/Api/Storage/Hl7FileStorageMetadata.cs rename src/Api/{ => Storage}/MongoDBEntityBase.cs (95%) mode change 100644 => 100755 mode change 100644 => 100755 src/Api/Test/BaseApplicationEntityTest.cs mode change 100644 => 100755 src/Api/Test/DestinationApplicationEntityTest.cs create mode 100644 src/Api/Test/HL7DestinationEntityTest.cs create mode 100644 src/Api/Test/Hl7ApplicationConfigEntityTest.cs mode change 100644 => 100755 src/Api/Test/MonaiApplicationEntityTest.cs mode change 100644 => 100755 src/Api/Test/Storage/DicomFileStorageMetadataTest.cs mode change 100644 => 100755 src/Api/VirtualApplicationEntity.cs mode change 100644 => 100755 src/CLI/Commands/AetCommand.cs mode change 100644 => 100755 src/CLI/Commands/DestinationCommand.cs mode change 100644 => 100755 src/CLI/Services/ConfigurationOptionAccessor.cs mode change 100644 => 100755 src/CLI/Test/AetCommandTest.cs mode change 100644 => 100755 src/CLI/Test/DestinationCommandTest.cs mode change 100644 => 100755 src/Client/IInformaticsGatewayClient.cs mode change 100644 => 100755 src/Client/InformaticsGatewayClient.cs mode change 100644 => 100755 src/Client/Services/AeTitle{T}Service.cs mode change 100644 => 100755 src/Client/Test/AeTitleServiceTest.cs mode change 100644 => 100755 src/Configuration/ScpConfiguration.cs mode change 100644 => 100755 src/Configuration/Test/ValidationExtensionsTest.cs mode change 100644 => 100755 src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs create mode 100755 src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs create mode 100644 src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs create mode 100644 src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs mode change 100644 => 100755 src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs mode change 100644 => 100755 src/Database/DatabaseMigrationManager.cs mode change 100644 => 100755 src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs create mode 100755 src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs create mode 100644 src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs create mode 100755 src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs mode change 100644 => 100755 src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs create mode 100755 src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs create mode 100755 src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs create mode 100755 src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs mode change 100644 => 100755 src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs mode change 100644 => 100755 src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj create mode 100755 src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs create mode 100644 src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs create mode 100755 src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs create mode 100755 src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs create mode 100644 src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj mode change 100644 => 100755 src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs create mode 100755 src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs mode change 100644 => 100755 src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs create mode 100755 src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs create mode 100644 src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/MongoDatabaseMigrationManager.cs create mode 100755 src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs create mode 100755 src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs create mode 100755 src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs create mode 100755 src/InformaticsGateway/Common/DestinationNotSuppliedException.cs mode change 100644 => 100755 src/InformaticsGateway/InternalVisibleTo.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.800.Hl7Service.cs delete mode 100755 src/InformaticsGateway/Properties/launchSettings.json mode change 100644 => 100755 src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs create mode 100755 src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs create mode 100755 src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs create mode 100755 src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs create mode 100755 src/InformaticsGateway/Services/Export/ExternalAppExeception.cs create mode 100755 src/InformaticsGateway/Services/Export/Hl7ExportService.cs create mode 100755 src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs mode change 100644 => 100755 src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs mode change 100644 => 100755 src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs create mode 100755 src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs mode change 100644 => 100755 src/InformaticsGateway/Services/HealthLevel7/Resources.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs create mode 100755 src/InformaticsGateway/Services/Http/HL7DestinationController.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Http/HealthController.cs create mode 100755 src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs create mode 100755 src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs create mode 100755 src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Scp/ScpService.cs create mode 100755 src/InformaticsGateway/Services/Scp/ScpServiceBase.cs create mode 100755 src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs create mode 100755 src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs create mode 100755 src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs create mode 100755 src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs create mode 100755 src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs create mode 100755 src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs create mode 100755 src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs create mode 100755 src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs mode change 100644 => 100755 src/InformaticsGateway/Test/appsettings.json mode change 100644 => 100755 src/InformaticsGateway/appsettings.Development.json mode change 100644 => 100755 src/InformaticsGateway/appsettings.Test.json mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj mode change 100644 => 100755 tests/Integration.Test/Common/Assertions.cs mode change 100644 => 100755 tests/Integration.Test/Common/DataProvider.cs mode change 100644 => 100755 tests/Integration.Test/Common/DicomCEchoDataClient.cs mode change 100644 => 100755 tests/Integration.Test/Common/DicomCStoreDataClient.cs mode change 100644 => 100755 tests/Integration.Test/Common/DicomWebDataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/FhirDataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/Hl7DataSink.cs mode change 100644 => 100755 tests/Integration.Test/Common/IDataClient.cs mode change 100644 => 100755 tests/Integration.Test/Common/MinioDataSink.cs mode change 100644 => 100755 tests/Integration.Test/Drivers/MongoDBDataProvider.cs create mode 100755 tests/Integration.Test/Features/ExternalApp.feature create mode 100755 tests/Integration.Test/Features/HL7Export.feature mode change 100644 => 100755 tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs create mode 100755 tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs create mode 100755 tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml old mode 100644 new mode 100755 index ca6a5527c..51a009a7b --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,11 +183,11 @@ jobs: ports: - 27017:27017 steps: - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: zulu - java-version: '11' + java-version: '17' - uses: actions/setup-dotnet@v3 with: diff --git a/.gitignore b/.gitignore index 8c4eb593b..990b81827 100644 --- a/.gitignore +++ b/.gitignore @@ -560,3 +560,4 @@ FodyWeavers.xsd # Additional files built by Visual Studio # End of https://www.toptal.com/developers/gitignore/api/aspnetcore,dotnetcore,visualstudio,visualstudiocode +/src/InformaticsGateway/Properties/launchSettings.json diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index bee058ae7..dc7dcac0a 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -314,13 +314,15 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:49.698463427 Z + - 6.0.25 + - :when: 2022-08-16 23:05:49.698463427 Z - - :approve - Microsoft.EntityFrameworkCore - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 + - 6.0.25 :when: 2022-08-16 23:05:50.137694970 Z - - :approve - Microsoft.EntityFrameworkCore.Abstractions @@ -328,41 +330,53 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:51.008105271 Z + - 6.0.25 + - :when: 2022-08-16 23:05:51.008105271 Z - - :approve - Microsoft.EntityFrameworkCore.Analyzers - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:51.445711308 Z + - 6.0.25 + - :when: 2022-08-16 23:05:51.445711308 Z - - :approve - Microsoft.EntityFrameworkCore.Design - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:51.922790944 Z + - 6.0.25 + - :when: 2022-08-16 23:05:51.922790944 Z - - :approve - Microsoft.EntityFrameworkCore.InMemory - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:52.375150938 Z + - 6.0.25 + - :when: 2022-08-16 23:05:52.375150938 Z - - :approve - Microsoft.EntityFrameworkCore.Relational - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-16 23:05:52.828879230 Z + - 6.0.25 + - :when: 2022-08-16 23:05:52.828879230 Z +- - :approve + - Microsoft.EntityFrameworkCore.Tools + - :who: ndsouth + :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) + :versions: + - 6.0.25 + - :when: 2022-08-16 23:05:52.828879230 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite - :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - - 6.0.22 + - 6.0.25 :when: 2022-08-16 23:05:53.270526921 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite.Core @@ -370,6 +384,7 @@ :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) :versions: - 6.0.22 + - 6.0.25 :when: 2022-08-16 23:05:53.706997823 Z - - :approve - Microsoft.Extensions.ApiDescription.Server @@ -512,7 +527,8 @@ :versions: - 6.0.21 - 6.0.22 - :when: 2022-08-29 18:11:22.090772006 Z + - 6.0.25 + - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - :who: mocsharp @@ -520,14 +536,16 @@ :versions: - 6.0.21 - 6.0.22 - :when: 2022-08-29 18:11:22.090772006 Z + - 6.0.25 + - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore - :who: mocsharp :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.22 - :when: 2022-08-29 18:11:22.090772006 Z + - 6.0.25 + - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.FileProviders.Abstractions - :who: mocsharp @@ -774,16 +792,16 @@ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.3 - - 1.0.4 + - 1.0.5-rc0006 + - 1.0.5 :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Messaging.RabbitMQ - :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) :versions: - - 1.0.3 - - 1.0.4 + - 1.0.5-rc0006 + - 1.0.5 :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Storage diff --git a/src/Api/HL7DestinationEntity.cs b/src/Api/HL7DestinationEntity.cs new file mode 100644 index 000000000..33655bdde --- /dev/null +++ b/src/Api/HL7DestinationEntity.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2020 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Monai.Deploy.InformaticsGateway.Api.Models +{ + /// + /// HL7 Destination Entity + /// + /// + /// + /// { + /// "name": "MYPACS", + /// "hostIp": "10.20.100.200", + /// "aeTitle": "MONAIPACS", + /// "port": 1104 + /// } + /// + /// + public class HL7DestinationEntity : BaseApplicationEntity + { + /// + /// Gets or sets the port to connect to. + /// + public int Port { get; set; } + } +} diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs new file mode 100755 index 000000000..3025cb967 --- /dev/null +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -0,0 +1,170 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Common; +using Newtonsoft.Json; + +namespace Monai.Deploy.InformaticsGateway.Api +{ + public class Hl7ApplicationConfigEntity : MongoDBEntityBase + { + /// + /// Gets or sets the name of a Hl7 application entity. + /// This value must be unique. + /// + [Key, Column(Order = 0)] + public string Name { get; set; } = default!; + + /// + /// Gets or sets the sending identifier. + /// + [JsonProperty("sending_identifier")] + public StringKeyValuePair SendingId { get; set; } = new(); + + /// + /// Gets or sets the data link. + /// Value is either PatientId or StudyInstanceUid + /// + [JsonProperty("data_link")] + public DataKeyValuePair DataLink { get; set; } = new(); + + /// + /// Gets or sets the data mapping. + /// Value is a DICOM Tag + /// + [JsonProperty("data_mapping")] + public List DataMapping { get; set; } = new(); + + /// + /// Optional list of data input plug-in type names to be executed by the . + /// + public List PlugInAssemblies { get; set; } = default!; + + public DateTime LastModified { get; set; } = DateTime.UtcNow; + + public IEnumerable Validate() + { + var errors = new List(); + if (string.IsNullOrWhiteSpace(SendingId.Key)) + errors.Add($"{nameof(SendingId.Key)} is missing."); + if (string.IsNullOrWhiteSpace(SendingId.Value)) + errors.Add($"{nameof(SendingId.Value)} is missing."); + + if (string.IsNullOrWhiteSpace(DataLink.Key)) + errors.Add($"{nameof(DataLink.Key)} is missing."); + + if (DataMapping.IsNullOrEmpty()) + errors.Add($"{nameof(DataMapping)} is missing values."); + + ValidateDataMapping(errors); + + return errors; + } + + private void ValidateDataMapping(List errors) + { + for (var idx = 0; idx < DataMapping.Count; idx++) + { + var dataMapKvp = DataMapping[idx]; + + if (string.IsNullOrWhiteSpace(dataMapKvp.Key) || dataMapKvp.Value.Length < 8) + { + if (string.IsNullOrWhiteSpace(dataMapKvp.Key)) + errors.Add($"{nameof(DataMapping)} is missing a name at index {idx}."); + + if (string.IsNullOrWhiteSpace(dataMapKvp.Value) || dataMapKvp.Value.Length < 8) + errors.Add($"{nameof(DataMapping)} ({dataMapKvp.Key}) @ index {idx} is not a valid DICOM Tag."); + + continue; + } + + try + { + DicomTag.Parse(dataMapKvp.Value); + } + catch (Exception e) + { + errors.Add($"DataMapping.Value is not a valid DICOM Tag. {e.Message}"); + } + } + } + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } + } + + //string key, string value + public class StringKeyValuePair : IKeyValuePair + { + [Key] + public string Key { get; set; } = string.Empty; + public string Value { get; set; } = string.Empty; + + public static implicit operator StringKeyValuePair(KeyValuePair kvp) + { + return new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }; + } + + public static List FromDictionary(Dictionary dictionary) => + dictionary.Select(kvp => new StringKeyValuePair { Key = kvp.Key, Value = kvp.Value }).ToList(); + + public override bool Equals(object? obj) => Equals(obj as StringKeyValuePair); + + public bool Equals(StringKeyValuePair? other) => other != null && Key == other.Key && Value == other.Value; + + public override int GetHashCode() => HashCode.Combine(Key, Value); + + } + + public class DataKeyValuePair : IKeyValuePair + { + [Key] + public string Key { get; set; } = string.Empty; + public DataLinkType Value { get; set; } + + public static implicit operator DataKeyValuePair(KeyValuePair kvp) + { + return new DataKeyValuePair { Key = kvp.Key, Value = kvp.Value }; + } + + public override bool Equals(object? obj) => Equals(obj as DataKeyValuePair); + + public bool Equals(DataKeyValuePair? other) => other != null && Key == other.Key && Value == other.Value; + + public override int GetHashCode() => HashCode.Combine(Key, Value); + } + + public interface IKeyValuePair + { + public TKey Key { get; set; } + public TValue Value { get; set; } + } + + public enum DataLinkType + { + PatientId, + StudyInstanceUid + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs b/src/Api/Mllp/IMllpClient.cs old mode 100644 new mode 100755 similarity index 88% rename from src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs rename to src/Api/Mllp/IMllpClient.cs index 8e38ac846..e8c631c32 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs +++ b/src/Api/Mllp/IMllpClient.cs @@ -18,9 +18,9 @@ using System.Threading; using System.Threading.Tasks; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal interface IMllpClient : IDisposable + public interface IMllpClient : IDisposable { Guid ClientId { get; } @@ -28,4 +28,4 @@ internal interface IMllpClient : IDisposable Task Start(Func onDisconnect, CancellationToken cancellationToken); } -} \ No newline at end of file +} diff --git a/src/Api/Mllp/IMllpExtract.cs b/src/Api/Mllp/IMllpExtract.cs new file mode 100755 index 000000000..2c82fee46 --- /dev/null +++ b/src/Api/Mllp/IMllpExtract.cs @@ -0,0 +1,30 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.Mllp +{ + public interface IMllpExtract + { + Task ExtractInfo(Hl7FileStorageMetadata meta, Message message, Hl7ApplicationConfigEntity configItem); + + Task GetConfigItem(Message message); + } +} diff --git a/src/Api/Mllp/IMllpService.cs b/src/Api/Mllp/IMllpService.cs new file mode 100755 index 000000000..d12e1fd28 --- /dev/null +++ b/src/Api/Mllp/IMllpService.cs @@ -0,0 +1,27 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Net; +using System.Threading; +using System.Threading.Tasks; + +namespace Monai.Deploy.InformaticsGateway.Api.Mllp +{ + public interface IMllpService + { + Task SendMllp(IPAddress address, int port, string hl7Message, CancellationToken cancellationToken); + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClientResult.cs b/src/Api/Mllp/MllpClientResult.cs similarity index 91% rename from src/InformaticsGateway/Services/HealthLevel7/MllpClientResult.cs rename to src/Api/Mllp/MllpClientResult.cs index 401875804..36db3b65f 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClientResult.cs +++ b/src/Api/Mllp/MllpClientResult.cs @@ -18,9 +18,9 @@ using System.Collections.Generic; using HL7.Dotnetcore; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal class MllpClientResult + public class MllpClientResult { public IList Messages { get; } public AggregateException? AggregateException { get; } diff --git a/src/Api/BaseApplicationEntity.cs b/src/Api/Models/BaseApplicationEntity.cs old mode 100644 new mode 100755 similarity index 96% rename from src/Api/BaseApplicationEntity.cs rename to src/Api/Models/BaseApplicationEntity.cs index ba0199ee6..0de7a3e39 --- a/src/Api/BaseApplicationEntity.cs +++ b/src/Api/Models/BaseApplicationEntity.cs @@ -17,8 +17,9 @@ using System; using System.Security.Claims; +using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// DICOM Application Entity or AE. diff --git a/src/Api/DestinationApplicationEntity.cs b/src/Api/Models/DestinationApplicationEntity.cs old mode 100644 new mode 100755 similarity index 95% rename from src/Api/DestinationApplicationEntity.cs rename to src/Api/Models/DestinationApplicationEntity.cs index 6599591fa..4a7069edd --- a/src/Api/DestinationApplicationEntity.cs +++ b/src/Api/Models/DestinationApplicationEntity.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// Destination Application Entity diff --git a/src/Api/DicomAssociationInfo.cs b/src/Api/Models/DicomAssociationInfo.cs old mode 100644 new mode 100755 similarity index 94% rename from src/Api/DicomAssociationInfo.cs rename to src/Api/Models/DicomAssociationInfo.cs index d3a3eb775..e4f119ca6 --- a/src/Api/DicomAssociationInfo.cs +++ b/src/Api/Models/DicomAssociationInfo.cs @@ -16,8 +16,9 @@ using System; using System.Collections.Generic; +using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { public class DicomAssociationInfo : MongoDBEntityBase { diff --git a/src/Api/ExportRequestDataMessage.cs b/src/Api/Models/ExportRequestDataMessage.cs similarity index 98% rename from src/Api/ExportRequestDataMessage.cs rename to src/Api/Models/ExportRequestDataMessage.cs index 891b1a8d8..9fd79d578 100755 --- a/src/Api/ExportRequestDataMessage.cs +++ b/src/Api/Models/ExportRequestDataMessage.cs @@ -20,7 +20,7 @@ using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.Messaging.Events; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { public class ExportRequestDataMessage { diff --git a/src/Api/Models/ExternalAppDetails.cs b/src/Api/Models/ExternalAppDetails.cs new file mode 100755 index 000000000..6353bc648 --- /dev/null +++ b/src/Api/Models/ExternalAppDetails.cs @@ -0,0 +1,39 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.Models +{ + public class ExternalAppDetails : MongoDBEntityBase + { + public string StudyInstanceUid { get; set; } = string.Empty; + + public string StudyInstanceUidOutBound { get; set; } = string.Empty; + + public string WorkflowInstanceId { get; set; } = string.Empty; + + public string ExportTaskID { get; set; } = string.Empty; + + public string CorrelationId { get; set; } = string.Empty; + + public string? DestinationFolder { get; set; } + + public string PatientId { get; set; } = string.Empty; + + public string PatientIdOutBound { get; set; } = string.Empty; + } +} diff --git a/src/Api/MonaiApplicationEntity.cs b/src/Api/Models/MonaiApplicationEntity.cs similarity index 98% rename from src/Api/MonaiApplicationEntity.cs rename to src/Api/Models/MonaiApplicationEntity.cs index 9e2929147..8ec95e37d 100755 --- a/src/Api/MonaiApplicationEntity.cs +++ b/src/Api/Models/MonaiApplicationEntity.cs @@ -21,8 +21,9 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Security.Claims; using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Models { /// /// MONAI Application Entity diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index ed19368f5..181306f97 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -53,10 +53,11 @@ + - - - + + + diff --git a/src/Api/PlugIns/IInputHL7DataPlugIn.cs b/src/Api/PlugIns/IInputHL7DataPlugIn.cs new file mode 100755 index 000000000..b44d0f736 --- /dev/null +++ b/src/Api/PlugIns/IInputHL7DataPlugIn.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.PlugIns +{ + /// + /// IInputDataPlugIn enables lightweight data processing over incoming data received from supported data ingestion + /// services. + /// Refer to for additional details. + /// + public interface IInputHL7DataPlugIn + { + string Name { get; } + + Task<(Message hl7Message, FileStorageMetadata fileMetadata)> ExecuteAsync(Message hl7File, FileStorageMetadata fileMetadata); + } + +} diff --git a/src/Api/PlugIns/IInputHL7DataPlugInEngine.cs b/src/Api/PlugIns/IInputHL7DataPlugInEngine.cs new file mode 100755 index 000000000..dc34b976d --- /dev/null +++ b/src/Api/PlugIns/IInputHL7DataPlugInEngine.cs @@ -0,0 +1,42 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.PlugIns +{ + /// + /// IInputDataPlugInEngine processes incoming data receivied from various supported services through + /// a list of plug-ins based on . + /// Rules: + /// + /// SCP: A list of plug-ins can be configured with each AET, and each plug-in is executed in the order stored, enabling piping of the incoming data before each file is uploaded to the storage service. + /// Incoming data is processed one file at a time and SHALL not wait for the entire study to arrive. + /// Plug-ins MUST be lightweight and not hinder the upload process. + /// Plug-ins SHALL not accumulate files in memory or storage for bulk processing. + /// + /// + public interface IInputHL7DataPlugInEngine + { + void Configure(IReadOnlyList pluginAssemblies); + + Task> ExecutePlugInsAsync(Message hl7File, FileStorageMetadata fileMetadata, Hl7ApplicationConfigEntity configItem); + } +} diff --git a/src/Api/PlugIns/IOutputDataPlugin.cs b/src/Api/PlugIns/IOutputDataPlugin.cs old mode 100644 new mode 100755 index 47d36da12..8bd695108 --- a/src/Api/PlugIns/IOutputDataPlugin.cs +++ b/src/Api/PlugIns/IOutputDataPlugin.cs @@ -16,6 +16,7 @@ using System.Threading.Tasks; using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Api.PlugIns { diff --git a/src/Api/PlugIns/IOutputDataPluginEngine.cs b/src/Api/PlugIns/IOutputDataPluginEngine.cs old mode 100644 new mode 100755 index 07e62ccd0..080717a3d --- a/src/Api/PlugIns/IOutputDataPluginEngine.cs +++ b/src/Api/PlugIns/IOutputDataPluginEngine.cs @@ -16,6 +16,7 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Api.PlugIns { diff --git a/src/Api/SourceApplicationEntity.cs b/src/Api/SourceApplicationEntity.cs index 604bf2eae..b46a61b8c 100755 --- a/src/Api/SourceApplicationEntity.cs +++ b/src/Api/SourceApplicationEntity.cs @@ -15,6 +15,8 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; + namespace Monai.Deploy.InformaticsGateway.Api { /// diff --git a/src/Api/Storage/DicomFileStorageMetadata.cs b/src/Api/Storage/DicomFileStorageMetadata.cs old mode 100644 new mode 100755 index c6b0f4b39..9a01fda52 --- a/src/Api/Storage/DicomFileStorageMetadata.cs +++ b/src/Api/Storage/DicomFileStorageMetadata.cs @@ -36,7 +36,7 @@ public sealed record DicomFileStorageMetadata : FileStorageMetadata /// Gets or set the Study Instance UID of the DICOM instance. /// [JsonPropertyName("studyInstanceUid")] - public string StudyInstanceUid { get; init; } = default!; + public string StudyInstanceUid { get; set; } = default!; /// /// Gets or set the Series Instance UID of the DICOM instance. @@ -93,6 +93,15 @@ public DicomFileStorageMetadata(string associationId, string identifier, string StudyInstanceUid = studyInstanceUid; SeriesInstanceUid = seriesInstanceUid; SopInstanceUid = sopInstanceUid; + SetupFilePaths(associationId); + + DataOrigin.DataService = dataService; + DataOrigin.Source = callingAeTitle; + DataOrigin.Destination = calledAeTitle; + } + + private void SetupFilePaths(string associationId) + { File = new StorageObjectMetadata(FileExtension) { TemporaryPath = string.Join(PathSeparator, associationId, DataTypeDirectoryName, $"{Guid.NewGuid()}{FileExtension}"), @@ -106,16 +115,45 @@ public DicomFileStorageMetadata(string associationId, string identifier, string UploadPath = $"{File.UploadPath}{DicomJsonFileExtension}", ContentType = DicomJsonContentType, }; + } - DataOrigin.DataService = dataService; - DataOrigin.Source = callingAeTitle; - DataOrigin.Destination = calledAeTitle; + public void SetupGivenFilePaths(string? DestinationFolder) + { + if (DestinationFolder is null) + { + return; + } + + if (DestinationFolder.EndsWith('/')) + { + DestinationFolder = DestinationFolder.Remove(DestinationFolder.Length - 1); + } + + File = new StorageObjectMetadata(FileExtension) + { + TemporaryPath = string.Join(PathSeparator, DestinationFolder, $"Temp{PathSeparator}{Guid.NewGuid()}{FileExtension}"), + UploadPath = string.Join(PathSeparator, DestinationFolder, $"{SopInstanceUid}{FileExtension}"), + ContentType = DicomContentType, + DestinationFolderOverride = true, + }; + + JsonFile = new StorageObjectMetadata(DicomJsonFileExtension) + { + TemporaryPath = $"{File.TemporaryPath}{DicomJsonFileExtension}", + UploadPath = $"{File.UploadPath}{DicomJsonFileExtension}", + ContentType = DicomJsonContentType, + DestinationFolderOverride = true, + }; + + //DestinationFolderNeil = DestinationFolder; } + public void SetStudyInstanceUid(string newStudyInstanceUid) => StudyInstanceUid = newStudyInstanceUid; + public override void SetFailed() { base.SetFailed(); JsonFile.SetFailed(); } } -} \ No newline at end of file +} diff --git a/src/Api/Storage/FileStorageMetadata.cs b/src/Api/Storage/FileStorageMetadata.cs old mode 100644 new mode 100755 index 302612d07..62a530f1d --- a/src/Api/Storage/FileStorageMetadata.cs +++ b/src/Api/Storage/FileStorageMetadata.cs @@ -104,6 +104,9 @@ public abstract record FileStorageMetadata [JsonPropertyName("payloadId")] public string? PayloadId { get; set; } + // [JsonPropertyName("destinationFolder")] + //public string? DestinationFolderNeil { get; set; } + /// /// DO NOT USE /// This constructor is intended for JSON serializer. @@ -162,4 +165,4 @@ public static string IpAddress() return "127.0.0.1"; } } -} \ No newline at end of file +} diff --git a/src/Api/Storage/Hl7FileStorageMetadata.cs b/src/Api/Storage/Hl7FileStorageMetadata.cs old mode 100644 new mode 100755 index 2356f7738..576f88ae3 --- a/src/Api/Storage/Hl7FileStorageMetadata.cs +++ b/src/Api/Storage/Hl7FileStorageMetadata.cs @@ -54,6 +54,7 @@ public Hl7FileStorageMetadata(string connectionId, DataService dataType, string DataOrigin.DataService = dataType; DataOrigin.Source = dataOrigin; DataOrigin.Destination = IpAddress(); + DataOrigin.ArtifactType = Messaging.Common.ArtifactType.HL7; File = new StorageObjectMetadata(FileExtension) { @@ -63,4 +64,4 @@ public Hl7FileStorageMetadata(string connectionId, DataService dataType, string }; } } -} \ No newline at end of file +} diff --git a/src/Api/MongoDBEntityBase.cs b/src/Api/Storage/MongoDBEntityBase.cs old mode 100644 new mode 100755 similarity index 95% rename from src/Api/MongoDBEntityBase.cs rename to src/Api/Storage/MongoDBEntityBase.cs index 41b206a6e..1d2a38443 --- a/src/Api/MongoDBEntityBase.cs +++ b/src/Api/Storage/MongoDBEntityBase.cs @@ -16,7 +16,7 @@ using System; -namespace Monai.Deploy.InformaticsGateway.Api +namespace Monai.Deploy.InformaticsGateway.Api.Storage { public abstract class MongoDBEntityBase { diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs index d88ffce7c..c390625a1 100755 --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -86,6 +86,8 @@ public TimeSpan Elapsed public int FilesFailedToUpload { get => Files.Count(p => p.IsUploadFailed); } + public string DestinationFolder { get; set; } = string.Empty; + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); @@ -106,7 +108,7 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str DataTrigger = dataTrigger; } - public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null) : + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null, string? DestinationFolder = null) : this(key, correlationId, workflowInstanceId, taskId, dataTrigger, timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); @@ -119,6 +121,7 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str { PayloadId = Guid.Parse(payloadId); } + DestinationFolder ??= string.Empty; } public void Add(FileStorageMetadata value) @@ -132,6 +135,11 @@ public void Add(FileStorageMetadata value) DataOrigins.Add(value.DataOrigin); } + //if (string.IsNullOrWhiteSpace(value.DestinationFolderNeil) is false) + //{ + // DestinationFolder = value.DestinationFolderNeil; + //} + _lastReceived.Reset(); _lastReceived.Start(); } diff --git a/src/Api/Storage/StorageObjectMetadata.cs b/src/Api/Storage/StorageObjectMetadata.cs index 93badfbf1..074463f2e 100755 --- a/src/Api/Storage/StorageObjectMetadata.cs +++ b/src/Api/Storage/StorageObjectMetadata.cs @@ -88,6 +88,9 @@ public class StorageObjectMetadata [JsonPropertyName("isMoveCompleted"), JsonInclude] public bool IsMoveCompleted { get; private set; } = default!; + [JsonPropertyName("destinationFolderOverride")] + public bool DestinationFolderOverride { get; set; } = false; + public StorageObjectMetadata(string fileExtension) { Guard.Against.NullOrWhiteSpace(fileExtension, nameof(fileExtension)); @@ -111,7 +114,11 @@ public string GetPayloadPath(Guid payloadId) { Guard.Against.Null(payloadId, nameof(payloadId)); - return $"{payloadId}{FileStorageMetadata.PathSeparator}{UploadPath}"; + if (DestinationFolderOverride is false) + { + return $"{payloadId}{FileStorageMetadata.PathSeparator}{UploadPath}"; + } + return $"{UploadPath}"; } public void SetUploaded(string bucketName) diff --git a/src/Api/Test/BaseApplicationEntityTest.cs b/src/Api/Test/BaseApplicationEntityTest.cs old mode 100644 new mode 100755 index ef9b14808..6fcfd032c --- a/src/Api/Test/BaseApplicationEntityTest.cs +++ b/src/Api/Test/BaseApplicationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test @@ -21,7 +22,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class BaseApplicationEntityTest { [Fact] - public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToSetName() + public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { var entity = new BaseApplicationEntity { @@ -35,7 +36,7 @@ public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValues } [Fact] - public void GivenABaseApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotSetName() + public void GivenABaseApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { var entity = new BaseApplicationEntity { diff --git a/src/Api/Test/DestinationApplicationEntityTest.cs b/src/Api/Test/DestinationApplicationEntityTest.cs old mode 100644 new mode 100755 index 9e8287842..ec1cfe9be --- a/src/Api/Test/DestinationApplicationEntityTest.cs +++ b/src/Api/Test/DestinationApplicationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test @@ -21,7 +22,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class MonaiApplicationEntityTest { [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToBeUsed() + public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToBeUsed() { var entity = new MonaiApplicationEntity { @@ -41,7 +42,7 @@ public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValue } [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotOverwrite() + public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotOverwrite() { var entity = new MonaiApplicationEntity { diff --git a/src/Api/Test/HL7DestinationEntityTest.cs b/src/Api/Test/HL7DestinationEntityTest.cs new file mode 100644 index 000000000..181f1fd9e --- /dev/null +++ b/src/Api/Test/HL7DestinationEntityTest.cs @@ -0,0 +1,54 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Models; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Api.Test +{ + public class HL7DestinationEntityTest + { + [Fact] + public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToBeUsed() + { + var entity = new HL7DestinationEntity + { + AeTitle = "AET", + }; + + entity.SetDefaultValues(); + + Assert.Equal(entity.AeTitle, entity.Name); + } + + [Fact] + public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotOverwrite() + { + var entity = new HL7DestinationEntity + { + AeTitle = "AET", + HostIp = "IP", + Name = "Name" + }; + + entity.SetDefaultValues(); + + Assert.Equal("AET", entity.AeTitle); + Assert.Equal("IP", entity.HostIp); + Assert.Equal("Name", entity.Name); + } + } +} diff --git a/src/Api/Test/Hl7ApplicationConfigEntityTest.cs b/src/Api/Test/Hl7ApplicationConfigEntityTest.cs new file mode 100644 index 000000000..ae1a1bc2c --- /dev/null +++ b/src/Api/Test/Hl7ApplicationConfigEntityTest.cs @@ -0,0 +1,190 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Api.Test +{ + public class Hl7ApplicationConfigEntityTest + { + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenSendingIdKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair(string.Empty, "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.SendingId.Key)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenSendingIdValueIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", string.Empty), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.SendingId.Value)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataLinkKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair(string.Empty, DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataLink.Key)} is missing.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary()) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} is missing values.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingKeyIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { string.Empty, "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} is missing a name at index 0.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsNotSet_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", string.Empty } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} (DataMappingKey) @ index 0 is not a valid DICOM Tag.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsNotAValidDicomTag_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "DataMappingValue" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains("DataMapping.Value is not a valid DICOM Tag. Error parsing DICOM tag ['DataMappingValue']", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsAValidDicomTag_ExpectValidateToReturnNoErrors() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "0020,000D" } }) + }; + + var errors = entity.Validate(); + + Assert.Empty(errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenDataMappingValueIsEmpty_ExpectValidateToReturnError() + { + var entity = new Hl7ApplicationConfigEntity + { + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "" } }) + }; + + var errors = entity.Validate(); + + Assert.NotEmpty(errors); + Assert.Contains($"{nameof(entity.DataMapping)} (DataMappingKey) @ index 0 is not a valid DICOM Tag.", errors); + } + + [Fact] + public void GivenAHl7ApplicationConfigEntity_WhenToStringIsCalled_ExpectToStringToReturnExpectedValue() + { + var guid = Guid.NewGuid(); + var dt = DateTime.UtcNow; + var entity = new Hl7ApplicationConfigEntity + { + Id = guid, + DateTimeCreated = dt, + SendingId = new KeyValuePair("SendingIdKey", "SendingIdValue"), + DataLink = new KeyValuePair("DataLinkKey", DataLinkType.PatientId), + DataMapping = StringKeyValuePair.FromDictionary(new Dictionary { { "DataMappingKey", "0020,000D" } }) + }; + + var result = entity.ToString(); + + var expected = JsonConvert.SerializeObject(entity); + Assert.Equal(expected, result); + } + } +} diff --git a/src/Api/Test/MonaiApplicationEntityTest.cs b/src/Api/Test/MonaiApplicationEntityTest.cs old mode 100644 new mode 100755 index d91dd1166..1712d2690 --- a/src/Api/Test/MonaiApplicationEntityTest.cs +++ b/src/Api/Test/MonaiApplicationEntityTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test @@ -21,7 +22,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test public class DestinationApplicationEntityTest { [Fact] - public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToSetName() + public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { var entity = new DestinationApplicationEntity { @@ -36,7 +37,7 @@ public void GivenADestinationApplicationEntity_WhenNameIsNotSet_ExepectSetDefaul } [Fact] - public void GivenADestinationApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotSetName() + public void GivenADestinationApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { var entity = new DestinationApplicationEntity { diff --git a/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs b/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs old mode 100644 new mode 100755 index 3753ddb59..836fd75c0 --- a/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs +++ b/src/Api/Test/Storage/DicomFileStorageMetadataTest.cs @@ -89,5 +89,40 @@ public void GivenDicomFileStorageMetadata_WhenGetPayloadPathIsCalled_APayyloadPa Assert.Equal($"{payloadId}/{metadata.File.UploadPath}", metadata.File.GetPayloadPath(payloadId)); Assert.Equal($"{payloadId}/{metadata.JsonFile.UploadPath}", metadata.JsonFile.GetPayloadPath(payloadId)); } + + + [Fact] + public void StudyInstanceUid_Set_ValidValue() + { + // Arrange + var metadata = new DicomFileStorageMetadata(); + + // Act + metadata.StudyInstanceUid = "12345"; + + // Assert + Assert.Equal("12345", metadata.StudyInstanceUid); + } + + [Fact] + public void SeriesInstanceUid_Set_ValidValue() + { + // Arrange + var metadata = new DicomFileStorageMetadata { SeriesInstanceUid = "67890" }; + + // Assert + Assert.Equal("67890", metadata.SeriesInstanceUid); + } + + [Fact] + public void SopInstanceUid_Set_ValidValue() + { + // Arrange + var metadata = new DicomFileStorageMetadata { SopInstanceUid = "ABCDE" }; + + // Assert + Assert.Equal("ABCDE", metadata.SopInstanceUid); + } + } -} \ No newline at end of file +} diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index edc489b7e..903cc6b49 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -94,6 +94,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -116,8 +121,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -249,8 +254,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -260,10 +265,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1277,11 +1282,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Api/VirtualApplicationEntity.cs b/src/Api/VirtualApplicationEntity.cs old mode 100644 new mode 100755 index 9a6545999..4fd33ffd1 --- a/src/Api/VirtualApplicationEntity.cs +++ b/src/Api/VirtualApplicationEntity.cs @@ -20,6 +20,7 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Security.Claims; using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; namespace Monai.Deploy.InformaticsGateway.Api { diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 898a7a74c..1a4adf62a 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -21,6 +21,12 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Direct", + "requested": "[2.36.0, )", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Direct", "requested": "[3.0.0, )", @@ -29,15 +35,15 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.4, )", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -47,11 +53,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.4, )", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } diff --git a/src/CLI/Commands/AetCommand.cs b/src/CLI/Commands/AetCommand.cs old mode 100644 new mode 100755 index 3c2f27c04..d47094b7c --- a/src/CLI/Commands/AetCommand.cs +++ b/src/CLI/Commands/AetCommand.cs @@ -26,7 +26,7 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/CLI/Commands/DestinationCommand.cs b/src/CLI/Commands/DestinationCommand.cs old mode 100644 new mode 100755 index 0205153f8..819cd18cf --- a/src/CLI/Commands/DestinationCommand.cs +++ b/src/CLI/Commands/DestinationCommand.cs @@ -26,7 +26,7 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/CLI/Services/ConfigurationOptionAccessor.cs b/src/CLI/Services/ConfigurationOptionAccessor.cs old mode 100644 new mode 100755 index c61ae761c..a086c6ece --- a/src/CLI/Services/ConfigurationOptionAccessor.cs +++ b/src/CLI/Services/ConfigurationOptionAccessor.cs @@ -30,6 +30,11 @@ public interface IConfigurationOptionAccessor /// int DicomListeningPort { get; set; } + /// + /// Gets or sets the ExternalApp DICOM SCP listening port from appsettings.json. + /// + int ExternalAppDicomListeningPort { get; set; } + /// /// Gets or sets the HL7 listening port from appsettings.json. /// @@ -112,6 +117,21 @@ public int DicomListeningPort } } + public int ExternalAppDicomListeningPort + { + get + { + return GetValueFromJsonPath("InformaticsGateway.dicom.scp.externalAppPort"); + } + set + { + Guard.Against.OutOfRangePort(value, nameof(ExternalAppDicomListeningPort)); + var jObject = ReadConfigurationFile(); + jObject["InformaticsGateway"]["dicom"]["scp"]["externalAppPort"] = value; + SaveConfigurationFile(jObject); + } + } + public int Hl7ListeningPort { get diff --git a/src/CLI/Test/AetCommandTest.cs b/src/CLI/Test/AetCommandTest.cs old mode 100644 new mode 100755 index 473f02426..9852ccf0a --- a/src/CLI/Test/AetCommandTest.cs +++ b/src/CLI/Test/AetCommandTest.cs @@ -28,7 +28,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.SharedTest; diff --git a/src/CLI/Test/DestinationCommandTest.cs b/src/CLI/Test/DestinationCommandTest.cs old mode 100644 new mode 100755 index 4212a7e0d..0d9dd4cd0 --- a/src/CLI/Test/DestinationCommandTest.cs +++ b/src/CLI/Test/DestinationCommandTest.cs @@ -29,7 +29,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.CLI.Services; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.SharedTest; diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 15a8c0324..dbdd6f20e 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -137,6 +137,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -164,8 +169,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", @@ -497,8 +502,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -508,10 +513,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1560,11 +1565,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index f45d6d7b6..22c1f3e80 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -93,6 +93,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -115,8 +120,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", @@ -399,8 +404,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -410,10 +415,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -541,11 +546,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Client/IInformaticsGatewayClient.cs b/src/Client/IInformaticsGatewayClient.cs old mode 100644 new mode 100755 index cf9e8ef7d..3db89516e --- a/src/Client/IInformaticsGatewayClient.cs +++ b/src/Client/IInformaticsGatewayClient.cs @@ -17,6 +17,7 @@ using System; using System.Net.Http.Headers; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client.Services; namespace Monai.Deploy.InformaticsGateway.Client @@ -53,6 +54,11 @@ public interface IInformaticsGatewayClient /// IAeTitleService VirtualAeTitle { get; } + /// + /// Provides APIs to list, create, delete Virtual AE Titles. + /// + IAeTitleService HL7Destinations { get; } + /// /// Configures the service URI of the DICOMweb service. /// diff --git a/src/Client/InformaticsGatewayClient.cs b/src/Client/InformaticsGatewayClient.cs old mode 100644 new mode 100755 index 9f48dac6c..fe9a81145 --- a/src/Client/InformaticsGatewayClient.cs +++ b/src/Client/InformaticsGatewayClient.cs @@ -20,6 +20,7 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Client.Services; @@ -48,6 +49,9 @@ public class InformaticsGatewayClient : IInformaticsGatewayClient /// public IAeTitleService VirtualAeTitle { get; } + /// + public IAeTitleService HL7Destinations { get; } + /// /// Initializes a new instance of the InformaticsGatewayClient class that connects to the specified URI using the credentials provided. /// @@ -66,6 +70,7 @@ public InformaticsGatewayClient(HttpClient httpClient, ILogger("config/source", _httpClient, _logger); DicomDestinations = new AeTitleService("config/destination", _httpClient, _logger); VirtualAeTitle = new AeTitleService("config/vae", _httpClient, _logger); + HL7Destinations = new AeTitleService("config/hl7-destination", _httpClient, _logger); } /// diff --git a/src/Client/Services/AeTitle{T}Service.cs b/src/Client/Services/AeTitle{T}Service.cs old mode 100644 new mode 100755 index 43a2e7f3d..e9df749ec --- a/src/Client/Services/AeTitle{T}Service.cs +++ b/src/Client/Services/AeTitle{T}Service.cs @@ -23,7 +23,7 @@ using System.Threading.Tasks; using Ardalis.GuardClauses; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Client.Services { diff --git a/src/Client/Test/AeTitleServiceTest.cs b/src/Client/Test/AeTitleServiceTest.cs old mode 100644 new mode 100755 index 646f03a44..df852a205 --- a/src/Client/Test/AeTitleServiceTest.cs +++ b/src/Client/Test/AeTitleServiceTest.cs @@ -24,6 +24,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Client.Services; using Moq; diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 36843f9e7..2bbd6ee7a 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -176,19 +176,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -198,39 +198,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -336,10 +336,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -347,17 +347,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -559,8 +559,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -570,10 +570,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1816,7 +1816,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1826,11 +1826,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1866,7 +1867,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1886,8 +1887,8 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -1916,9 +1917,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index 8ecf03f09..2a3e704e0 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -43,6 +43,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -60,8 +65,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -155,8 +160,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -166,10 +171,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -274,11 +279,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/MessageBrokerConfigurationKeys.cs b/src/Configuration/MessageBrokerConfigurationKeys.cs index 846a24c5f..54c4da5a3 100755 --- a/src/Configuration/MessageBrokerConfigurationKeys.cs +++ b/src/Configuration/MessageBrokerConfigurationKeys.cs @@ -47,5 +47,27 @@ public class MessageBrokerConfigurationKeys /// [ConfigurationKeyName("artifactrecieved")] public string ArtifactRecieved { get; set; } = "md.workflow.artifactrecieved"; + + + /// + /// Gets or sets the topic for publishing export requests. + /// Defaults to `md_export_request`. + /// + [ConfigurationKeyName("externalAppRequest")] + public string ExternalAppRequest { get; set; } = "md.externalapp.request"; + + /// + /// Gets or sets the topic for publishing workflow requests. + /// Defaults to `md.export.request`. + /// + [ConfigurationKeyName("exportHl7")] + public string ExportHL7 { get; set; } = "md.export.hl7"; + + /// + /// Gets or sets the topic for publishing export complete requests. + /// Defaults to `md_export_complete`. + /// + [ConfigurationKeyName("exportHl7Complete")] + public string ExportHl7Complete { get; set; } = "md.export.hl7complete"; } } diff --git a/src/Configuration/ScpConfiguration.cs b/src/Configuration/ScpConfiguration.cs old mode 100644 new mode 100755 index 6b66626ee..bac9a2952 --- a/src/Configuration/ScpConfiguration.cs +++ b/src/Configuration/ScpConfiguration.cs @@ -34,6 +34,12 @@ public class ScpConfiguration [ConfigurationKeyName("port")] public int Port { get; set; } = 104; + /// + /// Gets or sets Port number to be used for SCP service. + /// + [ConfigurationKeyName("externalAppPort")] + public int ExternalAppPort { get; set; } = 105; + /// /// Gets or sets maximum number of simultaneous DICOM associations for the SCP service. /// diff --git a/src/Configuration/Test/ValidationExtensionsTest.cs b/src/Configuration/Test/ValidationExtensionsTest.cs old mode 100644 new mode 100755 index 986922e4a..9e00e5dbb --- a/src/Configuration/Test/ValidationExtensionsTest.cs +++ b/src/Configuration/Test/ValidationExtensionsTest.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using FellowOakDicom; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Configuration.Test diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index d87a39e6c..02e67b1eb 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -102,6 +102,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -124,8 +129,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -257,8 +262,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -268,10 +273,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1290,11 +1295,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Configuration/ValidationExtensions.cs b/src/Configuration/ValidationExtensions.cs index da29ce249..09e7bc932 100755 --- a/src/Configuration/ValidationExtensions.cs +++ b/src/Configuration/ValidationExtensions.cs @@ -22,6 +22,7 @@ using Ardalis.GuardClauses; using FellowOakDicom; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Configuration { @@ -57,6 +58,21 @@ public static bool IsValid(this DestinationApplicationEntity destinationApplicat return valid; } + public static bool IsValid(this HL7DestinationEntity hl7destinationEntity, out IList validationErrors) + { + Guard.Against.Null(hl7destinationEntity, nameof(hl7destinationEntity)); + + validationErrors = new List(); + + var valid = true; + valid &= !string.IsNullOrWhiteSpace(hl7destinationEntity.Name); + valid &= IsAeTitleValid(hl7destinationEntity.GetType().Name, hl7destinationEntity.AeTitle, validationErrors); + valid &= IsValidHostNameIp(hl7destinationEntity.AeTitle, hl7destinationEntity.HostIp, validationErrors); + valid &= IsPortValid(hl7destinationEntity.GetType().Name, hl7destinationEntity.Port, validationErrors); + + return valid; + } + public static bool IsValid(this SourceApplicationEntity sourceApplicationEntity, out IList validationErrors) { Guard.Against.Null(sourceApplicationEntity, nameof(sourceApplicationEntity)); diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index a05767d6a..2b5691080 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -43,6 +43,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -60,8 +65,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -155,8 +160,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -166,10 +171,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -274,11 +279,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs b/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs old mode 100644 new mode 100755 index ffc58fa17..dd84793fa --- a/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs +++ b/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs @@ -15,7 +15,7 @@ */ using System.Linq.Expressions; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs old mode 100644 new mode 100755 index 2457dcb7e..796ff43bc --- a/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs +++ b/src/Database/Api/Repositories/IDicomAssociationInfoRepository.cs @@ -14,7 +14,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs b/src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs new file mode 100755 index 000000000..51668aefd --- /dev/null +++ b/src/Database/Api/Repositories/IExternalAppDeatilsRepository.cs @@ -0,0 +1,31 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Models; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IExternalAppDetailsRepository + { + Task AddAsync(ExternalAppDetails details, CancellationToken cancellationToken); + + Task> GetAsync(string studyInstanceId, CancellationToken cancellationToken); + + Task GetByPatientIdOutboundAsync(string patientId, CancellationToken cancellationToken); + + Task GetByStudyIdOutboundAsync(string studyInstanceId, CancellationToken cancellationToken); + } +} diff --git a/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs b/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs new file mode 100644 index 000000000..c46dc3503 --- /dev/null +++ b/src/Database/Api/Repositories/IHL7DestinationEntityRepository.cs @@ -0,0 +1,36 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Monai.Deploy.InformaticsGateway.Api.Models; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IHL7DestinationEntityRepository + { + Task> ToListAsync(CancellationToken cancellationToken = default); + + Task FindByNameAsync(string name, CancellationToken cancellationToken = default); + + Task AddAsync(HL7DestinationEntity item, CancellationToken cancellationToken = default); + + Task UpdateAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default); + + Task RemoveAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default); + + Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs b/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs new file mode 100644 index 000000000..b381d4da6 --- /dev/null +++ b/src/Database/Api/Repositories/IHl7ApplicationConfigRepository.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IHl7ApplicationConfigRepository + { + Task> GetAllAsync(CancellationToken cancellationToken = default); + + Task GetByIdAsync(string id); + + Task DeleteAsync(string id, CancellationToken cancellationToken = default); + + Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default); + + Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs b/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs old mode 100644 new mode 100755 index 1b803385e..ccfbd6567 --- a/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs +++ b/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs @@ -15,7 +15,7 @@ */ using System.Linq.Expressions; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { diff --git a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs index 157f703b8..8775eb688 100755 --- a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs +++ b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs @@ -17,7 +17,6 @@ using Ardalis.GuardClauses; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; @@ -63,7 +62,7 @@ public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceReques { Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + using var loggerScope = _logger.BeginScope(new InformaticsGateway.Api.LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); if (status == InferenceRequestStatus.Success) { diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs index 326cce2cf..dac5fb729 100755 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -17,7 +17,6 @@ using System.Text.Json; using System.Text.Json.Serialization; using Ardalis.GuardClauses; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; namespace Monai.Deploy.InformaticsGateway.Database.Api diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index dd4d34036..65aff269f 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -76,6 +76,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -98,8 +103,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -231,8 +236,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -242,10 +247,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1264,11 +1269,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index 9e1f1f4de..53e07aa40 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -49,6 +49,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -66,8 +71,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -161,8 +166,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -172,10 +177,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -280,11 +285,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index 2efe60d8d..cb40c9a0d 100755 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -84,6 +84,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi ServiceLifetime.Transient); services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(EntityFramework.Repositories.DestinationApplicationEntityRepository)); + services.AddScoped(typeof(IHL7DestinationEntityRepository), typeof(EntityFramework.Repositories.HL7DestinationEntityRepository)); services.AddScoped(typeof(IInferenceRequestRepository), typeof(EntityFramework.Repositories.InferenceRequestRepository)); services.AddScoped(typeof(IMonaiApplicationEntityRepository), typeof(EntityFramework.Repositories.MonaiApplicationEntityRepository)); services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(EntityFramework.Repositories.SourceApplicationEntityRepository)); @@ -91,6 +92,8 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IPayloadRepository), typeof(EntityFramework.Repositories.PayloadRepository)); services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(EntityFramework.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(EntityFramework.Repositories.VirtualApplicationEntityRepository)); + services.AddScoped(typeof(IHl7ApplicationConfigRepository), typeof(EntityFramework.Repositories.Hl7ApplicationConfigRepository)); + services.AddSingleton(typeof(IExternalAppDetailsRepository), typeof(EntityFramework.Repositories.ExternalAppDetailsRepository)); services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); return services; @@ -99,6 +102,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddSingleton(s => new MongoClient(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey])); services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(MongoDB.Repositories.DestinationApplicationEntityRepository)); + services.AddScoped(typeof(IHL7DestinationEntityRepository), typeof(MongoDB.Repositories.HL7DestinationEntityRepository)); services.AddScoped(typeof(IInferenceRequestRepository), typeof(MongoDB.Repositories.InferenceRequestRepository)); services.AddScoped(typeof(IMonaiApplicationEntityRepository), typeof(MongoDB.Repositories.MonaiApplicationEntityRepository)); services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(MongoDB.Repositories.SourceApplicationEntityRepository)); @@ -106,6 +110,8 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(IPayloadRepository), typeof(MongoDB.Repositories.PayloadRepository)); services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(MongoDB.Repositories.DicomAssociationInfoRepository)); services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(MongoDB.Repositories.VirtualApplicationEntityRepository)); + services.AddScoped(typeof(IHl7ApplicationConfigRepository), typeof(MongoDB.Repositories.Hl7ApplicationConfigRepository)); + services.AddSingleton(typeof(IExternalAppDetailsRepository), typeof(MongoDB.Repositories.ExternalAppDetailsRepository)); services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory); diff --git a/src/Database/DatabaseMigrationManager.cs b/src/Database/DatabaseMigrationManager.cs old mode 100644 new mode 100755 index da35c17a4..72acb2cd8 --- a/src/Database/DatabaseMigrationManager.cs +++ b/src/Database/DatabaseMigrationManager.cs @@ -61,7 +61,7 @@ private static Type[] FindMatchingTypesFromAssemblies(Assembly[] assemblies) var matchingTypes = new List(); foreach (var assembly in assemblies) { - var types = assembly.ExportedTypes.Where(p => p.IsAssignableFrom(typeof(IDatabaseMigrationManager))); + var types = assembly.ExportedTypes.Where(p => p.IsAssignableFrom(typeof(IDatabaseMigrationManager)) && p.Name != nameof(IDatabaseMigrationManager)); if (types.Any()) { matchingTypes.AddRange(types); diff --git a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index ad0688719..33d7ff2f5 --- a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs @@ -17,7 +17,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs b/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs index 67bda9b8d..d8b2c45f5 100755 --- a/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs @@ -20,7 +20,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs b/src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs new file mode 100755 index 000000000..cfdcf8d9d --- /dev/null +++ b/src/Database/EntityFramework/Configuration/ExternalAppDetailsConfiguration.cs @@ -0,0 +1,44 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System.Text.Json.Serialization; +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api.Models; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class ExternalAppDetailsConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + var jsonSerializerSettings = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + builder.HasKey(j => j.Id); + + builder.Property(j => j.StudyInstanceUid).IsRequired(); + builder.Property(j => j.WorkflowInstanceId).IsRequired(); + builder.Property(j => j.DateTimeCreated).IsRequired(); + builder.Property(j => j.CorrelationId).IsRequired(); + builder.Property(j => j.ExportTaskID).IsRequired(); + } + } +} diff --git a/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs new file mode 100644 index 000000000..703dad6f3 --- /dev/null +++ b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs @@ -0,0 +1,43 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api.Models; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class HL7DestinationEntityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(j => j.Name); + builder.Property(j => j.AeTitle).IsRequired(); + builder.Property(j => j.Port).IsRequired(); + builder.Property(j => j.HostIp).IsRequired(); + builder.Property(j => j.CreatedBy).IsRequired(false); + builder.Property(j => j.UpdatedBy).IsRequired(false); + builder.Property(j => j.DateTimeCreated).IsRequired(); + builder.Property(j => j.DateTimeUpdated).IsRequired(false); + + builder.HasIndex(p => p.Name, "idx_destination_name").IsUnique(); + builder.HasIndex(p => new { p.Name, p.AeTitle, p.HostIp, p.Port }, "idx_source_all").IsUnique(); + + builder.Ignore(p => p.Id); + } + } +} diff --git a/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs new file mode 100755 index 000000000..cfd9a186b --- /dev/null +++ b/src/Database/EntityFramework/Configuration/Hl7ApplicationConfigConfiguration.cs @@ -0,0 +1,86 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Text.Json.Serialization; +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration +{ + internal class Hl7ApplicationConfigConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + var valueComparer = new ValueComparer>( + (c1, c2) => c1!.SequenceEqual(c2!), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => c.ToList()); + + var jsonSerializerSettings = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + builder.HasKey(j => j.Name); + builder.Property(j => j.SendingId).HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize(v, jsonSerializerSettings)!) + .IsRequired() + .Metadata + .SetValueComparer( + new ValueComparer( + (c1, c2) => c1 == c2, + c => c.GetHashCode(), + c => c)); + + builder.Property(j => j.DataLink).HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize(v, jsonSerializerSettings)!) + .IsRequired() + .Metadata + .SetValueComparer( + new ValueComparer( + (c1, c2) => c1 == c2, + c => c.GetHashCode(), + c => c)); + + builder.Property(j => j.DateTimeCreated).IsRequired(); + builder.Property(j => j.PlugInAssemblies) + .HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize>(v, jsonSerializerSettings)!) + .Metadata.SetValueComparer(valueComparer); + + builder.Property(j => j.DataMapping) + .HasConversion( + v => JsonSerializer.Serialize(v, jsonSerializerSettings), + v => JsonSerializer.Deserialize>(v, jsonSerializerSettings)!) + .Metadata + .SetValueComparer( + new ValueComparer>( + (c1, c2) => c1!.SequenceEqual(c2!), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => c.ToList())); + + builder.HasIndex(p => p.Name, "idx_hl7_name").IsUnique(); + + builder.Ignore(p => p.Id); + } + } +} diff --git a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index 3e78d3ad9..fc9f1666c --- a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs @@ -20,7 +20,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index 52b410c39..40af12bde 100755 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -18,6 +18,7 @@ using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api; @@ -36,11 +37,15 @@ public InformaticsGatewayContext(DbContextOptions opt public virtual DbSet MonaiApplicationEntities { get; set; } public virtual DbSet SourceApplicationEntities { get; set; } public virtual DbSet DestinationApplicationEntities { get; set; } + public virtual DbSet HL7DestinationEntities { get; set; } public virtual DbSet InferenceRequests { get; set; } public virtual DbSet Payloads { get; set; } public virtual DbSet StorageMetadataWrapperEntities { get; set; } public virtual DbSet DicomAssociationHistories { get; set; } public virtual DbSet VirtualApplicationEntities { get; set; } + public virtual DbSet ExternalAppDetails { get; set; } + + public virtual DbSet Hl7ApplicationConfig { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -49,11 +54,13 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.ApplyConfiguration(new MonaiApplicationEntityConfiguration()); modelBuilder.ApplyConfiguration(new SourceApplicationEntityConfiguration()); modelBuilder.ApplyConfiguration(new DestinationApplicationEntityConfiguration()); + modelBuilder.ApplyConfiguration(new HL7DestinationEntityConfiguration()); modelBuilder.ApplyConfiguration(new InferenceRequestConfiguration()); modelBuilder.ApplyConfiguration(new PayloadConfiguration()); modelBuilder.ApplyConfiguration(new StorageMetadataWrapperEntityConfiguration()); modelBuilder.ApplyConfiguration(new DicomAssociationInfoConfiguration()); modelBuilder.ApplyConfiguration(new VirtualApplicationEntityConfiguration()); + modelBuilder.ApplyConfiguration(new Hl7ApplicationConfigConfiguration()); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) diff --git a/src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs new file mode 100755 index 000000000..cecea913d --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.Designer.cs @@ -0,0 +1,431 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231120161347_202311201611")] + partial class _202311201611 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.22"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs new file mode 100755 index 000000000..182e05f68 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class _202311201611 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DestinationFolder", + table: "Payloads", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.CreateTable( + name: "ExternalAppDetails", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + StudyInstanceUid = table.Column(type: "TEXT", nullable: false), + StudyInstanceUidOutBound = table.Column(type: "TEXT", nullable: false), + WorkflowInstanceId = table.Column(type: "TEXT", nullable: false), + ExportTaskID = table.Column(type: "TEXT", nullable: false), + CorrelationId = table.Column(type: "TEXT", nullable: false), + DestinationFolder = table.Column(type: "TEXT", nullable: true), + PatientId = table.Column(type: "TEXT", nullable: false), + PatientIdOutBound = table.Column(type: "TEXT", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ExternalAppDetails", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ExternalAppDetails"); + + migrationBuilder.DropColumn( + name: "DestinationFolder", + table: "Payloads"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs new file mode 100755 index 000000000..742aec068 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.Designer.cs @@ -0,0 +1,505 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231204113501_Hl7DEstinationAndConfig")] + partial class Hl7DEstinationAndConfig + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataMapping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all2"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs new file mode 100755 index 000000000..d23d89c28 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs @@ -0,0 +1,78 @@ + +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class Hl7DEstinationAndConfig : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Hl7ApplicationConfig", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + SendingId = table.Column(type: "TEXT", nullable: false), + DataLink = table.Column(type: "TEXT", nullable: false), + DataMapping = table.Column(type: "TEXT", nullable: false), + PlugInAssemblies = table.Column(type: "TEXT", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Hl7ApplicationConfig", x => x.Name); + }); + + migrationBuilder.CreateTable( + name: "HL7DestinationEntities", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + Port = table.Column(type: "INTEGER", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false), + AeTitle = table.Column(type: "TEXT", nullable: false), + HostIp = table.Column(type: "TEXT", nullable: false), + CreatedBy = table.Column(type: "TEXT", nullable: true), + UpdatedBy = table.Column(type: "TEXT", nullable: true), + DateTimeUpdated = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_HL7DestinationEntities", x => x.Name); + }); + + migrationBuilder.CreateIndex( + name: "idx_hl7_name", + table: "Hl7ApplicationConfig", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "idx_destination_name1", + table: "HL7DestinationEntities", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities", + columns: new[] { "Name", "AeTitle", "HostIp", "Port" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Hl7ApplicationConfig"); + + migrationBuilder.DropTable( + name: "HL7DestinationEntities"); + + migrationBuilder.DropIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs new file mode 100755 index 000000000..256eb5527 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231207154732_Hl7Plugins")] + partial class Hl7Plugins + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataMapping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all2"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs new file mode 100755 index 000000000..c86631267 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs @@ -0,0 +1,27 @@ + +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class Hl7Plugins : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "LastModified", + table: "Hl7ApplicationConfig", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "LastModified", + table: "Hl7ApplicationConfig"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs old mode 100644 new mode 100755 index f85fc6347..8eb10b0df --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -15,9 +15,45 @@ partial class InformaticsGatewayContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.21"); + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DestinationApplicationEntity", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataMapping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => { b.Property("Name") .HasColumnType("TEXT"); @@ -56,7 +92,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("DestinationApplicationEntities"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DicomAssociationInfo", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -106,7 +142,93 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("DicomAssociationHistories"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.MonaiApplicationEntity", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => { b.Property("Name") .HasColumnType("TEXT") @@ -239,7 +361,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") .IsUnique() - .HasDatabaseName("idx_source_all1"); + .HasDatabaseName("idx_source_all2"); b.HasIndex(new[] { "Name" }, "idx_source_name") .IsUnique(); @@ -268,6 +390,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("DateTimeCreated") .HasColumnType("TEXT"); + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + b.Property("Files") .IsRequired() .HasColumnType("TEXT"); diff --git a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj old mode 100644 new mode 100755 index b99824dd2..d9ad95499 --- a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj +++ b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj @@ -42,12 +42,12 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs index 459631ac3..4a3f1cdc2 100755 --- a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs index b144ac2c5..2e000e947 100755 --- a/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs b/src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs new file mode 100755 index 000000000..52fce4a50 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/ExternalAppDetailsRepository.cs @@ -0,0 +1,110 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Polly.Retry; +using Microsoft.Extensions.Logging; +using Polly; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class ExternalAppDetailsRepository : IExternalAppDetailsRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public ExternalAppDetailsRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(ExternalAppDetails details, CancellationToken cancellationToken = default) + { + Guard.Against.Null(details, nameof(details)); + + await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(details, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task> GetAsync(string studyInstanceId, CancellationToken cancellationToken = default) + { + return await _dataset + .Where(t => t.StudyInstanceUid == studyInstanceId).ToListAsync(cancellationToken) + .ConfigureAwait(false); + } + + public async Task GetByPatientIdOutboundAsync(string patientId, CancellationToken cancellationToken) + { + return await _dataset + .FirstOrDefaultAsync(t => t.PatientIdOutBound == patientId, cancellationToken) + .ConfigureAwait(false); + } + + public async Task GetByStudyIdOutboundAsync(string studyInstanceId, CancellationToken cancellationToken) + { + return await _dataset + .FirstOrDefaultAsync(t => t.StudyInstanceUidOutBound == studyInstanceId, cancellationToken) + .ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs b/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs new file mode 100644 index 000000000..2c0ab03ae --- /dev/null +++ b/src/Database/EntityFramework/Repositories/HL7DestinationEntityRepository.cs @@ -0,0 +1,143 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class HL7DestinationEntityRepository : IHL7DestinationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public HL7DestinationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(HL7DestinationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item, nameof(item)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var func = predicate.Compile(); + return await Task.FromResult(_dataset.Any(func)).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name, nameof(name)); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs new file mode 100755 index 000000000..898181503 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs @@ -0,0 +1,95 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class Hl7ApplicationConfigRepository : IHl7ApplicationConfigRepository + { + private readonly ILogger _logger; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + + public Hl7ApplicationConfigRepository(ILogger logger, + IOptions options, IServiceScopeFactory serviceScopeFactory) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + var scope = serviceScopeFactory.CreateScope(); + + _informaticsGatewayContext = scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public Task> GetAllAsync(CancellationToken cancellationToken = default) => + _retryPolicy.ExecuteAsync(() => _dataset.ToListAsync(cancellationToken)); + + public Task GetByIdAsync(string id) => + _retryPolicy.ExecuteAsync(() => _dataset.FirstOrDefaultAsync(x => x.Id.Equals(id))); + + public Task DeleteAsync(string id, CancellationToken cancellationToken) + { + return _retryPolicy.ExecuteAsync(async () => + { + var entity = await GetByIdAsync(id).ConfigureAwait(false) ?? throw new DatabaseException("Failed to delete entity."); + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }); + } + + public Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(configEntity, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }); + } + + public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(configEntity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + })!; + } + } +} diff --git a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs index f97696edf..e8001a728 100755 --- a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs index 60170d4a2..0d5d923d6 100755 --- a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -19,9 +19,9 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { diff --git a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs index 8a3d6eb7d..d0acc3330 100755 --- a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs b/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs new file mode 100755 index 000000000..77d991e3c --- /dev/null +++ b/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs @@ -0,0 +1,116 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class ExternalAppDetailsRepositoryTest + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public ExternalAppDetailsRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithExternalAppDetailsEntries(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new DatabaseOptions()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + [Fact] + public async Task GivenDestinationExternalAppInTheDatabase_WhenGetAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + + var expected = _databaseFixture.DatabaseContext.Set() + .Where(t => t.StudyInstanceUid == "1"); + var actual = await store.GetAsync("1").ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenDestinationExternalAppInTheDatabase_WhenGetAsyncCalled_ExpectEntitieToBeReturned2() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + var startTime = DateTime.Now; + var endTime = DateTime.MinValue; + + var expected = _databaseFixture.DatabaseContext.Set() + .Where(t => t.PatientIdOutBound == "2") + .Take(1).First(); + var actual = await store.GetByPatientIdOutboundAsync("2", new CancellationToken()).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenDestinationExternalAppInTheDatabase_WhenAddingToDatabase_ExpectItToBeSaved() + { + var association = new ExternalAppDetails + { + StudyInstanceUid = "3", + WorkflowInstanceId = "calling", + CorrelationId = Guid.NewGuid().ToString(), + DateTimeCreated = DateTime.UtcNow, + ExportTaskID = "host" + }; + + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(association).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.StudyInstanceUid.Equals(association.StudyInstanceUid)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(association.DateTimeCreated, actual!.DateTimeCreated); + Assert.Equal(association.WorkflowInstanceId, actual!.WorkflowInstanceId); + Assert.Equal(association.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(association.CorrelationId, actual!.CorrelationId); + } + } +} diff --git a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs new file mode 100644 index 000000000..1f24a40f8 --- /dev/null +++ b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs @@ -0,0 +1,159 @@ +/* + * Copyright 2022-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class HL7DestinationEntityRepositoryTest + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public HL7DestinationEntityRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithHL7DestinationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new DatabaseOptions()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(aet).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.HostIp, actual!.HostIp); + Assert.Equal(aet.Port, actual!.Port); + Assert.Equal(aet.Name, actual!.Name); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("1.2.3.4", actual!.HostIp); + Assert.Equal(114, actual!.Port); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenHL7DestinationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + expected!.Port = 1000; + expected!.HostIp = "loalhost"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + Assert.Equal(expected.HostIp, dbResult!.HostIp); + Assert.Equal(expected.Port, dbResult!.Port); + } + } +} diff --git a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs old mode 100644 new mode 100755 index 2aea0684a..01f8d8457 --- a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs @@ -16,6 +16,7 @@ using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { diff --git a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj old mode 100644 new mode 100755 index c9ad64d69..abff60683 --- a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj +++ b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs index 609cfecdf..2c6a7558a 100755 --- a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; diff --git a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs old mode 100644 new mode 100755 index 7dd549b73..19219a3a3 --- a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs @@ -16,6 +16,7 @@ using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { @@ -59,6 +60,25 @@ public void InitDatabaseWithDestinationApplicationEntities() DatabaseContext.SaveChanges(); } + public void InitDatabaseWithHL7DestinationEntities() + { + var aet1 = new HL7DestinationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1" }; + var aet2 = new HL7DestinationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2" }; + var aet3 = new HL7DestinationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3" }; + var aet4 = new HL7DestinationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4" }; + var aet5 = new HL7DestinationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + public void InitDatabaseWithMonaiApplicationEntities() { var aet1 = new MonaiApplicationEntity { AeTitle = "AET1", Name = "AET1" }; @@ -134,6 +154,17 @@ internal void InitDatabaseWithDicomAssociationInfoEntries() DatabaseContext.SaveChanges(); } + internal void InitDatabaseWithExternalAppDetailsEntries() + { + var ea1 = new ExternalAppDetails { StudyInstanceUid = "1", PatientId = "11", PatientIdOutBound = "1" }; + var ea2 = new ExternalAppDetails { StudyInstanceUid = "2", PatientId = "22", PatientIdOutBound = "2" }; + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(ea1); + set.Add(ea2); + + DatabaseContext.SaveChanges(); + } public void Clear() where T : class { diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index e5a296772..95ac88e42 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -10,11 +10,11 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22" + "Microsoft.EntityFrameworkCore": "6.0.25" } }, "Microsoft.NET.Test.Sdk": { @@ -102,6 +102,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -124,19 +129,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -146,39 +151,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -392,8 +397,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -403,10 +408,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1468,11 +1473,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1502,8 +1508,8 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 0d9e1c3e1..91f7b6eac 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -4,12 +4,12 @@ "net6.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -19,21 +19,21 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "es9TKd0cpM263Ou0QMEETN7MDzD7kXDkThiiXl1+c/69v97AZlzeLoM5tDdC0RC4L74ZWyk3+WMnoDPL93DDyQ==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, @@ -110,6 +110,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.8.26", @@ -132,38 +137,38 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -315,8 +320,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -326,10 +331,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -472,11 +477,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index 2fab0c504..bf29f1d77 100755 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -68,7 +68,11 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index 25ceefb39..9f1c36e21 --- a/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs +++ b/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs b/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs old mode 100644 new mode 100755 index b5e63d71d..4b6b10034 --- a/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs +++ b/src/Database/MongoDB/Configurations/DicomAssociationInfoConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs b/src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs new file mode 100755 index 000000000..7a6fea639 --- /dev/null +++ b/src/Database/MongoDB/Configurations/ExternalAppDetailsConfiguration.cs @@ -0,0 +1,33 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Models; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class ExternalAppDetailsConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs new file mode 100644 index 000000000..a91466b05 --- /dev/null +++ b/src/Database/MongoDB/Configurations/HL7DestinationEntityConfiguration.cs @@ -0,0 +1,34 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Models; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class HL7DestinationEntityConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs old mode 100644 new mode 100755 index 561b0b1f8..3f1eaca0e --- a/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs +++ b/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs b/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs old mode 100644 new mode 100755 index c7ee5ac3d..9abd8b535 --- a/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs +++ b/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Storage; using MongoDB.Bson.Serialization; namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations diff --git a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs index f4628ef67..522e19023 100755 --- a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs index 3dd049a1f..919693090 100755 --- a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs new file mode 100755 index 000000000..e2755cfce --- /dev/null +++ b/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs @@ -0,0 +1,136 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; +using MongoDB.Driver; +using Moq; + + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test +{ + [Collection("MongoDatabase")] + public class ExternalAppDetailsRepositoryTest + { + private readonly MongoDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public ExternalAppDetailsRepositoryTest(MongoDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithExternalAppEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = _databaseFixture.Options; + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.Client); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + + var expected = (await collection.FindAsync(e => e.StudyInstanceUid == "2").ConfigureAwait(false)).First(); + var actual = (await store.GetAsync("2", new CancellationToken()).ConfigureAwait(false)).FirstOrDefault(); + + actual.Should().NotBeNull(); + Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(expected.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(expected.CorrelationId, actual!.CorrelationId); + Assert.Equal(expected.WorkflowInstanceId, actual!.WorkflowInstanceId); + } + + [Fact] + public async Task GivenAExternalAppDetails_WhenAddingToDatabase_ExpectItToBeSaved() + { + var app = new ExternalAppDetails { StudyInstanceUid = "3", ExportTaskID = "ExportTaskID3", CorrelationId = "CorrelationId3", WorkflowInstanceId = "WorkflowInstanceId3" }; + + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(app, new CancellationToken()).ConfigureAwait(false); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + var actual = await collection.Find(p => p.Id == app.Id).FirstOrDefaultAsync().ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(app.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(app.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(app.CorrelationId, actual!.CorrelationId); + Assert.Equal(app.WorkflowInstanceId, actual!.WorkflowInstanceId); + + actual!.DateTimeCreated.Should().BeCloseTo(app.DateTimeCreated, TimeSpan.FromMilliseconds(500)); + } + + [Fact] + public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetPatientOutboundAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + + var expected = (await collection.FindAsync(e => e.PatientIdOutBound == "pat1out1").ConfigureAwait(false)).First(); + var actual = (await store.GetByPatientIdOutboundAsync("pat1out1", new CancellationToken()).ConfigureAwait(false)); + + actual.Should().NotBeNull(); + Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(expected.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(expected.CorrelationId, actual!.CorrelationId); + Assert.Equal(expected.WorkflowInstanceId, actual!.WorkflowInstanceId); + } + + [Fact] + public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetStudyIdOutboundAsyncCalled_ExpectEntitieToBeReturned() + { + var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); + + var expected = (await collection.FindAsync(e => e.StudyInstanceUidOutBound == "sudIdOut2").ConfigureAwait(false)).First(); + var actual = (await store.GetByStudyIdOutboundAsync("sudIdOut2", new CancellationToken()).ConfigureAwait(false)); + + actual.Should().NotBeNull(); + Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); + Assert.Equal(expected.ExportTaskID, actual!.ExportTaskID); + Assert.Equal(expected.CorrelationId, actual!.CorrelationId); + Assert.Equal(expected.WorkflowInstanceId, actual!.WorkflowInstanceId); + } + } +} diff --git a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs new file mode 100644 index 000000000..dbdb29251 --- /dev/null +++ b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs @@ -0,0 +1,166 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; +using MongoDB.Driver; +using Moq; + + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test +{ + [Collection("MongoDatabase")] + public class HL7DestinationEntityRepositoryTest + { + private readonly MongoDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public HL7DestinationEntityRepositoryTest(MongoDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithHL7DestinationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new DatabaseOptions()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.Client); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + await store.AddAsync(aet).ConfigureAwait(false); + + var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.HostIp, actual!.HostIp); + Assert.Equal(aet.Port, actual!.Port); + Assert.Equal(aet.Name, actual!.Name); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("1.2.3.4", actual!.HostIp); + Assert.Equal(114, actual!.Port); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenHL7DestinationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); + } + + [Fact] + public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + expected!.Port = 1000; + expected!.HostIp = "loalhost"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + Assert.Equal(expected.HostIp, dbResult!.HostIp); + Assert.Equal(expected.Port, dbResult!.Port); + } + } +} diff --git a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs index e8da9cec8..5c73132a9 100755 --- a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test; using Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories; diff --git a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs index f8645bead..f1d48885e 100755 --- a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs +++ b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs @@ -16,6 +16,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.MongoDB; @@ -64,6 +65,23 @@ public void InitDatabaseWithDestinationApplicationEntities() collection.InsertOne(aet5); } + public void InitDatabaseWithHL7DestinationEntities() + { + var collection = Database.GetCollection(nameof(HL7DestinationEntity)); + Clear(collection); + var aet1 = new HL7DestinationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1", DateTimeCreated = DateTime.UtcNow }; + var aet2 = new HL7DestinationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2", DateTimeCreated = DateTime.UtcNow }; + var aet3 = new HL7DestinationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3", DateTimeCreated = DateTime.UtcNow }; + var aet4 = new HL7DestinationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4", DateTimeCreated = DateTime.UtcNow }; + var aet5 = new HL7DestinationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5", DateTimeCreated = DateTime.UtcNow }; + + collection.InsertOne(aet1); + collection.InsertOne(aet2); + collection.InsertOne(aet3); + collection.InsertOne(aet4); + collection.InsertOne(aet5); + } + public void InitDatabaseWithMonaiApplicationEntities() { var collection = Database.GetCollection(nameof(MonaiApplicationEntity)); @@ -114,6 +132,17 @@ public void InitDatabaseWithSourceApplicationEntities() collection.InsertOne(aet4); collection.InsertOne(aet5); } + public void InitDatabaseWithExternalAppEntities() + { + var collection = Database.GetCollection(nameof(ExternalAppDetails)); + Clear(collection); + + var ea1 = new ExternalAppDetails { StudyInstanceUid = "1", ExportTaskID = "ExportTaskID", CorrelationId = "CorrelationId", WorkflowInstanceId = "WorkflowInstanceId", PatientIdOutBound = "pat1out1", StudyInstanceUidOutBound = "sudIdOut1" }; + var ea2 = new ExternalAppDetails { StudyInstanceUid = "2", ExportTaskID = "ExportTaskID2", CorrelationId = "CorrelationId2", WorkflowInstanceId = "WorkflowInstanceId2", PatientIdOutBound = "pat1out2", StudyInstanceUidOutBound = "sudIdOut2" }; + + collection.InsertOne(ea1); + collection.InsertOne(ea2); + } public void InitDatabaseWithInferenceRequests() { diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index 3a2a4784a..c0cbcf5cf 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -110,6 +110,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -132,8 +137,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -274,8 +279,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -285,10 +290,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1395,11 +1400,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/MongoDB/MongoDatabaseMigrationManager.cs b/src/Database/MongoDB/MongoDatabaseMigrationManager.cs old mode 100644 new mode 100755 index f9f4f2d40..151282bad --- a/src/Database/MongoDB/MongoDatabaseMigrationManager.cs +++ b/src/Database/MongoDB/MongoDatabaseMigrationManager.cs @@ -40,6 +40,7 @@ public IHost Migrate(IHost host) StorageMetadataWrapperEntityConfiguration.Configure(); DicomAssociationInfoConfiguration.Configure(); VirtualApplicationEntityConfiguration.Configure(); + ExternalAppDetailsConfiguration.Configure(); return host; } } diff --git a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs index b00d3e7d3..85c071e24 100755 --- a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; diff --git a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs index f81a18d6f..1056bc0c1 100755 --- a/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs +++ b/src/Database/MongoDB/Repositories/DicomAssociationInfoRepository.cs @@ -18,7 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; diff --git a/src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs b/src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs new file mode 100755 index 000000000..16a4a7feb --- /dev/null +++ b/src/Database/MongoDB/Repositories/ExternalAppDetailsRepository.cs @@ -0,0 +1,139 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class ExternalAppDetailsRepository : IExternalAppDetailsRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public ExternalAppDetailsRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(ExternalAppDetails)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.StudyInstanceUid); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.PatientIdOutBound); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.StudyInstanceUidOutBound); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + var options = new CreateIndexOptions { ExpireAfter = TimeSpan.FromDays(7), Name = "DateTimeCreated" }; + indexDefinitionState = Builders.IndexKeys.Ascending(_ => _.DateTimeCreated); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState, options)); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + public async Task AddAsync(ExternalAppDetails details, CancellationToken cancellationToken) + { + Guard.Against.Null(details, nameof(details)); + + await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(details, cancellationToken: cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task> GetAsync(string studyInstanceId, CancellationToken cancellationToken) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return (await _collection.FindAsync(p => + p.StudyInstanceUid == studyInstanceId, null, cancellationToken + ).ConfigureAwait(false)).ToList(); + }).ConfigureAwait(false); + } + + public async Task GetByPatientIdOutboundAsync(string patientId, CancellationToken cancellationToken) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return (await _collection.FindAsync(p => + p.PatientIdOutBound == patientId, null, cancellationToken + ).ConfigureAwait(false)).FirstOrDefault(); + }).ConfigureAwait(false); + } + + public async Task GetByStudyIdOutboundAsync(string studyInstanceId, CancellationToken cancellationToken) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return (await _collection.FindAsync(p => + p.StudyInstanceUidOutBound == studyInstanceId, null, cancellationToken + ).ConfigureAwait(false)).FirstOrDefault(); + }).ConfigureAwait(false); + } + } +} diff --git a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs new file mode 100755 index 000000000..feb428f09 --- /dev/null +++ b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs @@ -0,0 +1,173 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class HL7DestinationEntityRepository : IHL7DestinationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public HL7DestinationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + Guard.Against.Null(mongoDbOptions, nameof(mongoDbOptions)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => + { + _logger.DatabaseErrorRetry(timespan, count, exception); + }); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(HL7DestinationEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.Name); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + + var indexDefinitionAll = Builders.IndexKeys.Combine( + Builders.IndexKeys.Ascending(_ => _.Name), + Builders.IndexKeys.Ascending(_ => _.AeTitle), + Builders.IndexKeys.Ascending(_ => _.HostIp), + Builders.IndexKeys.Ascending(_ => _.Port)); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionAll, options)); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name, nameof(name)); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection + .Find(x => x.Name == name) + .FirstOrDefaultAsync().ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task AddAsync(HL7DestinationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item, nameof(item)); + + return await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(item, cancellationToken: cancellationToken).ConfigureAwait(false); + return item; + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.ReplaceOneAsync(p => p.Id == entity.Id, entity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(HL7DestinationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity, nameof(entity)); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.Name == entity.Name), cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.FindAsync(predicate, cancellationToken: cancellationToken).ConfigureAwait(false); + return await result.AnyAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs new file mode 100755 index 000000000..8b23cf257 --- /dev/null +++ b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs @@ -0,0 +1,152 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class Hl7ApplicationConfigRepository : IHl7ApplicationConfigRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public Hl7ApplicationConfigRepository(IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(options, nameof(options)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Retries.RetryDelays, + (exception, timespan, count, context) => + { + _logger.DatabaseErrorRetry(timespan, count, exception); + }); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); + _collection = mongoDatabase.GetCollection(nameof(Hl7ApplicationConfigEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.DateTimeCreated); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + } + + public Task> GetAllAsync(CancellationToken cancellationToken = default) => + _retryPolicy.ExecuteAsync(() => + _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken)); + + public Task GetByIdAsync(string id) + { + var GuidId = Guid.Parse(id); + return _retryPolicy.ExecuteAsync(() => _collection + .Find(x => x.Id == GuidId) + .FirstOrDefaultAsync())!; + } + + public Task DeleteAsync(string id, CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + var entity = await GetByIdAsync(id).ConfigureAwait(false) ?? throw new DatabaseException("Failed to delete entity."); + + var result = await _collection + .DeleteOneAsync(Builders.Filter.Where(p => p.Id == entity.Id), + cancellationToken: cancellationToken).ConfigureAwait(false); + + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + + return entity; + }); + } + + public Task CreateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + return _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(configEntity, cancellationToken: cancellationToken) + .ConfigureAwait(false); + return configEntity; + }); + } + + public Task UpdateAsync(Hl7ApplicationConfigEntity configEntity, + CancellationToken cancellationToken = default) + { + + return _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection + .ReplaceOneAsync(Builders.Filter.Where(p => p.Id == configEntity.Id), + configEntity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + + return configEntity; + })!; + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs index 87cc1ace1..0f9ecdb36 100755 --- a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Logging; diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index cc8a764f1..cd453a7c0 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -69,6 +69,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -86,8 +91,8 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -195,8 +200,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -206,10 +211,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -373,11 +378,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 527ebfc3c..af4bbeb2a 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -12,15 +12,24 @@ "MongoDB.Driver": "2.14.1" } }, + "Microsoft.EntityFrameworkCore.Tools": { + "type": "Direct", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "2iPMR+DHXh2Xn9qoJ0ejzdHblpns73e1pZ/pyRbYDQi0HPJyq1/pTYDda1owJ5W2lxAGDg8l5Fl1jVp97fTR1g==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Design": "6.0.25" + } + }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { @@ -85,6 +94,16 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.8.26", + "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -102,19 +121,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -124,39 +143,48 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "dependencies": { + "Humanizer.Core": "2.8.26", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -257,10 +285,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -268,8 +296,8 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", @@ -354,8 +382,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -365,10 +393,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -586,11 +614,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -620,8 +649,8 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", diff --git a/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs b/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs new file mode 100755 index 000000000..fcae49e38 --- /dev/null +++ b/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs @@ -0,0 +1,43 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2020 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Common +{ + + public class DestinationNotSuppliedException : Exception + { + public DestinationNotSuppliedException() + { + } + + public DestinationNotSuppliedException(string message) : base(message) + { + } + + public DestinationNotSuppliedException(string message, Exception innerException) : base(message, innerException) + { + } + + protected DestinationNotSuppliedException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + + } +} diff --git a/src/InformaticsGateway/InternalVisibleTo.cs b/src/InformaticsGateway/InternalVisibleTo.cs old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs b/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs index df26a9cf3..d3c420f1f 100755 --- a/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs +++ b/src/InformaticsGateway/Logging/Log.100.200.ScpService.cs @@ -62,14 +62,12 @@ public static partial class Log public static partial void FailedToUpdateAppliationEntityHandlerWithUpdatedAEChange(this ILogger logger, string aeTitle, Exception? ex = null); // SCP Service - [LoggerMessage(EventId = 200, Level = LogLevel.Information, Message = "Initializing SCP Service at port {port}...")] - public static partial void ScpServiceLoading(this ILogger logger, int port); [LoggerMessage(EventId = 201, Level = LogLevel.Critical, Message = "Failed to initialize SCP listener.")] public static partial void ScpListenerInitializationFailure(this ILogger logger); - [LoggerMessage(EventId = 202, Level = LogLevel.Information, Message = "SCP listening on port: {port}.")] - public static partial void ScpListeningOnPort(this ILogger logger, int port); + [LoggerMessage(EventId = 202, Level = LogLevel.Information, Message = "{serviceName} listening on port: {port}.")] + public static partial void ScpListeningOnPort(this ILogger logger, string serviceName, int port); [LoggerMessage(EventId = 203, Level = LogLevel.Information, Message = "C-ECHO request received.")] public static partial void CEchoReceived(this ILogger logger); @@ -106,5 +104,8 @@ public static partial class Log [LoggerMessage(EventId = 214, Level = LogLevel.Information, Message = "Connection closed. Correlation ID={correlationId}. Calling AE Title={callingAeTitle}. Called AE Title={calledAeTitle}. Duration={durationSeconds} seconds.")] public static partial void ConnectionClosed(this ILogger logger, string correlationId, string callingAeTitle, string calledAeTitle, double durationSeconds); + + [LoggerMessage(EventId = 215, Level = LogLevel.Warning, Message = "Failed to find stored external app details for studyInstance Uid {studyInstanceUid}.")] + public static partial void FailedToFindStoredExtAppDetails(this ILogger logger, string studyInstanceUid); } } diff --git a/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs b/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs old mode 100644 new mode 100755 index afdad8c78..8939da80e --- a/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs +++ b/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs @@ -21,8 +21,8 @@ namespace Monai.Deploy.InformaticsGateway.Logging { public static partial class Log { - [LoggerMessage(EventId = 4000, Level = LogLevel.Warning, Message = "Failed to upload file {identifier}; added back to queue for retry.")] - public static partial void FailedToUploadFile(this ILogger logger, string identifier, Exception ex); + [LoggerMessage(EventId = 4000, Level = LogLevel.Warning, Message = "Failed to upload file {identifier}; path: {path} added back to queue for retry.")] + public static partial void FailedToUploadFile(this ILogger logger, string identifier, string path, Exception ex); [LoggerMessage(EventId = 4001, Level = LogLevel.Debug, Message = "Upload statistics: {threads} threads, {seconds} seconds.")] public static partial void UploadStats(this ILogger logger, int threads, double seconds); diff --git a/src/InformaticsGateway/Logging/Log.500.ExportService.cs b/src/InformaticsGateway/Logging/Log.500.ExportService.cs index 1588b94eb..3fb1ff065 100755 --- a/src/InformaticsGateway/Logging/Log.500.ExportService.cs +++ b/src/InformaticsGateway/Logging/Log.500.ExportService.cs @@ -135,5 +135,8 @@ public static partial class Log [LoggerMessage(EventId = 537, Level = LogLevel.Error, Message = "Error executing OutputDataEngine plug-in.")] public static partial void OutputDataEngineBlockException(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 538, Level = LogLevel.Error, Message = "Error exporting to Hl7 destination. Waiting {timeSpan} before next retry. Retry attempt {retryCount}.")] + public static partial void HL7ExportErrorWithRetry(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); } } diff --git a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs old mode 100644 new mode 100755 index 2e2425b63..0dbfd93ff --- a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs +++ b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using System; using Microsoft.Extensions.Logging; namespace Monai.Deploy.InformaticsGateway.Logging @@ -37,5 +38,11 @@ public static partial class Log [LoggerMessage(EventId = 5005, Level = LogLevel.Information, Message = "Executing output data plug-in: {plugin}.")] public static partial void ExecutingOutputDataPlugIn(this ILogger logger, string plugin); + + [LoggerMessage(EventId = 5006, Level = LogLevel.Debug, Message = "Adding SCP Listener {serviceName} on port {port}")] + public static partial void AddingScpListener(this ILogger logger, string serviceName, int port); + + [LoggerMessage(EventId = 5007, Level = LogLevel.Error, Message = "Error executing plug-in: {plugin}.")] + public static partial void ErrorAddingOutputDataPlugIn(this ILogger logger, Exception d, string plugin); } } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs index 7720e70f4..0b926a413 100755 --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -158,7 +158,10 @@ public static partial class Log [LoggerMessage(EventId = 750, Level = LogLevel.Information, Message = "Artifact recieved published to {queue}, message ID={messageId}. Payload took {durationSeconds} seconds to complete.")] public static partial void ArtifactRecievedPublished(this ILogger logger, string queue, string messageId, double durationSeconds); - [LoggerMessage(EventId = 751, Level = LogLevel.Debug, Message = "NotifyAsync for payload {payloadId}.")] - public static partial void PayloadNotifyAsync(this ILogger logger, Guid payloadId); + [LoggerMessage(EventId = 751, Level = LogLevel.Debug, Message = "Saving External App Data to repo for {studyInstanceUID}.")] + public static partial void SavingExternalAppData(this ILogger logger, string studyInstanceUID); + + [LoggerMessage(EventId = 752, Level = LogLevel.Debug, Message = "Payload in Notification handler {payloadId}.")] + public static partial void PayloadNotifyAsync(this ILogger logger, string payloadId); } } diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs old mode 100644 new mode 100755 index 419060787..15694a8f5 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -68,5 +68,42 @@ public static partial class Log [LoggerMessage(EventId = 815, Level = LogLevel.Information, Message = "HL7 client {clientId} disconnected.")] public static partial void Hl7ClientRemoved(this ILogger logger, Guid clientId); + + [LoggerMessage(EventId = 816, Level = LogLevel.Debug, Message = "HL7 config loaded. {config}")] + public static partial void Hl7ConfigLoaded(this ILogger logger, string config); + + [LoggerMessage(EventId = 817, Level = LogLevel.Information, Message = "No HL7 config found")] + public static partial void Hl7NoConfig(this ILogger logger); + + [LoggerMessage(EventId = 818, Level = LogLevel.Debug, Message = "HL7 no matching config found for message {message}")] + public static partial void Hl7NoMatchingConfig(this ILogger logger, string message); + + [LoggerMessage(EventId = 819, Level = LogLevel.Debug, Message = "HL7 found matching config found for. {Id} config: {config}")] + public static partial void Hl7FoundMatchingConfig(this ILogger logger, string Id, string config); + + [LoggerMessage(EventId = 820, Level = LogLevel.Warning, Message = "HL7 exception thrown extracting Hl7 Info")] + public static partial void Hl7ExceptionThrow(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 821, Level = LogLevel.Warning, Message = "HL7 external App Details not found")] + public static partial void Hl7ExtAppDetailsNotFound(this ILogger logger); + + [LoggerMessage(EventId = 822, Level = LogLevel.Debug, Message = "HL7 changing value {hl7Tag} from {oldValue} to {newValue}")] + public static partial void ChangingHl7Values(this ILogger logger, string hl7Tag, string oldValue, string newValue); + + [LoggerMessage(EventId = 823, Level = LogLevel.Error, Message = "HL7 destination stream not writable")] + public static partial void Hl7ClientStreamNotWritable(this ILogger logger); + + [LoggerMessage(EventId = 824, Level = LogLevel.Error, Message = "HL7 Ack missing start or end characters")] + public static partial void Hl7AckMissingStartOrEndCharacters(this ILogger logger); + + [LoggerMessage(EventId = 825, Level = LogLevel.Error, Message = "HL7 Execption sending Hl7 meassage")] + public static partial void Hl7SendException(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 826, Level = LogLevel.Debug, Message = "HL7 meassage sent received {ack}")] + public static partial void Hl7MessageSent(this ILogger logger, string ack); + + [LoggerMessage(EventId = 827, Level = LogLevel.Warning, Message = "HL7 plugin loading exceptions")] + public static partial void HL7PluginLoadingExceptions(this ILogger logger, Exception ex); + } } diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs index 48fcdd325..ec6d41ce8 100644 --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -179,5 +179,34 @@ public static partial class Log // [LoggerMessage(EventId = 8300, Level = LogLevel.Error, Message = "Unexpected error occurred in GET /dicom-associations API..")] public static partial void DicomAssociationsControllerGetError(this ILogger logger, Exception ex); + + /// + /// HL7 Application Configuration controller + /// + [LoggerMessage(EventId = 8400, Level = LogLevel.Error, Message = "Unexpected error occurred in PUT {endpoint} API.")] + public static partial void PutHl7ApplicationConfigException(this ILogger logger, string endpoint, Exception ex); + + + // HL7 Destination Controller + [LoggerMessage(EventId = 8401, Level = LogLevel.Information, Message = "HL7 destination added AE Title={aeTitle}, Host/IP={hostIp}.")] + public static partial void HL7DestinationEntityAdded(this ILogger logger, string aeTitle, string hostIp); + + [LoggerMessage(EventId = 8402, Level = LogLevel.Information, Message = "HL7 destination deleted {name}.")] + public static partial void HL7DestinationEntityDeleted(this ILogger logger, string name); + + [LoggerMessage(EventId = 8403, Level = LogLevel.Error, Message = "Error querying HL7 destinations.")] + public static partial void ErrorListingHL7DestinationEntities(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 8404, Level = LogLevel.Error, Message = "Error adding new HL7 destination.")] + public static partial void ErrorAddingHL7DestinationEntity(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 8405, Level = LogLevel.Error, Message = "Error deleting HL7 destination.")] + public static partial void ErrorDeletingHL7DestinationEntity(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 8406, Level = LogLevel.Error, Message = "Error C-ECHO to HL7 destination {name}.")] + public static partial void ErrorCEechoHL7DestinationEntity(this ILogger logger, string name, Exception ex); + + [LoggerMessage(EventId = 8407, Level = LogLevel.Information, Message = "HL7 destination updated {name}: AE Title={aeTitle}, Host/IP={hostIp}, Port={port}.")] + public static partial void HL7DestinationEntityUpdated(this ILogger logger, string name, string aeTitle, string hostIp, int port); } } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index a57bcabc0..f1f927dd4 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -38,7 +38,11 @@ - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index aaf5d9d91..be43e4ade 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -25,6 +25,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; @@ -35,7 +36,6 @@ using Monai.Deploy.InformaticsGateway.Services.DicomWeb; using Monai.Deploy.InformaticsGateway.Services.Export; using Monai.Deploy.InformaticsGateway.Services.Fhir; -using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; using Monai.Deploy.InformaticsGateway.Services.Http; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Scu; @@ -110,13 +110,16 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped, InputDataPlugInEngineFactory>(); services.AddScoped, OutputDataPlugInEngineFactory>(); + services.AddScoped, InputHL7DataPlugInEngineFactory>(); services.AddMonaiDeployStorageService(hostContext.Configuration!.GetSection("InformaticsGateway:storage:serviceAssemblyName").Value, Monai.Deploy.Storage.HealthCheckOptions.ServiceHealthCheck); @@ -132,16 +135,9 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + var timeout = TimeSpan.FromSeconds(hostContext.Configuration.GetValue("InformaticsGateway:dicomWeb:clientTimeout", DicomWebConfiguration.DefaultClientTimeout)); services @@ -158,16 +154,17 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => .AddHttpClient("fhir", configure => configure.Timeout = timeout) .SetHandlerLifetime(timeout); -#pragma warning disable CS8603 // Possible null reference return. - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(p => p.GetService()); -#pragma warning restore CS8603 // Possible null reference return. + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); }) .ConfigureWebHostDefaults(webBuilder => diff --git a/src/InformaticsGateway/Properties/launchSettings.json b/src/InformaticsGateway/Properties/launchSettings.json deleted file mode 100755 index f5636e031..000000000 --- a/src/InformaticsGateway/Properties/launchSettings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "profiles": { - "Monai.Deploy.InformaticsGateway": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development", - "ELASTIC_CLIENT_APIVERSIONING": "true", - "LOGSTASH_URL": "tcp://localhost:50000", - "InformaticsGateway__messaging__publisherSettings__username": "rabbitmq", - "InformaticsGateway__messaging__publisherSettings__password": "rabbitmq", - "InformaticsGateway__messaging__subscriberSettings__username": "rabbitmq", - "InformaticsGateway__messaging__subscriberSettings__password": "rabbitmq", - "Kestrel__EndPoints__Http__Url": "http://+:5000" - } - } - } -} \ No newline at end of file diff --git a/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs b/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs old mode 100644 new mode 100755 index 4f122da6f..880eaef95 --- a/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs +++ b/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs @@ -125,4 +125,11 @@ public OutputDataPlugInEngineFactory(IFileSystem fileSystem, ILogger + { + public InputHL7DataPlugInEngineFactory(IFileSystem fileSystem, ILogger> logger) : base(fileSystem, logger) + { + } + } } diff --git a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs new file mode 100755 index 000000000..bd8fdea29 --- /dev/null +++ b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs @@ -0,0 +1,93 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Services.Common +{ + public class InputHL7DataPlugInEngine : IInputHL7DataPlugInEngine + { + private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; + private IReadOnlyList? _plugsins; + + public InputHL7DataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) + { + _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public void Configure(IReadOnlyList pluginAssemblies) + { + _plugsins = LoadPlugIns(_serviceProvider, pluginAssemblies); + } + + public async Task> ExecutePlugInsAsync(Message hl7File, FileStorageMetadata fileMetadata, Hl7ApplicationConfigEntity? configItem) + { + if (_plugsins == null) + { + throw new PlugInInitializationException("InputHL7DataPlugInEngine not configured, please call Configure() first."); + } + + foreach (var plugin in _plugsins) + { + var nm = plugin.ToString(); + if (configItem is not null && configItem.PlugInAssemblies.Any(a => a.StartsWith(plugin.ToString()!))) + { + _logger.ExecutingInputDataPlugIn(plugin.Name); + (hl7File, fileMetadata) = await plugin.ExecuteAsync(hl7File, fileMetadata).ConfigureAwait(false); + } + } + + return new Tuple(hl7File, fileMetadata); + } + + private IReadOnlyList LoadPlugIns(IServiceProvider serviceProvider, IReadOnlyList pluginAssemblies) + { + var exceptions = new List(); + var list = new List(); + foreach (var plugin in pluginAssemblies) + { + try + { + _logger.AddingInputDataPlugIn(plugin); + list.Add(typeof(IInputHL7DataPlugIn).CreateInstance(serviceProvider, typeString: plugin)); + } + catch (Exception ex) + { + exceptions.Add(new PlugInLoadingException($"Error loading plug-in '{plugin}'.", ex)); + } + } + + if (exceptions.Any()) + { + throw new AggregateException("Error loading plug-in(s).", exceptions); + } + + return list; + } + } +} diff --git a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs index 33d72b186..a497862dc 100755 --- a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs @@ -20,7 +20,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Logging; @@ -61,7 +61,7 @@ public async Task ExecutePlugInsAsync(ExportRequestDat (dicomFile, exportRequestDataMessage) = await plugin.ExecuteAsync(dicomFile, exportRequestDataMessage).ConfigureAwait(false); } using var ms = new MemoryStream(); - await dicomFile.SaveAsync(ms); + await dicomFile.SaveAsync(ms).ConfigureAwait(false); exportRequestDataMessage.SetData(ms.ToArray()); return exportRequestDataMessage; @@ -80,6 +80,7 @@ private IReadOnlyList LoadPlugIns(IServiceProvider servicePro } catch (Exception ex) { + _logger.ErrorAddingOutputDataPlugIn(ex, plugin); exceptions.Add(new PlugInLoadingException($"Error loading plug-in '{plugin}'.", ex)); } } diff --git a/src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs b/src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs new file mode 100755 index 000000000..280effdfe --- /dev/null +++ b/src/InformaticsGateway/Services/Common/ScpInputTypeEnum.cs @@ -0,0 +1,24 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace Monai.Deploy.InformaticsGateway.Services.Common +{ + public enum ScpInputTypeEnum + { + WorkflowTrigger, + ExternalAppReturn + } +} diff --git a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs old mode 100644 new mode 100755 index 3bc1300fd..b558c4175 --- a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs +++ b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs @@ -29,7 +29,6 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; @@ -124,7 +123,7 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) try { request = await repository.TakeAsync(cancellationToken).ConfigureAwait(false); - using (_logger.BeginScope(new LoggingDataDictionary { { "TransactionId", request.TransactionId } })) + using (_logger.BeginScope(new Api.LoggingDataDictionary { { "TransactionId", request.TransactionId } })) { _logger.ProcessingInferenceRequest(); await ProcessRequest(request, cancellationToken).ConfigureAwait(false); @@ -589,4 +588,4 @@ public void Dispose() #endregion Data Retrieval } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index d09a98b8d..1222add24 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -200,13 +200,13 @@ private async Task QueueBucketForNotification(string key, Payload payload) } } - private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? payloadId = null) + private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder = null) { return await _payloads.GetOrAdd(key, x => new AsyncLazy(async () => { var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); - var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, payloadId); + var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null, destinationFolder); await repository.AddAsync(newPayload).ConfigureAwait(false); _logger.BucketCreated(key, timeout); return newPayload; diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 5dd3ebf81..1aa2a848a 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -62,7 +62,7 @@ public PayloadNotificationActionHandler(IServiceScopeFactory serviceScopeFactory public async Task NotifyAsync(Payload payload, ActionBlock notificationQueue, CancellationToken cancellationToken = default) { - _logger.PayloadNotifyAsync(payload.PayloadId); + _logger.PayloadNotifyAsync(payload.PayloadId.ToString()); Guard.Against.Null(payload, nameof(payload)); Guard.Against.Null(notificationQueue, nameof(notificationQueue)); diff --git a/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs b/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs index 7bb731f23..4fc30edea 100644 --- a/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs +++ b/src/InformaticsGateway/Services/DicomWeb/ContentTypes.cs @@ -22,6 +22,7 @@ internal static class ContentTypes public const string ApplicationDicomJson = "application/dicom+json"; public const string ApplicationDicomXml = "application/dicom+xml"; public const string ApplicationOctetStream = "application/octet-stream"; + public const string ApplicationJson = "application/json"; public const string MultipartRelated = "multipart/related"; diff --git a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs index a2baf45a5..9eca29da2 100755 --- a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs +++ b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs @@ -26,7 +26,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; @@ -35,6 +35,7 @@ using Monai.Deploy.InformaticsGateway.DicomWeb.Client.API; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; using Polly; @@ -44,7 +45,6 @@ internal class DicomWebExportService : ExportServiceBase { private readonly ILoggerFactory _loggerFactory; private readonly IHttpClientFactory _httpClientFactory; - private readonly IServiceScopeFactory _serviceScopeFactory; private readonly ILogger _logger; private readonly IOptions _configuration; private readonly IDicomToolkit _dicomToolkit; @@ -60,11 +60,10 @@ public DicomWebExportService( ILogger logger, IOptions configuration, IDicomToolkit dicomToolkit) - : base(logger, configuration, serviceScopeFactory) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) { _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); @@ -73,11 +72,15 @@ public DicomWebExportService( Concurrency = configuration.Value.DicomWeb.MaximumNumberOfConnection; } + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + await BaseProcessMessage(eventArgs); + } protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) { - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); - using var scope = _serviceScopeFactory.CreateScope(); + using var scope = ServiceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); foreach (var transaction in exportRequestData.Destinations) @@ -174,7 +177,7 @@ private void CheckAndLogResult(DicomWebResponse result) break; default: - throw new ServiceException("Failed to export to destination."); + throw new InformaticsGateway.Common.ServiceException("Failed to export to destination."); } } } diff --git a/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs b/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs index ee3e4012c..66a704e63 100755 --- a/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs +++ b/src/InformaticsGateway/Services/Export/ExportRequestEventDetails.cs @@ -29,7 +29,7 @@ public ExportRequestEventDetails(ExportRequestEvent exportRequest) ExportTaskId = exportRequest.ExportTaskId; Files = new List(exportRequest.Files); Destinations = new string[exportRequest.Destinations.Length]; - Array.Copy(exportRequest.Destinations, Destinations, exportRequest.Destinations.Length); + //Array.Copy(exportRequest.Destinations, Destinations, exportRequest.Destinations.Length); exportRequest.Destinations.CopyTo(Destinations, 0); DeliveryTag = exportRequest.DeliveryTag; MessageId = exportRequest.MessageId; @@ -42,6 +42,23 @@ public ExportRequestEventDetails(ExportRequestEvent exportRequest) StartTime = DateTimeOffset.UtcNow; } + public ExportRequestEventDetails(ExternalAppRequestEvent externalAppRequest) + { + CorrelationId = externalAppRequest.CorrelationId; + ExportTaskId = externalAppRequest.ExportTaskId; + Files = new List(externalAppRequest.Files); + Destinations = externalAppRequest.Targets.Select(t => t.Destination).ToArray(); + DeliveryTag = externalAppRequest.DeliveryTag; + MessageId = externalAppRequest.MessageId; + WorkflowInstanceId = externalAppRequest.WorkflowInstanceId; + PayloadId = externalAppRequest.DestinationFolder; + + PluginAssemblies.AddRange(externalAppRequest.PluginAssemblies); + ErrorMessages.AddRange(externalAppRequest.ErrorMessages); + + StartTime = DateTimeOffset.UtcNow; + } + /// /// Gets the time the export request received. /// diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index 4a2b2a0e3..0a80875f3 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -23,15 +23,18 @@ using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using Ardalis.GuardClauses; +using FellowOakDicom.Network; +using FellowOakDicom; +using FellowOakDicom.Network.Client; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -41,32 +44,37 @@ using Monai.Deploy.Messaging.Messages; using Monai.Deploy.Storage.API; using Polly; +using System.Net.Sockets; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Services.Export { public abstract class ExportServiceBase : IHostedService, IMonaiService, IDisposable { - private static readonly object SyncRoot = new(); + protected static readonly object SyncRoot = new(); internal event EventHandler? ReportActionCompleted; private readonly CancellationTokenSource _cancellationTokenSource; private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; + protected readonly IServiceScopeFactory ServiceScopeFactory; private readonly InformaticsGatewayConfiguration _configuration; - private readonly IMessageBrokerSubscriberService _messageSubscriber; - private readonly IMessageBrokerPublisherService _messagePublisher; + protected readonly IMessageBrokerSubscriberService MessageSubscriber; + protected readonly IMessageBrokerPublisherService MessagePublisher; private readonly IServiceScope _scope; - private readonly Dictionary _exportRequests; + protected readonly Dictionary ExportRequests; private readonly IStorageInfoProvider _storageInfoProvider; private bool _disposedValue; private ulong _activeWorkers = 0; + private readonly IDicomToolkit _dicomToolkit; public abstract string RoutingKey { get; } protected abstract ushort Concurrency { get; } public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; public abstract string ServiceName { get; } + protected string ExportCompleteTopic { get; set; } + /// /// Override the ExportDataBlockCallback method to customize export logic. /// Must update State to either Succeeded or Failed. @@ -76,15 +84,20 @@ public abstract class ExportServiceBase : IHostedService, IMonaiService, IDispos /// protected abstract Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken); + protected abstract Task ProcessMessage(MessageReceivedEventArgs eventArgs); + protected ExportServiceBase( ILogger logger, IOptions configuration, - IServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory, + IDicomToolkit dicomToolkit) { _cancellationTokenSource = new CancellationTokenSource(); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); - _scope = _serviceScopeFactory.CreateScope(); + ServiceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); + _scope = ServiceScopeFactory.CreateScope(); + _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); + if (configuration is null) { @@ -93,13 +106,14 @@ protected ExportServiceBase( _configuration = configuration.Value; - _messageSubscriber = _scope.ServiceProvider.GetRequiredService(); - _messagePublisher = _scope.ServiceProvider.GetRequiredService(); + ExportCompleteTopic = _configuration.Messaging.Topics.ExportComplete; + MessageSubscriber = _scope.ServiceProvider.GetRequiredService(); + MessagePublisher = _scope.ServiceProvider.GetRequiredService(); _storageInfoProvider = _scope.ServiceProvider.GetRequiredService(); - _exportRequests = new Dictionary(); + ExportRequests = new Dictionary(); - _messageSubscriber.OnConnectionError += (sender, args) => + MessageSubscriber.OnConnectionError += (sender, args) => { _logger.MessagingServiceErrorRecover(args.ErrorMessage); SetupPolling(); @@ -115,21 +129,25 @@ public Task StartAsync(CancellationToken cancellationToken) return Task.CompletedTask; } - public Task StopAsync(CancellationToken cancellationToken) + public async Task StopAsync(CancellationToken cancellationToken) { _cancellationTokenSource.Cancel(); _logger.ServiceStopping(ServiceName); Status = ServiceStatus.Stopped; - return Task.CompletedTask; +#pragma warning disable CA2016 // Forward the 'CancellationToken' parameter to methods + await Task.Delay(250).ConfigureAwait(false); +#pragma warning restore CA2016 // Forward the 'CancellationToken' parameter to methods + _cancellationTokenSource.Dispose(); + return; } private void SetupPolling() { - _messageSubscriber.SubscribeAsync(RoutingKey, RoutingKey, OnMessageReceivedCallback, prefetchCount: Concurrency); + MessageSubscriber.SubscribeAsync(RoutingKey, RoutingKey, OnMessageReceivedCallback, prefetchCount: Concurrency); _logger.ExportEventSubscription(ServiceName, RoutingKey); } - private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) + protected virtual async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) { using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "ThreadId", Environment.CurrentManagedThreadId }, @@ -138,7 +156,7 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) if (!_storageInfoProvider.HasSpaceAvailableForExport) { _logger.ExportServiceStoppedDueToLowStorageSpace(_storageInfoProvider.AvailableFreeSpace); - _messageSubscriber.Reject(eventArgs.Message); + MessageSubscriber.Reject(eventArgs.Message); return; } @@ -146,111 +164,134 @@ private async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) { _logger.ExceededMaxmimumNumberOfWorkers(ServiceName, _activeWorkers); await Task.Delay(200).ConfigureAwait(false); // small delay to stop instantly dead lettering the next message. - _messageSubscriber.Reject(eventArgs.Message); + MessageSubscriber.Reject(eventArgs.Message); return; } Interlocked.Increment(ref _activeWorkers); try { - var executionOptions = new ExecutionDataflowBlockOptions + await ProcessMessage(eventArgs).ConfigureAwait(false); + } + catch (AggregateException ex) + { + foreach (var iex in ex.InnerExceptions) { - MaxDegreeOfParallelism = Concurrency, - MaxMessagesPerTask = 1, - CancellationToken = _cancellationTokenSource.Token - }; + _logger.ErrorExporting(iex); + } + } + catch (Exception ex) + { + _logger.ErrorProcessingExportTask(ex); + } + finally + { + Interlocked.Decrement(ref _activeWorkers); + } + } - var exportFlow = new TransformManyBlock( - exportRequest => DownloadPayloadActionCallback(exportRequest, _cancellationTokenSource.Token), - executionOptions); + TransformBlock GetoutputDataEngineBlock(ExecutionDataflowBlockOptions executionOptions) + { + return new TransformBlock( + async (exportDataRequest) => + { + try + { + if (exportDataRequest.IsFailed) return exportDataRequest; + return await ExecuteOutputDataEngineCallback(exportDataRequest).ConfigureAwait(false); + } + catch (Exception e) + { + exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"failed to execute plugin {e.Message}"); + return exportDataRequest; + } + }, + executionOptions); + } - var outputDataEngineBLock = new TransformBlock( - async (exportDataRequest) => + TransformBlock GetxportActionBlock(ExecutionDataflowBlockOptions executionOptions) + { + return new TransformBlock( + async (exportDataRequest) => + { + try { - try - { - if (exportDataRequest.IsFailed) return exportDataRequest; - return await ExecuteOutputDataEngineCallback(exportDataRequest).ConfigureAwait(false); - } - catch (Exception e) - { - _logger.OutputDataEngineBlockException(e); - exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"failed to execute plugin {e.Message}"); - return exportDataRequest; - } - }, - executionOptions); - - var exportActionBlock = new TransformBlock( - async (exportDataRequest) => + if (exportDataRequest.IsFailed) return exportDataRequest; + return await ExportDataBlockCallback(exportDataRequest, _cancellationTokenSource.Token).ConfigureAwait(false); + } + catch (Exception e) { - try - { - if (exportDataRequest.IsFailed) return exportDataRequest; - return await ExportDataBlockCallback(exportDataRequest, _cancellationTokenSource.Token).ConfigureAwait(false); - } - catch (Exception e) - { - exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"Failed during export {e.Message}"); - return exportDataRequest; - } + exportDataRequest.SetFailed(FileExportStatus.ServiceError, $"Failed during export {e.Message}"); + return exportDataRequest; + } - }, - executionOptions); + }, + executionOptions); + } - var reportingActionBlock = new ActionBlock(ReportingActionBlock, executionOptions); + protected (TransformManyBlock, ActionBlock) SetupActionBlocks() + { + var executionOptions = new ExecutionDataflowBlockOptions + { + MaxDegreeOfParallelism = Concurrency, + MaxMessagesPerTask = 1, + CancellationToken = _cancellationTokenSource.Token + }; - var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; + var exportFlow = new TransformManyBlock( + exportRequest => DownloadPayloadActionCallback(exportRequest, _cancellationTokenSource.Token), + executionOptions); - exportFlow.LinkTo(outputDataEngineBLock, linkOptions); - outputDataEngineBLock.LinkTo(exportActionBlock, linkOptions); - exportActionBlock.LinkTo(reportingActionBlock, linkOptions); + var outputDataEngineBLock = GetoutputDataEngineBlock(executionOptions); - lock (SyncRoot) - { - var exportRequest = eventArgs.Message.ConvertTo(); - if (_exportRequests.ContainsKey(exportRequest.ExportTaskId)) - { - _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); - return; - } + var exportActionBlock = GetxportActionBlock(executionOptions); - exportRequest.MessageId = eventArgs.Message.MessageId; - exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + var reportingActionBlock = new ActionBlock(ReportingActionBlock, executionOptions); - var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; - _exportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); - if (!exportFlow.Post(exportRequestWithDetails)) - { - _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); - _messageSubscriber.Reject(eventArgs.Message); - } - else - { - _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); - } - } + exportFlow.LinkTo(outputDataEngineBLock, linkOptions); + outputDataEngineBLock.LinkTo(exportActionBlock, linkOptions); + exportActionBlock.LinkTo(reportingActionBlock, linkOptions); - exportFlow.Complete(); - await reportingActionBlock.Completion.ConfigureAwait(false); - } - catch (AggregateException ex) - { - foreach (var iex in ex.InnerExceptions) - { - _logger.ErrorExporting(iex); - } - } - catch (Exception ex) + return (exportFlow, reportingActionBlock); + } + + protected void HandleCStoreException(Exception ex, ExportRequestDataMessage exportRequestData) + { + var exception = ex; + var fillStatus = FileExportStatus.ServiceError; + + if (exception is AggregateException) { - _logger.ErrorProcessingExportTask(ex); + exception = exception.InnerException!; } - finally + + var errorMessage = $"Job failed with error: {exception.Message}."; + + switch (exception) { - Interlocked.Decrement(ref _activeWorkers); + case DicomAssociationAbortedException abortEx: + errorMessage = $"Association aborted with reason {abortEx.AbortReason}."; + break; + case DicomAssociationRejectedException rejectEx: + errorMessage = $"Association rejected with reason {rejectEx.RejectReason}."; + break; + case SocketException socketException: + errorMessage = $"Association aborted with error {socketException.Message}."; + break; + case ConfigurationException configException: + errorMessage = $"{configException.Message}"; + fillStatus = FileExportStatus.ConfigurationError; + break; + case ExternalAppExeception appException: + errorMessage = $"{appException.Message}"; + break; } + + _logger.ExportException(errorMessage, ex); + exportRequestData.SetFailed(fillStatus, errorMessage); } // TPL doesn't yet support IAsyncEnumerable @@ -259,7 +300,7 @@ private IEnumerable DownloadPayloadActionCallback(Expo { Guard.Against.Null(exportRequest, nameof(exportRequest)); using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequest.ExportTaskId }, { "CorrelationId", exportRequest.CorrelationId } }); - var scope = _serviceScopeFactory.CreateScope(); + var scope = ServiceScopeFactory.CreateScope(); var storageService = scope.ServiceProvider.GetRequiredService(); foreach (var file in exportRequest.Files) @@ -282,6 +323,7 @@ private IEnumerable DownloadPayloadActionCallback(Expo var stream = (await storageService.GetObjectAsync(_configuration.Storage.StorageServiceBucketName, file, cancellationToken).ConfigureAwait(false) as MemoryStream)!; exportRequestData.SetData(stream.ToArray()); _logger.FileReadyForExport(file); + ExportCompleteCallback(exportRequestData).GetAwaiter().GetResult(); }); task.Wait(cancellationToken); @@ -297,7 +339,7 @@ private IEnumerable DownloadPayloadActionCallback(Expo } } - private async Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) + protected virtual async Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) { using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "WorkflowInstanceId", exportDataRequest.WorkflowInstanceId }, @@ -309,9 +351,8 @@ private async Task ExecuteOutputDataEngineCallback(Exp return await outputDataEngine.ExecutePlugInsAsync(exportDataRequest).ConfigureAwait(false); } - private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) + private static void HandleStatus(ExportRequestDataMessage exportRequestData, ExportRequestEventDetails exportRequest) { - var exportRequest = _exportRequests[exportRequestData.ExportTaskId]; lock (SyncRoot) { exportRequest.FileStatuses.Add(exportRequestData.Filename, exportRequestData.ExportStatus); @@ -328,11 +369,16 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) { exportRequest.AddErrorMessages(exportRequestData.Messages); } + } + } - if (!exportRequest.IsCompleted) - { - return; - } + private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) + { + var exportRequest = ExportRequests[exportRequestData.ExportTaskId]; + HandleStatus(exportRequestData, exportRequest); + if (!exportRequest.IsCompleted) + { + return; } using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId } }); @@ -342,6 +388,26 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) var jsonMessage = new JsonMessage(exportCompleteEvent, MessageBrokerConfiguration.InformaticsGatewayApplicationId, exportRequest.CorrelationId, exportRequest.DeliveryTag); + FinaliseMessage(jsonMessage); + + lock (SyncRoot) + { + ExportRequests.Remove(exportRequestData.ExportTaskId); + } + + if (ReportActionCompleted != null) + { + _logger.CallingReportActionCompletedCallback(); + ReportActionCompleted(this, EventArgs.Empty); + } + } + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + protected virtual async Task ExportCompleteCallback(ExportRequestDataMessage exportRequestData) { } +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + private void FinaliseMessage(JsonMessage jsonMessage) + { Policy .Handle() .WaitAndRetry( @@ -353,7 +419,7 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) .Execute(() => { _logger.PublishingExportCompleteEvent(); - _messagePublisher.Publish(_configuration.Messaging.Topics.ExportComplete, jsonMessage.ToMessage()); + MessagePublisher.Publish(ExportCompleteTopic, jsonMessage.ToMessage()); }); Policy @@ -367,32 +433,188 @@ private void ReportingActionBlock(ExportRequestDataMessage exportRequestData) .Execute(() => { _logger.SendingAcknowledgement(); - _messageSubscriber.Acknowledge(jsonMessage); + MessageSubscriber.Acknowledge(jsonMessage); }); + } - lock (SyncRoot) + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) { - _exportRequests.Remove(exportRequestData.ExportTaskId); + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; } + } - if (ReportActionCompleted != null) + private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(destinationName)) { - _logger.CallingReportActionCompletedCallback(); - ReportActionCompleted(this, EventArgs.Empty); + throw new ConfigurationException("Export task does not have destination set."); } + + using var scope = ServiceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); + var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); + + return destination is null + ? throw new ConfigurationException($"Specified destination '{destinationName}' does not exist.") + : destination; } - protected virtual void Dispose(bool disposing) + protected virtual async Task GetDestination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) { - if (!_disposedValue) + try { - if (disposing) + return await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); + } + catch (ConfigurationException ex) + { + HandleCStoreException(ex, exportRequestData); + return null; + } + } + + protected virtual async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + Guard.Against.Null(exportRequestData, nameof(exportRequestData)); + + var manualResetEvent = new ManualResetEvent(false); + var destination = await GetDestination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + if (destination is null) + { + return; + } + + try + { + await ExecuteExport(exportRequestData, manualResetEvent, destination!, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + HandleCStoreException(ex, exportRequestData); + } + } + + private async Task GenerateRequestsAsync( + ExportRequestDataMessage exportRequestData, + IDicomClient client, + ManualResetEvent manualResetEvent) + { + DicomFile dicomFile; + try + { + dicomFile = _dicomToolkit.Load(exportRequestData.FileContent); + } + catch (Exception ex) + { + var errorMessage = $"Error reading DICOM file: {ex.Message}"; + _logger.ExportException(errorMessage, ex); + exportRequestData.SetFailed(FileExportStatus.UnsupportedDataType, errorMessage); + return false; + } + + try + { + var request = new DicomCStoreRequest(dicomFile); + + request.OnResponseReceived += (req, response) => { - _scope.Dispose(); + if (response.Status == DicomStatus.Success) + { + _logger.DimseExportInstanceComplete(); + } + else + { + var errorMessage = $"Failed to export with error {response.Status}"; + _logger.DimseExportInstanceError(response.Status); + exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); + } + manualResetEvent.Set(); + }; + + await client.AddRequestAsync(request).ConfigureAwait(false); + return true; + } + catch (Exception exception) + { + var errorMessage = $"Error while adding DICOM C-STORE request: {exception.Message}"; + _logger.DimseExportErrorAddingInstance(exception.Message, exception); + exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); + return false; + } + } + + protected async Task ExecuteExport(ExportRequestDataMessage exportRequestData, ManualResetEvent manualResetEvent, DestinationApplicationEntity destination, CancellationToken cancellationToken) => await Policy + .Handle() + .WaitAndRetryAsync( + _configuration.Export.Retries.RetryDelays, + (exception, timeSpan, retryCount, context) => + { + _logger.DimseExportErrorWithRetry(timeSpan, retryCount, exception); + }) + .ExecuteAsync(async () => + { + var client = DicomClientFactory.Create( + destination.HostIp, + destination.Port, + false, + _configuration.Dicom.Scu.AeTitle, + destination.AeTitle); + + client.AssociationAccepted += (sender, args) => _logger.ExportAssociationAccepted(); + client.AssociationRejected += (sender, args) => _logger.ExportAssociationRejected(); + client.AssociationReleased += (sender, args) => _logger.ExportAssociationReleased(); + client.ServiceOptions.LogDataPDUs = _configuration.Dicom.Scu.LogDataPdus; + client.ServiceOptions.LogDimseDatasets = _configuration.Dicom.Scu.LogDimseDatasets; + + client.NegotiateAsyncOps(); + if (await GenerateRequestsAsync(exportRequestData, client, manualResetEvent).ConfigureAwait(false)) + { + _logger.DimseExporting(destination.AeTitle, destination.HostIp, destination.Port); + await client.SendAsync(cancellationToken).ConfigureAwait(false); + manualResetEvent.WaitOne(); + _logger.DimseExportComplete(destination.AeTitle); + } + }).ConfigureAwait(false); + + protected async Task BaseProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var exportRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) + { + _logger.ExportRequestAlreadyQueued(exportRequest.CorrelationId, exportRequest.ExportTaskId); + return; } - _disposedValue = true; + exportRequest.MessageId = eventArgs.Message.MessageId; + exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + + ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + _logger.ErrorPostingExportJobToQueue(exportRequest.CorrelationId, exportRequest.ExportTaskId); + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + _logger.ExportRequestQueuedForProcessing(exportRequest.CorrelationId, exportRequest.MessageId, exportRequest.ExportTaskId); + } } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + } public void Dispose() diff --git a/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs b/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs new file mode 100755 index 000000000..fb602be5d --- /dev/null +++ b/src/InformaticsGateway/Services/Export/ExtAppScuExportService.cs @@ -0,0 +1,166 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; +using FellowOakDicom; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; + +namespace Monai.Deploy.InformaticsGateway.Services.Export +{ + public class ExtAppScuExportService : ExportServiceBase + { + private readonly ILogger _logger; + private readonly IOptions _configuration; + private readonly IExternalAppDetailsRepository _repository; + private readonly IDicomToolkit _dicomToolkit; + protected override ushort Concurrency { get; } + public override string RoutingKey { get; } + public override string ServiceName => "External App Export Service"; + + public ExtAppScuExportService( + ILogger logger, + IServiceScopeFactory serviceScopeFactory, + IOptions configuration, + IDicomToolkit dicomToolkit, + IExternalAppDetailsRepository repository) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); + RoutingKey = $"{configuration.Value.Messaging.Topics.ExternalAppRequest}"; + Concurrency = _configuration.Value.Dicom.Scu.MaximumNumberOfAssociations; + } + + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var externalAppRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(externalAppRequest.ExportTaskId)) + { + _logger.ExportRequestAlreadyQueued(externalAppRequest.CorrelationId, externalAppRequest.ExportTaskId); + return; + } + + externalAppRequest.MessageId = eventArgs.Message.MessageId; + externalAppRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(externalAppRequest); + + ExportRequests.Add(externalAppRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + _logger.ErrorPostingExportJobToQueue(externalAppRequest.CorrelationId, externalAppRequest.ExportTaskId); + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + _logger.ExportRequestQueuedForProcessing(externalAppRequest.CorrelationId, externalAppRequest.MessageId, externalAppRequest.ExportTaskId); + } + } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + } + + protected override async Task ExportCompleteCallback(ExportRequestDataMessage exportRequestData) + { + try + { + var dicom = _dicomToolkit.Load(exportRequestData.FileContent); + dicom.Dataset.TryGetString(DicomTag.PatientID, out var patientID); + if (dicom.Dataset.TryGetString(DicomTag.StudyInstanceUID, out var studyInstUID)) + { + var (newStudyInstanceUID, newPatientId) = + await SaveInRepo(exportRequestData, studyInstUID, patientID ?? string.Empty) + .ConfigureAwait(false); + dicom.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, newStudyInstanceUID); + dicom.Dataset.AddOrUpdate(DicomTag.PatientID, newPatientId); + + using var ms = new MemoryStream(); + await dicom.SaveAsync(ms).ConfigureAwait(false); + exportRequestData.SetData(ms.ToArray()); + return; + } + throw new ExternalAppExeception("No StudyInstanceUID tag found"); + } + catch (Exception ex) + { + var errorMessage = $"Error reading DICOM file: {ex.Message}"; + _logger.ExportException(errorMessage, ex); + exportRequestData.SetFailed(FileExportStatus.UnsupportedDataType, errorMessage); + } + + } + + private async Task<(string, string)> SaveInRepo(ExportRequestDataMessage externalAppRequest, string studyinstanceId, string patientId) + { + var existing = (await _repository.GetAsync(studyinstanceId, new CancellationToken()).ConfigureAwait(false)) + ?.Find(e => e.WorkflowInstanceId == externalAppRequest.WorkflowInstanceId && + e.ExportTaskID == externalAppRequest.ExportTaskId); + if (existing is null) + { + var studyInstanceUidOutBound = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var PatientIdOutbound = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + await _repository.AddAsync(new ExternalAppDetails + { + StudyInstanceUid = studyinstanceId, + StudyInstanceUidOutBound = studyInstanceUidOutBound, + WorkflowInstanceId = externalAppRequest.WorkflowInstanceId, + ExportTaskID = externalAppRequest.ExportTaskId, + CorrelationId = externalAppRequest.CorrelationId, + DateTimeCreated = DateTime.Now, + DestinationFolder = externalAppRequest.FilePayloadId, + PatientId = patientId, + PatientIdOutBound = PatientIdOutbound + }, new CancellationToken()).ConfigureAwait(false); + _logger.SavingExternalAppData(studyinstanceId); + return (studyInstanceUidOutBound, PatientIdOutbound); + } + return (existing.StudyInstanceUidOutBound, existing.PatientIdOutBound); + } + + protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) + { + using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); + + foreach (var destinationName in exportRequestData.Destinations) + { + await HandleDesination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + } + + return exportRequestData; + } + } +} diff --git a/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs b/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs new file mode 100755 index 000000000..0b2860011 --- /dev/null +++ b/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Services.Export +{ + public class ExternalAppExeception : Exception + { + public ExternalAppExeception() + { + } + + public ExternalAppExeception(string message) : base(message) + { + } + + public ExternalAppExeception(string message, Exception innerException) : base(message, innerException) + { + } + + protected ExternalAppExeception(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs new file mode 100755 index 000000000..0e39217d1 --- /dev/null +++ b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs @@ -0,0 +1,164 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Api.Mllp; +using Monai.Deploy.Messaging.Common; +using Polly; + +namespace Monai.Deploy.InformaticsGateway.Services.Export +{ + internal class Hl7ExportService : ExportServiceBase + { + private readonly ILogger _logger; + private readonly InformaticsGatewayConfiguration _configuration; + private readonly IMllpService _mllpService; + + protected override ushort Concurrency { get; } + public override string RoutingKey { get; } + public override string ServiceName => "DICOM Export HL7 Service"; + + + public Hl7ExportService( + ILogger logger, + IServiceScopeFactory serviceScopeFactory, + IOptions configuration, + IDicomToolkit dicomToolkit) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _configuration = configuration.Value ?? throw new ArgumentNullException(nameof(configuration)); + + _mllpService = serviceScopeFactory.CreateScope().ServiceProvider.GetRequiredService(); + RoutingKey = $"{configuration.Value.Messaging.Topics.ExportHL7}"; + ExportCompleteTopic = $"{configuration.Value.Messaging.Topics.ExportHl7Complete}"; + Concurrency = _configuration.Dicom.Scu.MaximumNumberOfAssociations; + } + + + protected override Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + return BaseProcessMessage(eventArgs); + } + + + protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) + { + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary + { + { "ExportTaskId", exportRequestData.ExportTaskId }, + { "CorrelationId", exportRequestData.CorrelationId }, + { "Filename", exportRequestData.Filename } + }); + + foreach (var destinationName in exportRequestData.Destinations) + { + await HandleDesination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + } + + return exportRequestData; + } + + protected override async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + Guard.Against.Null(exportRequestData, nameof(exportRequestData)); + + var destination = await GetHL7Destination(exportRequestData, destinationName, cancellationToken).ConfigureAwait(false); + if (destination is null) + { + return; + } + + try + { + await ExecuteHl7Export(exportRequestData, destination!, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + HandleCStoreException(ex, exportRequestData); + } + } + + private async Task ExecuteHl7Export( + ExportRequestDataMessage exportRequestData, + HL7DestinationEntity destination, + CancellationToken cancellationToken) => await Policy + .Handle() + .WaitAndRetryAsync( + _configuration.Export.Retries.RetryDelays, + (exception, timeSpan, retryCount, context) => + { + _logger.HL7ExportErrorWithRetry(timeSpan, retryCount, exception); + }) + .ExecuteAsync(async () => + { + await _mllpService.SendMllp( + IPAddress.Parse(destination.HostIp), + destination.Port, Encoding.UTF8.GetString(exportRequestData.FileContent), + cancellationToken + ).ConfigureAwait(false); + }).ConfigureAwait(false); + + + private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(destinationName)) + { + throw new ConfigurationException("Export task does not have destination set."); + } + + using var scope = ServiceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); + var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); + + return destination is null + ? throw new ConfigurationException($"Specified destination '{destinationName}' does not exist.") + : destination; + } + + private async Task GetHL7Destination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) + { + try + { + return await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); + } + catch (ConfigurationException ex) + { + HandleCStoreException(ex, exportRequestData); + return null; + } + } + + protected override Task ExecuteOutputDataEngineCallback(ExportRequestDataMessage exportDataRequest) + { + return Task.FromResult(exportDataRequest); + } + + } +} diff --git a/src/InformaticsGateway/Services/Export/ScuExportService.cs b/src/InformaticsGateway/Services/Export/ScuExportService.cs index 1daec61eb..09d47a48a 100755 --- a/src/InformaticsGateway/Services/Export/ScuExportService.cs +++ b/src/InformaticsGateway/Services/Export/ScuExportService.cs @@ -16,32 +16,25 @@ */ using System; -using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; -using Ardalis.GuardClauses; -using FellowOakDicom; -using FellowOakDicom.Network; -using FellowOakDicom.Network.Client; +using System.Threading.Tasks.Dataflow; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; -using Polly; namespace Monai.Deploy.InformaticsGateway.Services.Export { internal class ScuExportService : ExportServiceBase { private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IOptions _configuration; - private readonly IDicomToolkit _dicomToolkit; protected override ushort Concurrency { get; } public override string RoutingKey { get; } @@ -52,20 +45,23 @@ public ScuExportService( IServiceScopeFactory serviceScopeFactory, IOptions configuration, IDicomToolkit dicomToolkit) - : base(logger, configuration, serviceScopeFactory) + : base(logger, configuration, serviceScopeFactory, dicomToolkit) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - _dicomToolkit = dicomToolkit ?? throw new ArgumentNullException(nameof(dicomToolkit)); RoutingKey = $"{configuration.Value.Messaging.Topics.ExportRequestPrefix}.{_configuration.Value.Dicom.Scu.AgentName}"; Concurrency = _configuration.Value.Dicom.Scu.MaximumNumberOfAssociations; } + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + await BaseProcessMessage(eventArgs); + } + protected override async Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken) { - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); + using var loggerScope = _logger.BeginScope(new Api.LoggingDataDictionary { { "ExportTaskId", exportRequestData.ExportTaskId }, { "CorrelationId", exportRequestData.CorrelationId }, { "Filename", exportRequestData.Filename } }); foreach (var destinationName in exportRequestData.Destinations) { @@ -74,159 +70,5 @@ protected override async Task ExportDataBlockCallback( return exportRequestData; } - - private async Task HandleDesination(ExportRequestDataMessage exportRequestData, string destinationName, CancellationToken cancellationToken) - { - Guard.Against.Null(exportRequestData, nameof(exportRequestData)); - - var manualResetEvent = new ManualResetEvent(false); - DestinationApplicationEntity? destination = null; - try - { - destination = await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); - } - catch (ConfigurationException ex) - { - _logger.ScuExportConfigurationError(ex.Message, ex); - exportRequestData.SetFailed(FileExportStatus.ConfigurationError, ex.Message); - return; - } - - try - { - await Policy - .Handle() - .WaitAndRetryAsync( - _configuration.Value.Export.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.DimseExportErrorWithRetry(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - var client = DicomClientFactory.Create( - destination.HostIp, - destination.Port, - false, - _configuration.Value.Dicom.Scu.AeTitle, - destination.AeTitle); - - client.AssociationAccepted += (sender, args) => _logger.ExportAssociationAccepted(); - client.AssociationRejected += (sender, args) => _logger.ExportAssociationRejected(); - client.AssociationReleased += (sender, args) => _logger.ExportAssociationReleased(); - client.ServiceOptions.LogDataPDUs = _configuration.Value.Dicom.Scu.LogDataPdus; - client.ServiceOptions.LogDimseDatasets = _configuration.Value.Dicom.Scu.LogDimseDatasets; - - client.NegotiateAsyncOps(); - if (await GenerateRequestsAsync(exportRequestData, client, manualResetEvent).ConfigureAwait(false)) - { - _logger.DimseExporting(destination.AeTitle, destination.HostIp, destination.Port); - await client.SendAsync(cancellationToken).ConfigureAwait(false); - manualResetEvent.WaitOne(); - _logger.DimseExportComplete(destination.AeTitle); - } - }).ConfigureAwait(false); - } - catch (Exception ex) - { - HandleCStoreException(ex, exportRequestData); - } - } - - private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) - { - if (string.IsNullOrWhiteSpace(destinationName)) - { - throw new ConfigurationException("Export task does not have destination set."); - } - - using var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService(); - var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); - - if (destination is null) - { - throw new ConfigurationException($"Specified destination '{destinationName}' does not exist."); - } - - return destination; - } - - private async Task GenerateRequestsAsync( - ExportRequestDataMessage exportRequestData, - IDicomClient client, - ManualResetEvent manualResetEvent) - { - DicomFile dicomFile; - try - { - dicomFile = _dicomToolkit.Load(exportRequestData.FileContent); - } - catch (Exception ex) - { - var errorMessage = $"Error reading DICOM file: {ex.Message}"; - _logger.ExportException(errorMessage, ex); - exportRequestData.SetFailed(FileExportStatus.UnsupportedDataType, errorMessage); - return false; - } - - try - { - var request = new DicomCStoreRequest(dicomFile); - - request.OnResponseReceived += (req, response) => - { - if (response.Status == DicomStatus.Success) - { - _logger.DimseExportInstanceComplete(); - } - else - { - var errorMessage = $"Failed to export with error {response.Status}"; - _logger.DimseExportInstanceError(response.Status); - exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); - } - manualResetEvent.Set(); - }; - - await client.AddRequestAsync(request).ConfigureAwait(false); - return true; - } - catch (Exception exception) - { - var errorMessage = $"Error while adding DICOM C-STORE request: {exception.Message}"; - _logger.DimseExportErrorAddingInstance(exception.Message, exception); - exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); - return false; - } - } - - private void HandleCStoreException(Exception ex, ExportRequestDataMessage exportRequestData) - { - var exception = ex; - - if (exception is AggregateException) - { - exception = exception.InnerException!; - } - - var errorMessage = $"Job failed with error: {exception.Message}."; - - if (exception is DicomAssociationAbortedException abortEx) - { - errorMessage = $"Association aborted with reason {abortEx.AbortReason}."; - } - else if (exception is DicomAssociationRejectedException rejectEx) - { - errorMessage = $"Association rejected with reason {rejectEx.RejectReason}."; - } - else if (exception is SocketException socketException) - { - errorMessage = $"Association aborted with error {socketException.Message}."; - } - - _logger.ExportException(errorMessage, ex); - exportRequestData.SetFailed(FileExportStatus.ServiceError, errorMessage); - } } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs b/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs new file mode 100755 index 000000000..ebb73e6aa --- /dev/null +++ b/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +{ + internal class Hl7SendException : Exception + { + public Hl7SendException() + { + } + + public Hl7SendException(string message) : base(message) + { + } + + public Hl7SendException(string message, Exception innerException) : base(message, innerException) + { + } + + protected Hl7SendException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs old mode 100644 new mode 100755 index e2d145b6e..3640227a2 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs @@ -18,7 +18,7 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Common; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { internal interface IMllpClientFactory { @@ -27,6 +27,7 @@ internal interface IMllpClientFactory internal class MllpClientFactory : IMllpClientFactory { - public IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger) => new MllpClient(client, configurations, logger); + public IMllpClient CreateClient(ITcpClientAdapter client, Hl7Configuration configurations, ILogger logger) + => new MllpClient(client, configurations, logger); } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs old mode 100644 new mode 100755 index 0a79c8d1f..520043b0d --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -23,12 +23,12 @@ using Ardalis.GuardClauses; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { internal sealed class MllpClient : IMllpClient { @@ -143,6 +143,7 @@ private async Task> ReceiveData(INetworkStream clientStream, Canc } } while (true); } + linkedCancellationTokenSource.Dispose(); return messages; } @@ -247,4 +248,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs new file mode 100755 index 000000000..7e9ed24d3 --- /dev/null +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -0,0 +1,165 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using FellowOakDicom; +using HL7.Dotnetcore; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Api.Mllp +{ + public sealed class MllpExtract : IMllpExtract + { + private readonly ILogger _logger; + private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; + private readonly IExternalAppDetailsRepository _externalAppDetailsRepository; + + public MllpExtract(IHl7ApplicationConfigRepository hl7ApplicationConfigRepository, IExternalAppDetailsRepository externalAppDetailsRepository, ILogger logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _hl7ApplicationConfigRepository = hl7ApplicationConfigRepository ?? throw new ArgumentNullException(nameof(hl7ApplicationConfigRepository)); + _externalAppDetailsRepository = externalAppDetailsRepository ?? throw new ArgumentNullException(nameof(externalAppDetailsRepository)); + } + + + public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message message, Hl7ApplicationConfigEntity configItem) + { + try + { + // extract data for the given fields + // Use Id to get record from Db + var details = await GetExtAppDetails(configItem, message).ConfigureAwait(false); + + if (details is null) + { + _logger.Hl7ExtAppDetailsNotFound(); + return message; + } + + // fill in meta data with workflowInstance and Task ID + // repopulate message with data from record + + meta.WorkflowInstanceId = details.WorkflowInstanceId; + meta.TaskId = details.ExportTaskID; + meta.ChangeCorrelationId(_logger, details.CorrelationId); + + if (string.IsNullOrEmpty(details.DestinationFolder) is false) + { + meta.File.DestinationFolderOverride = true; + meta.File.UploadPath = $"{details.DestinationFolder}/{meta.DataTypeDirectoryName}/{meta.Id}{Hl7FileStorageMetadata.FileExtension}"; + } + message = RepopulateMessage(configItem, details, message); + } + catch (Exception ex) + { + _logger.Hl7ExceptionThrow(ex); + } + return message; + } + + public async Task GetConfigItem(Message message) + { + // load the config + var config = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); + if (config == null) + { + _logger.Hl7NoConfig(); + return null; + } + _logger.Hl7ConfigLoaded($"Config: {config}"); + // get config for vendorId + var configItem = GetConfig(config, message); + if (configItem == null) + { + _logger.Hl7NoMatchingConfig(message.HL7Message); + return null; + } + return configItem; + } + + private async Task GetExtAppDetails(Hl7ApplicationConfigEntity hl7ApplicationConfigEntity, Message message) + { + var tagId = message.GetValue(hl7ApplicationConfigEntity.DataLink.Key); + var type = hl7ApplicationConfigEntity.DataLink.Value; + switch (type) + { + case DataLinkType.PatientId: + return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; + case DataLinkType.StudyInstanceUid: + return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; + default: + break; + } + + throw new Exception($"Invalid DataLinkType: {type}"); + } + + internal static Hl7ApplicationConfigEntity? GetConfig(List config, Message message) + { + foreach (var item in config) + { + var t = message.GetValue(item.SendingId.Key); + if (item.SendingId.Value == message.GetValue(item.SendingId.Key)) + { + return item; + } + } + return null; + } + + private Message RepopulateMessage(Hl7ApplicationConfigEntity config, ExternalAppDetails details, Message message) + { + foreach (var item in config.DataMapping) + { + var tag = DicomTag.Parse(item.Value); + // these are the only two fields we have at the point + if (tag == DicomTag.PatientID) + { + var oldvalue = message.GetValue(item.Key); + message.SetValue(item.Key, details.PatientId); + _logger.ChangingHl7Values(item.Key, oldvalue, details.PatientId); + if (message.HL7Message.Contains(oldvalue)) + { + var newMess = message.HL7Message.Replace(oldvalue, details.PatientId); + message = new Message(newMess); + message.ParseMessage(); + } + } + else if (tag == DicomTag.StudyInstanceUID) + { + var oldvalue = message.GetValue(item.Key); + message.SetValue(item.Key, details.StudyInstanceUid); + _logger.ChangingHl7Values(item.Key, oldvalue, details.StudyInstanceUid); + if (message.HL7Message.Contains(oldvalue)) + { + var newMess = message.HL7Message.Replace(oldvalue, details.StudyInstanceUid); + message = new Message(newMess); + message.ParseMessage(); + } + } + } + return message; + } + } +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 24f7269cf..7f247c1b2 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -18,26 +18,34 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO.Abstractions; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; +using HL7.Dotnetcore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.Messaging.Events; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal sealed class MllpService : IHostedService, IDisposable, IMonaiService + internal sealed class MllpService : IMllpService, IHostedService, IDisposable, IMonaiService { private const int SOCKET_OPERATION_CANCELLED = 125; private bool _disposedValue; @@ -51,6 +59,10 @@ internal sealed class MllpService : IHostedService, IDisposable, IMonaiService private readonly IOptions _configuration; private readonly IStorageInfoProvider _storageInfoProvider; private readonly ConcurrentDictionary _activeTasks; + private readonly IMllpExtract _mIIpExtract; + private readonly IInputHL7DataPlugInEngine _inputHL7DataPlugInEngine; + private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; + private DateTime _lastConfigRead = new(2000, 1, 1); public int ActiveConnections { @@ -84,7 +96,10 @@ public MllpService(IServiceScopeFactory serviceScopeFactory, _payloadAssembler = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadAssembler)); _fileSystem = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IFileSystem)); _storageInfoProvider = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IStorageInfoProvider)); + _mIIpExtract = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IMllpExtract)); _activeTasks = new ConcurrentDictionary(); + _inputHL7DataPlugInEngine = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IInputHL7DataPlugInEngine)); + _hl7ApplicationConfigRepository = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IHl7ApplicationConfigRepository)); } public Task StartAsync(CancellationToken cancellationToken) @@ -164,15 +179,25 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) Guard.Against.Null(client, nameof(client)); Guard.Against.Null(result, nameof(result)); + await ConfigurePlugInEngine().ConfigureAwait(false); + try { foreach (var message in result.Messages) { - var hl7Fileetadata = new Hl7FileStorageMetadata(client.ClientId.ToString(), DataService.HL7, client.ClientIp); - await hl7Fileetadata.SetDataStream(message.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); - var payloadId = await _payloadAssembler.Queue(client.ClientId.ToString(), hl7Fileetadata, new DataOrigin { DataService = DataService.HL7, Source = client.ClientIp, Destination = FileStorageMetadata.IpAddress() }).ConfigureAwait(false); - hl7Fileetadata.PayloadId = payloadId.ToString(); - _uploadQueue.Queue(hl7Fileetadata); + var newMessage = message; + var hl7Filemetadata = new Hl7FileStorageMetadata(client.ClientId.ToString(), DataService.HL7, client.ClientIp); + var configItem = await _mIIpExtract.GetConfigItem(message).ConfigureAwait(false); + if (configItem is not null) + { + await _inputHL7DataPlugInEngine.ExecutePlugInsAsync(message, hl7Filemetadata, configItem).ConfigureAwait(false); + newMessage = await _mIIpExtract.ExtractInfo(hl7Filemetadata, message, configItem).ConfigureAwait(false); + } + + await hl7Filemetadata.SetDataStream(newMessage.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); + var payloadId = await _payloadAssembler.Queue(client.ClientId.ToString(), hl7Filemetadata, new DataOrigin { DataService = DataService.HL7, Source = client.ClientIp, Destination = FileStorageMetadata.IpAddress() }).ConfigureAwait(false); + hl7Filemetadata.PayloadId ??= payloadId.ToString(); + _uploadQueue.Queue(hl7Filemetadata); } } catch (Exception ex) @@ -187,6 +212,32 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) } } + private async Task ConfigurePlugInEngine() + { + var configs = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); + if (configs is not null && configs.Max(c => c.LastModified) > _lastConfigRead) + { + var pluginAssemblies = new List(); + foreach (var config in configs.Where(p => p.PlugInAssemblies is not null && p.PlugInAssemblies.Count > 0)) + { + try + { + var addMe = config.PlugInAssemblies.Where(p => pluginAssemblies.Any(a => a == p) is false); + pluginAssemblies.AddRange(config.PlugInAssemblies.Where(p => pluginAssemblies.Any(a => a == p) is false)); + } + catch (Exception ex) + { + _logger.HL7PluginLoadingExceptions(ex); + } + } + if (pluginAssemblies.Any()) + { + _inputHL7DataPlugInEngine.Configure(pluginAssemblies); + } + } + _lastConfigRead = DateTime.UtcNow; + } + private void WaitUntilAvailable(int maximumNumberOfConnections) { var count = 0; @@ -216,6 +267,87 @@ private void Dispose(bool disposing) } } + public async Task SendMllp(IPAddress address, int port, string hl7Message, CancellationToken cancellationToken) + { + try + { + var body = $"{Resources.AsciiVT}{hl7Message}{Resources.AsciiFS}{Resources.AcsiiCR}"; + var sendMessageByteBuffer = Encoding.UTF8.GetBytes(body); + await WriteMessage(sendMessageByteBuffer, address, port).ConfigureAwait(false); + } + catch (ArgumentOutOfRangeException) + { + _logger.Hl7AckMissingStartOrEndCharacters(); + throw new Hl7SendException("ACK missing start or end characters"); + } + catch (Exception ex) + { + _logger.Hl7SendException(ex); + throw new Hl7SendException("Send exception"); + } + } + + private async Task WriteMessage(byte[] sendMessageByteBuffer, IPAddress address, int port) + { + + using var tcpClient = new TcpClient(); + + tcpClient.Connect(address, port); + + var networkStream = new NetworkStream(tcpClient.Client); + + if (networkStream.CanWrite) + { + networkStream.Write(sendMessageByteBuffer, 0, sendMessageByteBuffer.Length); + networkStream.Flush(); + } + else + { + _logger.Hl7ClientStreamNotWritable(); + throw new Hl7SendException("Client stream not writable"); + } + + _logger.Hl7MessageSent(Encoding.UTF8.GetString(sendMessageByteBuffer)); + + await EnsureAck(networkStream).ConfigureAwait(false); + } + + private async Task EnsureAck(NetworkStream networkStream) + { + using var s_cts = new CancellationTokenSource(); + s_cts.CancelAfter(_configuration.Value.Hl7.ClientTimeoutMilliseconds); + var buffer = new byte[2048]; + + // get the SentHl7Message + networkStream.ReadTimeout = 5000; + networkStream.WriteTimeout = 5000; + + // wait for responce + while (!s_cts.IsCancellationRequested && networkStream.DataAvailable == false) + { + await Task.Delay(20).ConfigureAwait(false); + } + + var bytesRead = await networkStream.ReadAsync(buffer).ConfigureAwait(false); + + if (bytesRead == 0 || s_cts.IsCancellationRequested) + { + throw new Hl7SendException("ACK message contains no ACK!"); + } + + var _rawHl7Messages = MessageHelper.ExtractMessages(Encoding.UTF8.GetString(buffer)); + foreach (var message in _rawHl7Messages) + { + var hl7Message = new Message(message); + hl7Message.ParseMessage(); + if (hl7Message.MessageStructure == "ACK") + { + return; + } + } + throw new Hl7SendException("ACK message contains no ACK!"); + } + public void Dispose() { // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method @@ -223,4 +355,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/Resources.cs b/src/InformaticsGateway/Services/HealthLevel7/Resources.cs old mode 100644 new mode 100755 index 62b0ed23a..f3b30bf3c --- a/src/InformaticsGateway/Services/HealthLevel7/Resources.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/Resources.cs @@ -22,6 +22,7 @@ internal static class Resources public const char AsciiVT = (char)0x0B; public const char AsciiFS = (char)0x1C; + public const char AcsiiCR = (char)13; public const string AcknowledgmentTypeNever = "NE"; public const string AcknowledgmentTypeError = "ER"; diff --git a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs index 23542973e..91e46723d 100755 --- a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs @@ -23,6 +23,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs old mode 100644 new mode 100755 index d794cecff..ad0fb4d37 --- a/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs +++ b/src/InformaticsGateway/Services/Http/DicomAssociationInfoController.cs @@ -23,7 +23,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; diff --git a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs new file mode 100755 index 000000000..194adb1ed --- /dev/null +++ b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs @@ -0,0 +1,239 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2020 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Net.Mime; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [ApiController] + [Route("config/hl7-destination")] + public class HL7DestinationController : ControllerBase + { + private readonly ILogger _logger; + private readonly IHL7DestinationEntityRepository _repository; + + public HL7DestinationController( + ILogger logger, + IHL7DestinationEntityRepository repository) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + } + + [HttpGet] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task>> Get() + { + try + { + return Ok(await _repository.ToListAsync(HttpContext.RequestAborted).ConfigureAwait(false)); + } + catch (Exception ex) + { + _logger.ErrorQueryingDatabase(ex); + return Problem(title: "Error querying database.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpGet("{name}")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ActionName(nameof(GetAeTitle))] + public async Task> GetAeTitle(string name) + { + try + { + var hl7DestinationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); + + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + return Ok(hl7DestinationEntity); + } + catch (Exception ex) + { + _logger.ErrorListingHL7DestinationEntities(ex); + return Problem(title: "Error querying HL7 destinations.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpGet("cecho/{name}")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [ProducesResponseType(StatusCodes.Status502BadGateway)] + [ActionName(nameof(GetAeTitle))] +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + public async Task CEcho(string name) +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + { + throw new NotImplementedException(); + } + + [HttpPost] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status409Conflict)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [Produces("application/json")] + public async Task> Create(HL7DestinationEntity item) + { + try + { + item.SetDefaultValues(); + item.SetAuthor(User, EditMode.Create); + + await ValidateCreateAsync(item).ConfigureAwait(false); + + await _repository.AddAsync(item, HttpContext.RequestAborted).ConfigureAwait(false); + _logger.HL7DestinationEntityAdded(item.AeTitle, item.HostIp); + return CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item); + } + catch (ObjectExistsException ex) + { + return Problem(title: "HL7 destination already exists", statusCode: StatusCodes.Status409Conflict, detail: ex.Message); + } + catch (ConfigurationException ex) + { + return Problem(title: "Validation error", statusCode: StatusCodes.Status400BadRequest, detail: ex.Message); + } + catch (Exception ex) + { + _logger.ErrorAddingHL7DestinationEntity(ex); + return Problem(title: "Error adding new HL7 destination", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpPut] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> Edit(HL7DestinationEntity? item) + { + try + { + if (item is null) + { + return NotFound(); + } + + var hl7DestinationEntity = await _repository.FindByNameAsync(item.Name, HttpContext.RequestAborted).ConfigureAwait(false); + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + item.SetDefaultValues(); + + hl7DestinationEntity.AeTitle = item.AeTitle; + hl7DestinationEntity.HostIp = item.HostIp; + hl7DestinationEntity.Port = item.Port; + hl7DestinationEntity.SetAuthor(User, EditMode.Update); + + await ValidateUpdateAsync(hl7DestinationEntity).ConfigureAwait(false); + + _ = _repository.UpdateAsync(hl7DestinationEntity, HttpContext.RequestAborted); + _logger.HL7DestinationEntityUpdated(item.Name, item.AeTitle, item.HostIp, item.Port); + return Ok(hl7DestinationEntity); + } + catch (ConfigurationException ex) + { + return Problem(title: "Validation error.", statusCode: (int)System.Net.HttpStatusCode.BadRequest, detail: ex.Message); + } + catch (Exception ex) + { + _logger.ErrorDeletingHL7DestinationEntity(ex); + return Problem(title: "Error updating HL7 destination.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + [HttpDelete("{name}")] + [Produces("application/json")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> Delete(string name) + { + try + { + var hl7DestinationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); + if (hl7DestinationEntity is null) + { + return NotFound(); + } + + await _repository.RemoveAsync(hl7DestinationEntity, HttpContext.RequestAborted).ConfigureAwait(false); + + _logger.HL7DestinationEntityDeleted(name.Substring(0, 10)); + return Ok(hl7DestinationEntity); + } + catch (Exception ex) + { + _logger.ErrorDeletingHL7DestinationEntity(ex); + return Problem(title: "Error deleting HL7 destination.", statusCode: StatusCodes.Status500InternalServerError, detail: ex.Message); + } + } + + private async Task ValidateCreateAsync(HL7DestinationEntity item) + { + if (await _repository.ContainsAsync(p => p.Name.Equals(item.Name), HttpContext.RequestAborted).ConfigureAwait(false)) + { + throw new ObjectExistsException($"A HL7 destination with the same name '{item.Name}' already exists."); + } + if (await _repository.ContainsAsync(p => p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) + { + throw new ObjectExistsException($"A HL7 destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); + } + if (!item.IsValid(out var validationErrors)) + { + throw new ConfigurationException(string.Join(Environment.NewLine, validationErrors)); + } + } + + private async Task ValidateUpdateAsync(HL7DestinationEntity item) + { + if (await _repository.ContainsAsync(p => !p.Name.Equals(item.Name) && p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) + { + throw new ObjectExistsException($"A HL7 destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); + } + if (!item.IsValid(out var validationErrors)) + { + throw new ConfigurationException(string.Join(Environment.NewLine, validationErrors)); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Http/HealthController.cs b/src/InformaticsGateway/Services/Http/HealthController.cs old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs new file mode 100755 index 000000000..4eadd2f5c --- /dev/null +++ b/src/InformaticsGateway/Services/Http/Hl7ApplicationConfigController.cs @@ -0,0 +1,171 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.DicomWeb; + +namespace Monai.Deploy.InformaticsGateway.Services.Http +{ + [ApiController] + [Route("configEntity/hl7-application")] + public class Hl7ApplicationConfigController : ApiControllerBase + { + private const string Endpoint = "configEntity/hl7-application"; + + private readonly ILogger _logger; + private readonly IHl7ApplicationConfigRepository _repository; + + public Hl7ApplicationConfigController(ILogger logger, + IHl7ApplicationConfigRepository repository) + { + _logger = logger; + _repository = repository; + } + + [HttpGet] + [Produces(ContentTypes.ApplicationJson)] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task Get() + { + var data = await _repository.GetAllAsync().ConfigureAwait(false); + return Ok(data); + } + + [HttpGet("{id}")] + [Produces(ContentTypes.ApplicationJson)] + [ProducesResponseType(typeof(Hl7ApplicationConfigEntity), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task Get(string id) + { + var data = await _repository.GetByIdAsync(id).ConfigureAwait(false); + if (data == null) + { + return NotFound(); + } + + return Ok(data); + } + + [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Delete(string id) + { + var data = await _repository.GetByIdAsync(id).ConfigureAwait(false); + if (data == null) + { + return NotFound(); + } + + try + { + var result = await _repository.DeleteAsync(id).ConfigureAwait(false); + return Ok(result); + } + catch (DatabaseException ex) + { + return Problem(title: "Database error removing HL7 Application Configuration.", statusCode: BadRequest, + detail: ex.Message); + } + catch (Exception ex) + { + return Problem(title: "Unknown error removing HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + + [HttpPut] + [Consumes(ContentTypes.ApplicationJson)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Put([FromBody] Hl7ApplicationConfigEntity configEntity) + { + if (configEntity == null) + { + return Problem(title: "Hl7ApplicationConfigEntity is null.", statusCode: BadRequest, detail: "Hl7ApplicationConfigEntity is null."); + } + + var errorMessages = configEntity.Validate().ToList(); + if (errorMessages.Any()) + { + var message = "Hl7ApplicationConfigEntity is invalid. " + string.Join(", ", errorMessages); + return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); + } + + try + { + await _repository.UpdateAsync(configEntity).ConfigureAwait(false); + return Ok(configEntity.Id); + } + catch (Exception ex) + { + _logger.PutHl7ApplicationConfigException(Endpoint, ex); + return Problem(title: "Error adding new HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + + [HttpPost] + [Consumes(ContentTypes.ApplicationJson)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Post([FromBody] Hl7ApplicationConfigEntity configEntity) + { + if (configEntity == null) + { + return Problem(title: "Hl7ApplicationConfigEntity is null.", statusCode: BadRequest, detail: "Hl7ApplicationConfigEntity is null."); + } + + var errorMessages = configEntity.Validate().ToList(); + if (errorMessages.Any()) + { + var message = "Hl7ApplicationConfigEntity is invalid. " + string.Join(", ", errorMessages); + return Problem(title: "Validation Failure.", statusCode: BadRequest, detail: message); + } + + try + { + var result = await _repository.CreateAsync(configEntity).ConfigureAwait(false); + if (result is null) + { + return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, + detail: "configEntity not found."); + } + return Ok(result); + } + catch (DatabaseException ex) + { + return Problem(title: "Database error updating HL7 Application Configuration.", statusCode: BadRequest, + detail: ex.Message); + } + catch (Exception ex) + { + return Problem(title: "Unknown error updating HL7 Application Configuration.", + statusCode: InternalServerError, detail: ex.Message); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs index 22810f4a3..fd967c01a 100755 --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -24,6 +24,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/src/InformaticsGateway/Services/Http/Startup.cs b/src/InformaticsGateway/Services/Http/Startup.cs index dfc6dc5e1..6f0779ebd 100755 --- a/src/InformaticsGateway/Services/Http/Startup.cs +++ b/src/InformaticsGateway/Services/Http/Startup.cs @@ -44,10 +44,8 @@ public Startup(IConfiguration configuration) public IConfiguration Configuration { get; } -#pragma warning disable CA1822 // Mark members as static public void ConfigureServices(IServiceCollection services) -#pragma warning restore CA1822 // Mark members as static { services.AddHttpContextAccessor(); services.AddControllers(opts => diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index a858a84d1..4946bc6ac 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -24,12 +24,14 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.Messaging.Common; @@ -48,6 +50,7 @@ internal class ApplicationEntityHandler : IDisposable, IApplicationEntityHandler private readonly IObjectUploadQueue _uploadQueue; private readonly IFileSystem _fileSystem; private readonly IInputDataPlugInEngine _pluginEngine; + private readonly IExternalAppDetailsRepository _externalAppDetailsRepository; private MonaiApplicationEntity? _configuration; private DicomJsonOptions _dicomJsonOptions; private bool _validateDicomValueOnJsonSerialization; @@ -56,7 +59,8 @@ internal class ApplicationEntityHandler : IDisposable, IApplicationEntityHandler public ApplicationEntityHandler( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options, + IExternalAppDetailsRepository externalAppDetailsRepository) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); @@ -67,6 +71,7 @@ public ApplicationEntityHandler( _uploadQueue = _serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IObjectUploadQueue)); _fileSystem = _serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IFileSystem)); _pluginEngine = _serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IInputDataPlugInEngine)); + _externalAppDetailsRepository = externalAppDetailsRepository ?? throw new ServiceNotFoundException(nameof(externalAppDetailsRepository)); } public void Configure(MonaiApplicationEntity monaiApplicationEntity, DicomJsonOptions dicomJsonOptions, bool validateDicomValuesOnJsonSerialization) @@ -89,7 +94,7 @@ public void Configure(MonaiApplicationEntity monaiApplicationEntity, DicomJsonOp } } - public async Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids) + public async Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids, ScpInputTypeEnum type) { if (_configuration is null) { @@ -107,8 +112,21 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string _logger.InstanceIgnoredWIthMatchingSopClassUid(request.SOPClassUID.UID); return string.Empty; } + ExternalAppDetails? storedDetails; + + + + var dicomInfo = new DicomFileStorageMetadata( + associationId.ToString(), + uids.Identifier, + uids.StudyInstanceUid, + uids.SeriesInstanceUid, + uids.SopInstanceUid, + DataService.DIMSE, + callingAeTitle, + calledAeTitle); + - var dicomInfo = new DicomFileStorageMetadata(associationId.ToString(), uids.Identifier, uids.StudyInstanceUid, uids.SeriesInstanceUid, uids.SopInstanceUid, DataService.DIMSE, callingAeTitle, calledAeTitle); if (_configuration.Workflows.Any()) { @@ -128,6 +146,24 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string using var scope = _logger.BeginScope(new Api.LoggingDataDictionary() { { "CorrelationId", dicomInfo.CorrelationId } }); + + if (type == ScpInputTypeEnum.ExternalAppReturn) + { + var uid = request.Dataset.GetSingleValue(DicomTag.StudyInstanceUID); + storedDetails = await _externalAppDetailsRepository + .GetByStudyIdOutboundAsync(uid, new System.Threading.CancellationToken()) + .ConfigureAwait(false); + if (storedDetails is null) + { + _logger.FailedToFindStoredExtAppDetails(uid); + } + RetrieveExternalAppDetails(storedDetails, dicomInfo); + dicomInfo.SetupGivenFilePaths(storedDetails?.DestinationFolder); + request.Dataset.AddOrUpdate(DicomTag.StudyInstanceUID, storedDetails?.StudyInstanceUid); + request.Dataset.AddOrUpdate(DicomTag.PatientID, storedDetails?.PatientId); + } + + dicomInfo = (result.Item2 as DicomFileStorageMetadata)!; var dicomFile = result.Item1; await dicomInfo.SetDataStreams(dicomFile, dicomFile.ToJson(_dicomJsonOptions, _validateDicomValueOnJsonSerialization), _options.Value.Storage.TemporaryDataStorage, _fileSystem, _options.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); @@ -143,6 +179,19 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string return dicomInfo.PayloadId; } + private void RetrieveExternalAppDetails(ExternalAppDetails? storedDetails, DicomFileStorageMetadata dicomInfo) + { + if (storedDetails is null) + { + return; + } + dicomInfo.ChangeCorrelationId(_logger, storedDetails.CorrelationId); + dicomInfo.WorkflowInstanceId = storedDetails.WorkflowInstanceId; + dicomInfo.TaskId = storedDetails.ExportTaskID; + dicomInfo.SetStudyInstanceUid(storedDetails.StudyInstanceUid); + //dicomInfo.DestinationFolderNeil = storedDetails.DestinationFolder!; + } + private bool AcceptsSopClass(string sopClassUid) { Guard.Against.NullOrWhiteSpace(sopClassUid, nameof(sopClassUid)); diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs index 00287b529..4e6aaf951 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs @@ -25,10 +25,12 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Storage; namespace Monai.Deploy.InformaticsGateway.Services.Scp @@ -91,7 +93,7 @@ private void OnApplicationStopping() _unsubscriberForMonaiAeChangedNotificationService.Dispose(); } - public async Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId) + public async Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type) { Guard.Against.Null(request, nameof(request)); @@ -107,10 +109,10 @@ public async Task HandleCStoreRequest(DicomCStoreRequest request, string throw new InsufficientStorageAvailableException($"Insufficient storage available. Available storage space: {_storageInfoProvider.AvailableFreeSpace:D}"); } - return await HandleInstance(request, calledAeTitle, callingAeTitle, associationId).ConfigureAwait(false); + return await HandleInstance(request, calledAeTitle, callingAeTitle, associationId, type).ConfigureAwait(false); } - private async Task HandleInstance(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId) + private async Task HandleInstance(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type) { var uids = _dicomToolkit.GetStudySeriesSopInstanceUids(request.File); @@ -124,7 +126,7 @@ private async Task HandleInstance(DicomCStoreRequest request, string cal { _logger.InstanceInformation(uids.StudyInstanceUid, uids.SeriesInstanceUid); - return await _aeTitles[calledAeTitle].HandleInstanceAsync(request, calledAeTitle, callingAeTitle, associationId, uids).ConfigureAwait(false); + return await _aeTitles[calledAeTitle].HandleInstanceAsync(request, calledAeTitle, callingAeTitle, associationId, uids, type).ConfigureAwait(false); } } diff --git a/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs b/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs new file mode 100755 index 000000000..aa6f1e459 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs @@ -0,0 +1,94 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Logging; + + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + internal class ExternalAppScpService : ScpServiceBase + { + private readonly IServiceScope _serviceScope; + private readonly ILogger _logger; + private readonly ILogger _scpServiceInternalLogger; + private readonly IOptions _configuration; + private readonly IApplicationEntityManager _associationDataProvider; + + public override string ServiceName => "External App DICOM SCP Service"; + + public ExternalAppScpService(IServiceScopeFactory serviceScopeFactory, + IApplicationEntityManager applicationEntityManager, + IHostApplicationLifetime appLifetime, + IOptions configuration) : base(serviceScopeFactory, applicationEntityManager, appLifetime, configuration) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(applicationEntityManager, nameof(applicationEntityManager)); + Guard.Against.Null(appLifetime, nameof(appLifetime)); + Guard.Against.Null(configuration, nameof(configuration)); + + _associationDataProvider = applicationEntityManager; + + _serviceScope = serviceScopeFactory.CreateScope(); + var logginFactory = _serviceScope.ServiceProvider.GetService(); + + _logger = logginFactory!.CreateLogger(); + _scpServiceInternalLogger = logginFactory!.CreateLogger(); + _configuration = configuration; + } + + public override void ServiceStart() + { + var ScpPort = _configuration.Value.Dicom.Scp.ExternalAppPort; + try + { + _logger.AddingScpListener(ServiceName, ScpPort); + Server = DicomServerFactory.Create( + NetworkManager.IPv4Any, + ScpPort, + logger: _scpServiceInternalLogger, + userState: _associationDataProvider); + + Server.Options.IgnoreUnsupportedTransferSyntaxChange = true; + Server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; + Server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; + + if (Server.Exception != null) + { + _logger.ScpListenerInitializationFailure(); + throw Server.Exception; + } + + Status = ServiceStatus.Running; + _logger.ScpListeningOnPort(ServiceName, ScpPort); + } + catch (System.Exception ex) + { + Status = ServiceStatus.Cancelled; + _logger.ServiceFailedToStart(ServiceName, ex); + AppLifetime.StopApplication(); + } + + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs new file mode 100755 index 000000000..8a41f2c54 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ExternalAppScpServiceInternal.cs @@ -0,0 +1,71 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Text; +using System.Threading.Tasks; +using FellowOakDicom.Network; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Logging; + + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + internal class ExternalAppScpServiceInternal : ScpServiceInternalBase + { + + private readonly DicomAssociationInfo _associationInfo; + private readonly ILogger _logger; + + public ExternalAppScpServiceInternal(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dicomServiceDependencies) + : base(stream, fallbackEncoding, logger, dicomServiceDependencies) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _associationInfo = new DicomAssociationInfo(); + } + public override async Task OnCStoreRequestAsync(DicomCStoreRequest request) + { + try + { + _logger?.TransferSyntaxUsed(request.TransferSyntax); + var payloadId = await AssociationDataProvider!.HandleCStoreRequest(request, Association.CalledAE, Association.CallingAE, AssociationId, Common.ScpInputTypeEnum.ExternalAppReturn).ConfigureAwait(false); + _associationInfo.FileReceived(payloadId); + return new DicomCStoreResponse(request, DicomStatus.Success); + } + catch (InsufficientStorageAvailableException ex) + { + _logger?.CStoreFailedDueToLowStorageSpace(ex); + _associationInfo.Errors = $"Failed to store file due to low disk space: {ex}"; + return new DicomCStoreResponse(request, DicomStatus.ResourceLimitation); + } + catch (System.IO.IOException ex) when ((ex.HResult & 0xFFFF) == Constants.ERROR_HANDLE_DISK_FULL || (ex.HResult & 0xFFFF) == Constants.ERROR_DISK_FULL) + { + _logger?.CStoreFailedWithNoSpace(ex); + _associationInfo.Errors = $"Failed to store file due to low disk space: {ex}"; + return new DicomCStoreResponse(request, DicomStatus.StorageStorageOutOfResources); + } + catch (Exception ex) + { + _logger?.CStoreFailed(ex); + _associationInfo.Errors = $"Failed to store file: {ex}"; + return new DicomCStoreResponse(request, DicomStatus.ProcessingFailure); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs old mode 100644 new mode 100755 index 0d3c5ed2d..f82e2d08e --- a/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/IApplicationEntityHandler.cs @@ -17,9 +17,10 @@ using System; using System.Threading.Tasks; using FellowOakDicom.Network; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common; namespace Monai.Deploy.InformaticsGateway.Services.Scp { @@ -27,6 +28,6 @@ internal interface IApplicationEntityHandler { void Configure(MonaiApplicationEntity monaiApplicationEntity, DicomJsonOptions dicomJsonOptions, bool validateDicomValuesOnJsonSerialization); - Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids); + Task HandleInstanceAsync(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, StudySerieSopUids uids, ScpInputTypeEnum type); } } diff --git a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs old mode 100644 new mode 100755 index 7c42996c5..d8c224a04 --- a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs @@ -20,6 +20,7 @@ using FellowOakDicom.Network; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common; namespace Monai.Deploy.InformaticsGateway.Services.Scp { @@ -35,7 +36,7 @@ public interface IApplicationEntityManager /// Called AE Title to be associated with the call. /// Calling AE Title to be associated with the call. /// Unique association ID. - Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId); + Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type = ScpInputTypeEnum.WorkflowTrigger); /// /// Checks if a MONAI AET is configured. diff --git a/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs b/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs old mode 100644 new mode 100755 index 2de4fccb8..adf544c61 --- a/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs +++ b/src/InformaticsGateway/Services/Scp/IMonaiAeChangedNotificationService.cs @@ -16,7 +16,7 @@ */ using System; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.Services.Scp { diff --git a/src/InformaticsGateway/Services/Scp/ScpService.cs b/src/InformaticsGateway/Services/Scp/ScpService.cs old mode 100644 new mode 100755 index aae6f5db6..85c755b4a --- a/src/InformaticsGateway/Services/Scp/ScpService.cs +++ b/src/InformaticsGateway/Services/Scp/ScpService.cs @@ -1,6 +1,5 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * Copyright 2019-2021 NVIDIA Corporation +/* + * Copyright 2021-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,45 +14,28 @@ * limitations under the License. */ -using System; -using System.Threading; -using System.Threading.Tasks; using Ardalis.GuardClauses; -using FellowOakDicom; -using FellowOakDicom.Network; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Services.Common; - -using FoDicomNetwork = FellowOakDicom.Network; namespace Monai.Deploy.InformaticsGateway.Services.Scp { - internal sealed class ScpService : IHostedService, IDisposable, IMonaiService + internal class ScpService : ScpServiceBase { -#pragma warning disable S2223 // Non-constant static fields should not be visible - public static int ActiveConnections = 0; -#pragma warning restore S2223 // Non-constant static fields should not be visible - private readonly IServiceScope _serviceScope; - private readonly IApplicationEntityManager _associationDataProvider; private readonly ILogger _logger; - private readonly ILogger _scpServiceInternalLogger; - private readonly IHostApplicationLifetime _appLifetime; private readonly IOptions _configuration; - private FoDicomNetwork.IDicomServer? _server; - public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; - public string ServiceName => "DICOM SCP Service"; + + public override string ServiceName => "DICOM SCP Service"; public ScpService(IServiceScopeFactory serviceScopeFactory, IApplicationEntityManager applicationEntityManager, IHostApplicationLifetime appLifetime, - IOptions configuration) + IOptions configuration) : base(serviceScopeFactory, applicationEntityManager, appLifetime, configuration) { Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); Guard.Against.Null(applicationEntityManager, nameof(applicationEntityManager)); @@ -61,66 +43,16 @@ public ScpService(IServiceScopeFactory serviceScopeFactory, Guard.Against.Null(configuration, nameof(configuration)); _serviceScope = serviceScopeFactory.CreateScope(); - _associationDataProvider = applicationEntityManager; - var logginFactory = _serviceScope.ServiceProvider.GetService(); _logger = logginFactory!.CreateLogger(); - _scpServiceInternalLogger = logginFactory!.CreateLogger(); - _appLifetime = appLifetime; _configuration = configuration; - _ = DicomDictionary.Default; - } - - public void Dispose() - { - _serviceScope.Dispose(); - _server?.Dispose(); - GC.SuppressFinalize(this); - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.ScpServiceLoading(_configuration.Value.Dicom.Scp.Port); - - try - { - _logger.ServiceStarting(ServiceName); - _server = DicomServerFactory.Create( - NetworkManager.IPv4Any, - _configuration.Value.Dicom.Scp.Port, - logger: _scpServiceInternalLogger, - userState: _associationDataProvider); - - _server.Options.IgnoreUnsupportedTransferSyntaxChange = true; - _server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; - _server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; - - if (_server.Exception != null) - { - _logger.ScpListenerInitializationFailure(); - throw _server.Exception; - } - - Status = ServiceStatus.Running; - _logger.ScpListeningOnPort(_configuration.Value.Dicom.Scp.Port); - } - catch (System.Exception ex) - { - Status = ServiceStatus.Cancelled; - _logger.ServiceFailedToStart(ServiceName, ex); - _appLifetime.StopApplication(); - } - return Task.CompletedTask; } - public Task StopAsync(CancellationToken cancellationToken) + public override void ServiceStart() { - _logger.ServiceStopping(ServiceName); - _server?.Stop(); - _server?.Dispose(); - Status = ServiceStatus.Stopped; - return Task.CompletedTask; + _logger.AddingScpListener(ServiceName, _configuration.Value.Dicom.Scp.Port); + ServiceStartBase(_configuration.Value.Dicom.Scp.Port); } } } diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs b/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs new file mode 100755 index 000000000..832ebec13 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs @@ -0,0 +1,131 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Logging; +using Monai.Deploy.InformaticsGateway.Services.Common; + +using FoDicomNetwork = FellowOakDicom.Network; + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + internal abstract class ScpServiceBase : IHostedService, IDisposable, IMonaiService + { +#pragma warning disable S2223 // Non-constant static fields should not be visible + public static int ActiveConnections = 0; +#pragma warning restore S2223 // Non-constant static fields should not be visible + + private readonly IServiceScope _serviceScope; + private readonly IApplicationEntityManager _associationDataProvider; + private readonly ILogger _logger; + private readonly ILogger _scpServiceInternalLogger; + protected readonly IHostApplicationLifetime AppLifetime; + private readonly IOptions _configuration; + protected FoDicomNetwork.IDicomServer? Server; + public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; + public abstract string ServiceName { get; } + + public ScpServiceBase(IServiceScopeFactory serviceScopeFactory, + IApplicationEntityManager applicationEntityManager, + IHostApplicationLifetime appLifetime, + IOptions configuration) + { + Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory)); + Guard.Against.Null(applicationEntityManager, nameof(applicationEntityManager)); + Guard.Against.Null(appLifetime, nameof(appLifetime)); + Guard.Against.Null(configuration, nameof(configuration)); + + _serviceScope = serviceScopeFactory.CreateScope(); + + var logginFactory = _serviceScope.ServiceProvider.GetService(); + + _logger = logginFactory!.CreateLogger(); + _scpServiceInternalLogger = logginFactory!.CreateLogger(); + _associationDataProvider = applicationEntityManager; + AppLifetime = appLifetime; + _configuration = configuration; + _ = DicomDictionary.Default; + } + + public void Dispose() + { + _serviceScope.Dispose(); + Server?.Dispose(); + GC.SuppressFinalize(this); + } + + public Task StartAsync(CancellationToken cancellationToken) + { + ServiceStart(); + return Task.CompletedTask; + } + + public abstract void ServiceStart(); + + public Task StopAsync(CancellationToken cancellationToken) + { + _logger.ServiceStopping(ServiceName); + Server?.Stop(); + Server?.Dispose(); + Status = ServiceStatus.Stopped; + return Task.CompletedTask; + } + + public void ServiceStartBase(int ScpPort) + { + try + { + _logger.ServiceStarting(ServiceName); + Server = DicomServerFactory.Create( + NetworkManager.IPv4Any, + ScpPort, + logger: _scpServiceInternalLogger, + userState: _associationDataProvider); + + Server.Options.IgnoreUnsupportedTransferSyntaxChange = true; + Server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; + Server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; + + if (Server.Exception != null) + { + _logger.ScpListenerInitializationFailure(); + throw Server.Exception; + } + + Status = ServiceStatus.Running; + _logger.ScpListeningOnPort(ServiceName, ScpPort); + } + catch (System.Exception ex) + { + Status = ServiceStatus.Cancelled; + _logger.ServiceFailedToStart(ServiceName, ex); + AppLifetime.StopApplication(); + } + } + } +} diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs index 0ee55a106..a19ef3825 100755 --- a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs @@ -1,5 +1,5 @@ -/* - * Copyright 2021-2022 MONAI Consortium +/* + * Copyright 2021-2023 MONAI Consortium * Copyright 2019-2021 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,35 +16,26 @@ */ using System; -using System.Linq; using System.Text; -using System.Threading; using System.Threading.Tasks; -using FellowOakDicom; using FellowOakDicom.Network; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; -using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; namespace Monai.Deploy.InformaticsGateway.Services.Scp { - /// - /// A new instance of ScpServiceInternal is created for every new association. - /// - internal class ScpServiceInternal : - DicomService, - IDicomServiceProvider, - IDicomCEchoProvider, - IDicomCStoreProvider + internal class ScpServiceInternal : ScpServiceInternalBase { + + private readonly DicomAssociationInfo _associationInfo; private readonly ILogger _logger; - private IApplicationEntityManager? _associationDataProvider; - private IDisposable? _loggerScope; - private Guid _associationId; - private DateTimeOffset? _associationReceived; + //private IApplicationEntityManager? _associationDataProvider; + //private IDisposable? _loggerScope; + //private Guid _associationId; + //private DateTimeOffset? _associationReceived; public ScpServiceInternal(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dicomServiceDependencies) : base(stream, fallbackEncoding, logger, dicomServiceDependencies) @@ -52,42 +43,12 @@ public ScpServiceInternal(INetworkStream stream, Encoding fallbackEncoding, ILog _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _associationInfo = new DicomAssociationInfo(); } - - public Task OnCEchoRequestAsync(DicomCEchoRequest request) - { - _logger?.CEchoReceived(); - return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success)); - } - - public void OnConnectionClosed(Exception exception) - { - if (exception != null) - { - _logger?.ConnectionClosedWithException(exception); - } - - _loggerScope?.Dispose(); - Interlocked.Decrement(ref ScpService.ActiveConnections); - - try - { - var repo = _associationDataProvider!.GetService(); - _associationInfo.Disconnect(); - repo?.AddAsync(_associationInfo).Wait(); - _logger?.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); - } - catch (Exception ex) - { - _logger?.ErrorSavingDicomAssociationInfo(_associationId, ex); - } - } - - public async Task OnCStoreRequestAsync(DicomCStoreRequest request) + public override async Task OnCStoreRequestAsync(DicomCStoreRequest request) { try { _logger?.TransferSyntaxUsed(request.TransferSyntax); - var payloadId = await _associationDataProvider!.HandleCStoreRequest(request, Association.CalledAE, Association.CallingAE, _associationId).ConfigureAwait(false); + var payloadId = await AssociationDataProvider!.HandleCStoreRequest(request, Association.CalledAE, Association.CallingAE, AssociationId, Common.ScpInputTypeEnum.WorkflowTrigger).ConfigureAwait(false); _associationInfo.FileReceived(payloadId); return new DicomCStoreResponse(request, DicomStatus.Success); } @@ -111,123 +72,5 @@ public async Task OnCStoreRequestAsync(DicomCStoreRequest r } } - public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e) - { - _logger?.CStoreFailed(e); - _associationInfo.Errors = $"Failed to store file: {e}"; - return Task.CompletedTask; - } - - public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason) - { - _logger?.CStoreAbort(source, reason); - _associationInfo.Errors = $"{source} - {reason}"; - } - - /// - /// Start timer only if a receive association release request is received. - /// - /// - public Task OnReceiveAssociationReleaseRequestAsync() - { - var associationElapsed = TimeSpan.Zero; - if (_associationReceived.HasValue) - { - associationElapsed = DateTimeOffset.UtcNow.Subtract(_associationReceived.Value); - } - - _logger?.CStoreAssociationReleaseRequest(associationElapsed); - return SendAssociationReleaseResponseAsync(); - } - - public async Task OnReceiveAssociationRequestAsync(DicomAssociation association) - { - Interlocked.Increment(ref ScpService.ActiveConnections); - _associationReceived = DateTimeOffset.UtcNow; - _associationDataProvider = (UserState as IApplicationEntityManager)!; - - if (_associationDataProvider is null) - { - _associationInfo.Errors = $"Internal error: association data provider not found."; - throw new ServiceException($"{nameof(UserState)} must be an instance of IAssociationDataProvider"); - } - - _associationId = Guid.NewGuid(); - var associationIdStr = $"#{_associationId} {association.RemoteHost}:{association.RemotePort}"; - - _loggerScope = _logger!.BeginScope(new LoggingDataDictionary { { "Association", associationIdStr } }); - _logger.CStoreAssociationReceived(association.RemoteHost, association.RemotePort); - - _associationInfo.CallingAeTitle = association.CallingAE; - _associationInfo.CalledAeTitle = association.CalledAE; - _associationInfo.RemoteHost = association.RemoteHost; - _associationInfo.RemotePort = association.RemotePort; - _associationInfo.CorrelationId = _associationId.ToString(); - - if (!await IsValidSourceAeAsync(association.CallingAE, association.RemoteHost).ConfigureAwait(false)) - { - _associationInfo.Errors = $"Invalid source. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.CallingAENotRecognized).ConfigureAwait(false); - } - - if (!await IsValidCalledAeAsync(association.CalledAE).ConfigureAwait(false)) - { - _associationInfo.Errors = "Invalid MONAI AE Title. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.CalledAENotRecognized).ConfigureAwait(false); - } - - foreach (var pc in association.PresentationContexts) - { - if (pc.AbstractSyntax == DicomUID.Verification) - { - if (!_associationDataProvider.Configuration.Value.Dicom.Scp.EnableVerification) - { - _associationInfo.Errors = "Verification service disabled. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - _logger?.VerificationServiceDisabled(); - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.ApplicationContextNotSupported - ).ConfigureAwait(false); - } - pc.AcceptTransferSyntaxes(_associationDataProvider.Configuration.Value.Dicom.Scp.VerificationServiceTransferSyntaxes.ToDicomTransferSyntaxArray()); - } - else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None) - { - if (!_associationDataProvider.CanStore) - { - _associationInfo.Errors = "Disk pressure. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; - await SendAssociationRejectAsync( - DicomRejectResult.Permanent, - DicomRejectSource.ServiceUser, - DicomRejectReason.NoReasonGiven).ConfigureAwait(false); - } - // Accept any proposed TS - pc.AcceptTransferSyntaxes(pc.GetTransferSyntaxes().ToArray()); - } - } - - await SendAssociationAcceptAsync(association).ConfigureAwait(false); - } - - private async Task IsValidCalledAeAsync(string calledAe) - { - return await _associationDataProvider!.IsAeTitleConfiguredAsync(calledAe).ConfigureAwait(false); - } - - private async Task IsValidSourceAeAsync(string callingAe, string host) - { - if (!_associationDataProvider!.Configuration.Value.Dicom.Scp.RejectUnknownSources) return true; - - return await _associationDataProvider.IsValidSourceAsync(callingAe, host).ConfigureAwait(false); - } } } diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs new file mode 100755 index 000000000..3548aaaf4 --- /dev/null +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternalBase.cs @@ -0,0 +1,207 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Services.Scp +{ + /// + /// A new instance of ScpServiceInternal is created for every new association. + /// + internal abstract class ScpServiceInternalBase : + DicomService, + IDicomServiceProvider, + IDicomCEchoProvider, + IDicomCStoreProvider + { + private readonly DicomAssociationInfo _associationInfo; + private readonly ILogger _logger; + protected IApplicationEntityManager? AssociationDataProvider; + private IDisposable? _loggerScope; + protected Guid AssociationId; + private DateTimeOffset? _associationReceived; + + public ScpServiceInternalBase(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dicomServiceDependencies) + : base(stream, fallbackEncoding, logger, dicomServiceDependencies) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _associationInfo = new DicomAssociationInfo(); + } + + public Task OnCEchoRequestAsync(DicomCEchoRequest request) + { + _logger?.CEchoReceived(); + return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success)); + } + + public void OnConnectionClosed(Exception exception) + { + if (exception != null) + { + _logger?.ConnectionClosedWithException(exception); + } + + _loggerScope?.Dispose(); + Interlocked.Decrement(ref ScpServiceBase.ActiveConnections); + + try + { + var repo = AssociationDataProvider!.GetService(); + _associationInfo.Disconnect(); + repo?.AddAsync(_associationInfo).Wait(); + _logger?.ConnectionClosed(_associationInfo.CorrelationId, _associationInfo.CallingAeTitle, _associationInfo.CalledAeTitle, _associationInfo.Duration.TotalSeconds); + } + catch (Exception ex) + { + _logger?.ErrorSavingDicomAssociationInfo(AssociationId, ex); + } + } + + public abstract Task OnCStoreRequestAsync(DicomCStoreRequest request); + + public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e) + { + _logger?.CStoreFailed(e); + _associationInfo.Errors = $"Failed to store file: {e}"; + return Task.CompletedTask; + } + + public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason) + { + _logger?.CStoreAbort(source, reason); + _associationInfo.Errors = $"{source} - {reason}"; + } + + /// + /// Start timer only if a receive association release request is received. + /// + /// + public Task OnReceiveAssociationReleaseRequestAsync() + { + var associationElapsed = TimeSpan.Zero; + if (_associationReceived.HasValue) + { + associationElapsed = DateTimeOffset.UtcNow.Subtract(_associationReceived.Value); + } + + _logger?.CStoreAssociationReleaseRequest(associationElapsed); + return SendAssociationReleaseResponseAsync(); + } + + public async Task OnReceiveAssociationRequestAsync(DicomAssociation association) + { + Interlocked.Increment(ref ScpServiceBase.ActiveConnections); + _associationReceived = DateTimeOffset.UtcNow; + AssociationDataProvider = (UserState as IApplicationEntityManager)!; + + if (AssociationDataProvider is null) + { + _associationInfo.Errors = $"Internal error: association data provider not found."; + throw new ServiceException($"{nameof(UserState)} must be an instance of IAssociationDataProvider"); + } + + AssociationId = Guid.NewGuid(); + var associationIdStr = $"#{AssociationId} {association.RemoteHost}:{association.RemotePort}"; + + _loggerScope = _logger!.BeginScope(new LoggingDataDictionary { { "Association", associationIdStr } }); + _logger.CStoreAssociationReceived(association.RemoteHost, association.RemotePort); + + _associationInfo.CallingAeTitle = association.CallingAE; + _associationInfo.CalledAeTitle = association.CalledAE; + _associationInfo.RemoteHost = association.RemoteHost; + _associationInfo.RemotePort = association.RemotePort; + _associationInfo.CorrelationId = AssociationId.ToString(); + + if (!await IsValidSourceAeAsync(association.CallingAE, association.RemoteHost).ConfigureAwait(false)) + { + _associationInfo.Errors = $"Invalid source. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.CallingAENotRecognized).ConfigureAwait(false); + } + + if (!await IsValidCalledAeAsync(association.CalledAE).ConfigureAwait(false)) + { + _associationInfo.Errors = "Invalid MONAI AE Title. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.CalledAENotRecognized).ConfigureAwait(false); + } + + foreach (var pc in association.PresentationContexts) + { + if (pc.AbstractSyntax == DicomUID.Verification) + { + if (!AssociationDataProvider.Configuration.Value.Dicom.Scp.EnableVerification) + { + _associationInfo.Errors = "Verification service disabled. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + _logger?.VerificationServiceDisabled(); + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.ApplicationContextNotSupported + ).ConfigureAwait(false); + } + pc.AcceptTransferSyntaxes(AssociationDataProvider.Configuration.Value.Dicom.Scp.VerificationServiceTransferSyntaxes.ToDicomTransferSyntaxArray()); + } + else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None) + { + if (!AssociationDataProvider.CanStore) + { + _associationInfo.Errors = "Disk pressure. Called AE: {association.CalledAE}. Calling AE: {association.CallingAE}. IP: {association.RemoteHost}."; + await SendAssociationRejectAsync( + DicomRejectResult.Permanent, + DicomRejectSource.ServiceUser, + DicomRejectReason.NoReasonGiven).ConfigureAwait(false); + } + // Accept any proposed TS + pc.AcceptTransferSyntaxes(pc.GetTransferSyntaxes().ToArray()); + } + } + + await SendAssociationAcceptAsync(association).ConfigureAwait(false); + } + + private async Task IsValidCalledAeAsync(string calledAe) + { + return await AssociationDataProvider!.IsAeTitleConfiguredAsync(calledAe).ConfigureAwait(false); + } + + private async Task IsValidSourceAeAsync(string callingAe, string host) + { + if (!AssociationDataProvider!.Configuration.Value.Dicom.Scp.RejectUnknownSources) return true; + + return await AssociationDataProvider.IsValidSourceAsync(callingAe, host).ConfigureAwait(false); + } + } +} diff --git a/src/InformaticsGateway/Services/Scu/ScuService.cs b/src/InformaticsGateway/Services/Scu/ScuService.cs index 809f12cfa..1833955d7 100755 --- a/src/InformaticsGateway/Services/Scu/ScuService.cs +++ b/src/InformaticsGateway/Services/Scu/ScuService.cs @@ -205,7 +205,6 @@ public Task StartAsync(CancellationToken cancellationToken) }, CancellationToken.None); Status = ServiceStatus.Running; - _logger.ServiceRunning(ServiceName); if (task.IsCompleted) return task; return Task.CompletedTask; diff --git a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs index a276dca33..49d894728 100755 --- a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs +++ b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs @@ -167,7 +167,7 @@ private async Task ProcessObject(int thread, FileStorageMetadata blob) catch (Exception ex) { blob.SetFailed(); - _logger.FailedToUploadFile(blob.Id, ex); + _logger.FailedToUploadFile(blob.Id, blob.File.UploadPath, ex); } finally { diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj index 9680120d1..7c303125e 100755 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -36,8 +36,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + - + diff --git a/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs b/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs new file mode 100755 index 000000000..c24e93270 --- /dev/null +++ b/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs @@ -0,0 +1,37 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System.Reflection; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Test.PlugIns +{ + [PlugInName("TestInputHL7DataPlugInAddWorkflow")] + public class TestInputHL7DataPlugInAddWorkflow : IInputHL7DataPlugIn + { + public static readonly string TestString = "HOSPITAL changed!"; + + public string Name => GetType().GetCustomAttribute()?.Name ?? GetType().Name; + + public Task<(Message hl7Message, FileStorageMetadata fileMetadata)> ExecuteAsync(Message hl7File, FileStorageMetadata fileMetadata) + { + hl7File.SetValue("MSH.3", TestString); + fileMetadata.Workflows.Add(TestString); + return Task.FromResult((hl7File, fileMetadata)); + } + } +} diff --git a/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs b/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs old mode 100644 new mode 100755 index 171e7c3d6..8a95ca525 --- a/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs +++ b/src/InformaticsGateway/Test/Plug-ins/TestOutputDataPlugIns.cs @@ -16,7 +16,7 @@ using System.Reflection; using FellowOakDicom; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; namespace Monai.Deploy.InformaticsGateway.Test.PlugIns diff --git a/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs b/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs old mode 100644 new mode 100755 index 012425de7..d7a3dc915 --- a/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs +++ b/src/InformaticsGateway/Test/Repositories/MonaiServiceLocatorTest.cs @@ -49,11 +49,14 @@ public void GetMonaiServices() items => items.ServiceName.Equals("DataRetrievalService"), items => items.ServiceName.Equals("ScpService"), items => items.ServiceName.Equals("ScuService"), + items => items.ServiceName.Equals("ExtAppScuService"), items => items.ServiceName.Equals("SpaceReclaimerService"), items => items.ServiceName.Equals("DicomWebExportService"), items => items.ServiceName.Equals("ScuExportService"), items => items.ServiceName.Equals("PayloadNotificationService"), - items => items.ServiceName.Equals("HL7 Service")); + items => items.ServiceName.Equals("HL7 Service"), + items => items.ServiceName.Equals("ExtAppScuExportService"), + items => items.ServiceName.Equals("Hl7ExportService")); } [Fact(DisplayName = "GetServiceStatus")] @@ -62,7 +65,7 @@ public void GetServiceStatus() var serviceLocator = new MonaiServiceLocator(_serviceProvider.Object); var result = serviceLocator.GetServiceStatus(); - Assert.Equal(8, result.Count); + Assert.Equal(11, result.Count); foreach (var svc in result.Keys) { Assert.Equal(ServiceStatus.Running, result[svc]); diff --git a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs new file mode 100755 index 000000000..47a56a735 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs @@ -0,0 +1,69 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO.Abstractions; +using System.Linq; +using System.Reflection; +using System.Text.Json; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.SharedTest; +using Monai.Deploy.InformaticsGateway.Test.PlugIns; +using Moq; +using Xunit; +using Xunit.Abstractions; +namespace Monai.Deploy.InformaticsGateway.Test.Services.Common +{ + public class InputHL7DataPlugInEngineFactoryTest + { + private readonly Mock> _logger; + private readonly FileSystem _fileSystem; + private readonly ITestOutputHelper _output; + + public InputHL7DataPlugInEngineFactoryTest(ITestOutputHelper output) + { + _logger = new Mock>(); + _fileSystem = new FileSystem(); + _output = output; + + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public void RegisteredPlugIns_WhenCalled_ReturnsListOfPlugIns() + { + var factory = new InputHL7DataPlugInEngineFactory(_fileSystem, _logger.Object); + var result = factory.RegisteredPlugIns().OrderBy(p => p.Value).ToArray(); + + _output.WriteLine($"result now = {JsonSerializer.Serialize(result)}"); + + Assert.Collection(result, + p => VerifyPlugIn(p, typeof(TestInputHL7DataPlugInAddWorkflow))); + + _logger.VerifyLogging($"{typeof(IInputHL7DataPlugIn).Name} data plug-in found {typeof(TestInputHL7DataPlugInAddWorkflow).GetCustomAttribute()?.Name}: {typeof(TestInputHL7DataPlugInAddWorkflow).GetShortTypeAssemblyName()}.", LogLevel.Information, Times.Once()); + } + + private void VerifyPlugIn(KeyValuePair values, Type type) + { + Assert.Equal(values.Key, type.GetCustomAttribute()?.Name); + Assert.Equal(values.Value, type.GetShortTypeAssemblyName()); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs new file mode 100755 index 000000000..4f3298a7b --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs @@ -0,0 +1,145 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.Test.PlugIns; +using Monai.Deploy.Messaging.Events; +using Moq; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Common +{ + public class InputHL7DataPlugInEngineTest + { + private readonly Mock> _logger; + private readonly Mock _serviceScopeFactory; + private readonly Mock _serviceScope; + private readonly ServiceProvider _serviceProvider; + + private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; + + public InputHL7DataPlugInEngineTest() + { + _logger = new Mock>(); + _serviceScopeFactory = new Mock(); + _serviceScope = new Mock(); + + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public void GivenAnInputHL7DataPlugInEngine_WhenInitialized_ExpectParametersToBeValidated() + { + Assert.Throws(() => new InputHL7DataPlugInEngine(null, null)); + Assert.Throws(() => new InputHL7DataPlugInEngine(_serviceProvider, null)); + + _ = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + } + + + [Fact] + public void GivenAnInputHL7DataPlugInEngine_WhenConfigureIsCalledWithBogusAssemblies_ThrowsException() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() { "SomeBogusAssemblye" }; + + var exceptions = Assert.Throws(() => pluginEngine.Configure(assemblies)); + + Assert.Single(exceptions.InnerExceptions); + Assert.True(exceptions.InnerException is PlugInLoadingException); + Assert.Contains("Error loading plug-in 'SomeBogusAssemblye'", exceptions.InnerException.Message); + } + + [Fact] + public void GivenAnInputHL7DataPlugInEngine_WhenConfigureIsCalledWithAValidAssembly_ExpectNoExceptions() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() { typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName }; + + pluginEngine.Configure(assemblies); + Assert.NotNull(pluginEngine); + } + + [Fact] + public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalledWithoutConfigure_ThrowsException() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() { typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName }; + + var dicomInfo = new DicomFileStorageMetadata( + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + "StudyInstanceUID", + "SeriesInstanceUID", + "SOPInstanceUID", + DataService.DicomWeb, + "calling", + "called"); + + var message = new HL7.Dotnetcore.Message(SampleMessage); + message.ParseMessage(); + + await Assert.ThrowsAsync(async () => await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, null)); + } + + [Fact] + public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalled_ExpectDataIsProcessedByPlugInAsync() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() + { + typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName, + }; + + pluginEngine.Configure(assemblies); + + var dicomInfo = new DicomFileStorageMetadata( + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + "StudyInstanceUID", + "SeriesInstanceUID", + "SOPInstanceUID", + DataService.DicomWeb, + "calling", + "called"); + + var message = new HL7.Dotnetcore.Message(SampleMessage); + message.ParseMessage(); + var configItem = new Hl7ApplicationConfigEntity { PlugInAssemblies = new List { { "TestInputHL7DataPlugInAddWorkflow" } } }; + + var (Hl7Message, resultDicomInfo) = await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, configItem); + + Assert.Equal(Hl7Message, message); + Assert.Equal(resultDicomInfo, dicomInfo); + Assert.Equal(Hl7Message.GetValue("MSH.3"), TestInputHL7DataPlugInAddWorkflow.TestString); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs old mode 100644 new mode 100755 index 90595f2ff..faee1ca97 --- a/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs @@ -21,7 +21,7 @@ using FellowOakDicom; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Test.PlugIns; diff --git a/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs index 97db11eda..83e4c2036 100755 --- a/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs @@ -28,7 +28,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs b/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs new file mode 100755 index 000000000..0897a68a2 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs @@ -0,0 +1,385 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Mllp; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Export; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using Monai.Deploy.InformaticsGateway.Services.Storage; +using Monai.Deploy.InformaticsGateway.SharedTest; +using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Storage.API; +using Moq; +using xRetry; +using Xunit; + + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Export +{ + [Collection("Hl7 Export Listener")] + public class ExportHl7ServiceTests + { + private readonly Mock _storageService = new Mock(); + private readonly Mock _messageSubscriberService = new Mock(); + private readonly Mock _messagePublisherService = new Mock(); + private readonly Mock> _logger = new Mock>(); + private readonly Mock _extAppScpLogger = new Mock(); + private readonly Mock _serviceScopeFactory = new Mock(); + private readonly IOptions _configuration; + private readonly Mock _dicomToolkit = new Mock(); + private readonly Mock _storageInfoProvider = new Mock(); + private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); + private readonly Mock _mllpService = new Mock(); + private readonly Mock _outputDataPlugInEngine = new Mock(); + private readonly Mock _repository = new Mock(); + private readonly int _port = 1104; + + public ExportHl7ServiceTests() + { + _configuration = Options.Create(new InformaticsGatewayConfiguration()); + + var services = new ServiceCollection(); + services.AddScoped(p => _messagePublisherService.Object); + services.AddScoped(p => _messageSubscriberService.Object); + services.AddScoped(p => _storageService.Object); + services.AddScoped(p => _storageInfoProvider.Object); + services.AddScoped(p => _mllpService.Object); + services.AddScoped(p => _outputDataPlugInEngine.Object); + services.AddScoped(p => _repository.Object); + + var serviceProvider = services.BuildServiceProvider(); + + var scope = new Mock(); + scope.Setup(x => x.ServiceProvider).Returns(serviceProvider); + + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(scope.Object); + _configuration.Value.Export.Retries.DelaysMilliseconds = new[] { 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + _storageInfoProvider.Setup(p => p.HasSpaceAvailableForExport).Returns(true); + _outputDataPlugInEngine.Setup(p => p.Configure(It.IsAny>())); + _outputDataPlugInEngine.Setup(p => p.ExecutePlugInsAsync(It.IsAny())) + .Returns((ExportRequestDataMessage message) => Task.FromResult(message)); + } + + [RetryFact(1, 250, DisplayName = "Constructor - throws on null params")] + public void Constructor_ThrowsOnNullParams() + { + Assert.Throws(() => new Hl7ExportService(null, null, null, null)); + Assert.Throws(() => new Hl7ExportService(_logger.Object, null, null, null)); + Assert.Throws(() => new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, null, null)); + Assert.Throws(() => new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, null)); + } + + + [RetryFact(10, 250, DisplayName = "When no destination is defined")] + public async Task ShallFailWhenNoDestinationIsDefined() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs(string.Empty)); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Export task does not have destination set.", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "When destination is not configured")] + public async Task ShallFailWhenDestinationIsNotConfigured() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(HL7DestinationEntity)); + + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging($"Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); + } + + [RetryFact(1, 250, DisplayName = "HL7 message rejected")] + public async Task No_Ack_Sent() + { + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new HL7DestinationEntity { HostIp = "192.168.0.0", Port = _port }; + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _mllpService.Setup(p => p.SendMllp(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Throws(new Hl7SendException("Send exception")); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + + await StopAndVerify(service); + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.Verify(x => x.Log( + LogLevel.Error, + 538, // this is the eventId of the log we're looking for + It.Is((v, t) => true), + It.IsAny(), + It.Is>((v, t) => true))); + } + + [RetryFact(1, 250, DisplayName = "Failed to load message content")] + public async Task Error_Loading_HL7_Content() + { + + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new HL7DestinationEntity { HostIp = "192.168.0.0", Port = _port }; + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.FromResult(null)); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.DownloadError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging("Error downloading payload.", LogLevel.Error, Times.AtLeastOnce()); + _logger.VerifyLoggingMessageBeginsWith("Error downloading payload. Waiting ", LogLevel.Error, Times.AtLeastOnce()); + } + + [RetryFact(2, 250, DisplayName = "success after Hl7 send")] + public async Task Success_After_Hl7Send() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new HL7DestinationEntity { HostIp = "192.168.0.0", Port = _port }; + var service = new Hl7ExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Success, FileExportStatus.Success))), Times.Once()); + } + + + + + private bool CheckMessage(Message message, ExportStatus exportStatus, FileExportStatus fileExportStatus) + { + Guard.Against.Null(message, nameof(message)); + + var exportEvent = message.ConvertTo(); + return exportEvent.Status == exportStatus && + exportEvent.FileStatuses.First().Value == fileExportStatus; + } + + private static MessageReceivedEventArgs CreateMessageReceivedEventArgs(string destination) + { + var exportRequestEvent = new ExportRequestEvent + { + ExportTaskId = Guid.NewGuid().ToString(), + CorrelationId = Guid.NewGuid().ToString(), + Destinations = new string[] { destination }, + Files = new[] { "file1" }, + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = Guid.NewGuid().ToString(), + }; + var jsonMessage = new JsonMessage(exportRequestEvent, MessageBrokerConfiguration.InformaticsGatewayApplicationId, exportRequestEvent.CorrelationId, exportRequestEvent.DeliveryTag); + + return new MessageReceivedEventArgs(jsonMessage.ToMessage(), CancellationToken.None); + } + + private async Task StopAndVerify(Hl7ExportService service) + { + await service.StopAsync(_cancellationTokenSource.Token); + _logger.VerifyLogging($"{service.ServiceName} is stopping.", LogLevel.Information, Times.Once()); + await Task.Delay(500); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs b/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs index bc80f36c5..e076e06e8 100755 --- a/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs @@ -20,11 +20,13 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Export; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -54,8 +56,9 @@ public class TestExportService : ExportServiceBase public TestExportService( ILogger logger, IOptions InformaticsGatewayConfiguration, - IServiceScopeFactory serviceScopeFactory) - : base(logger, InformaticsGatewayConfiguration, serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory, + IDicomToolkit _dicomToolkit) + : base(logger, InformaticsGatewayConfiguration, serviceScopeFactory, _dicomToolkit) { } @@ -70,6 +73,38 @@ protected override Task ExportDataBlockCallback(Export return Task.FromResult(exportRequestData); } + + protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) + { + var (exportFlow, reportingActionBlock) = SetupActionBlocks(); + + lock (SyncRoot) + { + var exportRequest = eventArgs.Message.ConvertTo(); + if (ExportRequests.ContainsKey(exportRequest.ExportTaskId)) + { + return; + } + + exportRequest.MessageId = eventArgs.Message.MessageId; + exportRequest.DeliveryTag = eventArgs.Message.DeliveryTag; + + var exportRequestWithDetails = new ExportRequestEventDetails(exportRequest); + + ExportRequests.Add(exportRequest.ExportTaskId, exportRequestWithDetails); + if (!exportFlow.Post(exportRequestWithDetails)) + { + MessageSubscriber.Reject(eventArgs.Message); + } + else + { + } + } + + exportFlow.Complete(); + await reportingActionBlock.Completion.ConfigureAwait(false); + + } } public class ExportServiceBaseTest @@ -83,6 +118,7 @@ public class ExportServiceBaseTest private readonly IOptions _configuration; private readonly CancellationTokenSource _cancellationTokenSource; private readonly Mock _serviceScopeFactory; + private readonly Mock _dicomToolkit = new Mock(); public ExportServiceBaseTest() { @@ -121,7 +157,7 @@ public ExportServiceBaseTest() [RetryFact(5, 250, DisplayName = "Data flow test - can start/stop")] public async Task DataflowTest_StartStop() { - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); await service.StartAsync(_cancellationTokenSource.Token); await StopAndVerify(service); @@ -145,7 +181,7 @@ public async Task DataflowTest_RejectOnInsufficientStorageSpace() messageReceivedCallback(CreateMessageReceivedEventArgs()); }); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); await service.StartAsync(_cancellationTokenSource.Token); await StopAndVerify(service); @@ -178,7 +214,7 @@ public async Task DataflowTest_PayloadDownlaodFailure() .ThrowsAsync(new Exception("storage error")); var countdownEvent = new CountdownEvent(1); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); service.ReportActionCompleted += (sender, e) => { countdownEvent.Signal(); @@ -224,7 +260,7 @@ public async Task DataflowTest_EndToEnd_WithPartialFailure() .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(testData))); var countdownEvent = new CountdownEvent(5 * 3); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); service.ReportActionCompleted += (sender, e) => { countdownEvent.Signal(); @@ -238,7 +274,7 @@ public async Task DataflowTest_EndToEnd_WithPartialFailure() countdownEvent.Signal(); }; await service.StartAsync(_cancellationTokenSource.Token); - Assert.True(countdownEvent.Wait(1000000)); + Assert.True(countdownEvent.Wait(60000)); await StopAndVerify(service); _messagePublisherService.Verify( @@ -278,7 +314,7 @@ public async Task DataflowTest_EndToEnd() .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes(testData))); var countdownEvent = new CountdownEvent(5 * 3); - var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object); + var service = new TestExportService(_logger.Object, _configuration, _serviceScopeFactory.Object, _dicomToolkit.Object); service.ReportActionCompleted += (sender, e) => { countdownEvent.Signal(); @@ -290,7 +326,7 @@ public async Task DataflowTest_EndToEnd() countdownEvent.Signal(); }; await service.StartAsync(_cancellationTokenSource.Token); - Assert.True(countdownEvent.Wait(1000000)); + Assert.True(countdownEvent.Wait(60000)); await StopAndVerify(service); _messagePublisherService.Verify( diff --git a/src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs new file mode 100755 index 000000000..689699ba6 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Export/ExtAppScuServiceTest.cs @@ -0,0 +1,595 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; +using FellowOakDicom; +using FellowOakDicom.Network; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Export; +using Monai.Deploy.InformaticsGateway.Services.Storage; +using Monai.Deploy.InformaticsGateway.SharedTest; +using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Storage.API; +using Moq; +using xRetry; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Export +{ + [Collection("SCP Listener")] + public class ExtAppScuServiceTest + { + private readonly Mock _storageService; + private readonly Mock _messageSubscriberService; + private readonly Mock _messagePublisherService; + private readonly Mock _outputDataPlugInEngine; + private readonly Mock> _logger; + private readonly Mock _extAppScpLogger; + private readonly Mock _serviceScopeFactory; + private readonly IOptions _configuration; + private readonly Mock _dicomToolkit; + private readonly Mock _repository; + private readonly Mock _storageInfoProvider; + private readonly Mock _externalAppRepository = new Mock(); + + private readonly CancellationTokenSource _cancellationTokenSource; + private readonly DicomScpFixture _dicomScp; + private readonly int _port = 1104; + + public ExtAppScuServiceTest(DicomScpFixture dicomScp) + { + _dicomScp = dicomScp ?? throw new ArgumentNullException(nameof(dicomScp)); + + _storageService = new Mock(); + _messageSubscriberService = new Mock(); + _messagePublisherService = new Mock(); + _outputDataPlugInEngine = new Mock(); + _logger = new Mock>(); + _extAppScpLogger = new Mock(); + _serviceScopeFactory = new Mock(); + _configuration = Options.Create(new InformaticsGatewayConfiguration()); + _dicomToolkit = new Mock(); + _cancellationTokenSource = new CancellationTokenSource(); + _repository = new Mock(); + _storageInfoProvider = new Mock(); + + var services = new ServiceCollection(); + services.AddScoped(p => _repository.Object); + services.AddScoped(p => _messagePublisherService.Object); + services.AddScoped(p => _messageSubscriberService.Object); + services.AddScoped(p => _outputDataPlugInEngine.Object); + services.AddScoped(p => _storageService.Object); + services.AddScoped(p => _storageInfoProvider.Object); + + var serviceProvider = services.BuildServiceProvider(); + + var scope = new Mock(); + scope.Setup(x => x.ServiceProvider).Returns(serviceProvider); + + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(scope.Object); + DicomScpFixture.Logger = _extAppScpLogger.Object; + _dicomScp.Start(_port); + _configuration.Value.Export.Retries.DelaysMilliseconds = new[] { 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + _storageInfoProvider.Setup(p => p.HasSpaceAvailableForExport).Returns(true); + + _outputDataPlugInEngine.Setup(p => p.Configure(It.IsAny>())); + _outputDataPlugInEngine.Setup(p => p.ExecutePlugInsAsync(It.IsAny())) + .Returns((ExportRequestDataMessage message) => Task.FromResult(message)); + + _externalAppRepository.Setup(r => r.GetAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult>(null)); + + var seriesInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var testDicom = InstanceGenerator.GenerateDicomFile(seriesInstanceUid: seriesInstanceUid); + _dicomToolkit.Setup(d => d.Load(It.IsAny())).Returns(testDicom); + } + + [RetryFact(5, 250, DisplayName = "Constructor - throws on null params")] + public void Constructor_ThrowsOnNullParams() + { + Assert.Throws(() => new ExtAppScuExportService(null, null, null, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, null, null, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, null, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, null, null)); + Assert.Throws(() => new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, null)); + } + + [RetryFact(10, 250, DisplayName = "When no destination is defined")] + public async Task ShallFailWhenNoDestinationIsDefined() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs(string.Empty)); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Export task does not have destination set.", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "When destination is not configured")] + public async Task ShallFailWhenDestinationIsNotConfigured() + { + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(DestinationApplicationEntity)); + + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(3000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ConfigurationError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging($"Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); + } + + [RetryFact(1, 250, DisplayName = "Association rejected")] + public async Task AssociationRejected() + { + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = "ABC", Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + + await StopAndVerify(service); + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLogging($"Association rejected.", LogLevel.Warning, Times.AtLeastOnce()); + _logger.VerifyLoggingMessageBeginsWith($"Association rejected with reason", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "C-STORE simulate abort")] + public async Task SimulateAbort() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = "ABORT", Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.ResourceLimitation; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + + await StopAndVerify(service); + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLoggingMessageBeginsWith($"Association aborted with reason", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "C-STORE Failure")] + public async Task CStoreFailure() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.ResourceLimitation; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Association accepted.", LogLevel.Information, Times.Once()); + _logger.VerifyLogging($"Failed to export with error {DicomStatus.ResourceLimitation}.", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "Failed to load DICOM content")] + public async Task ErrorLoadingDicomContent() + { + + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>(async (topic, queue, messageReceivedCallback, prefetchCount) => + { + await messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Throws(new Exception("error")); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.UnsupportedDataType))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + + _logger.VerifyLoggingMessageBeginsWith("Error reading DICOM file: error", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "Unreachable Server")] + public async Task UnreachableServer() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "UNKNOWNHOST123456789", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(8000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Failure, FileExportStatus.ServiceError))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLoggingMessageBeginsWith("Association aborted with error", LogLevel.Error, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "C-STORE success")] + public async Task ExportCompletes() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _messagePublisherService.Verify( + p => p.Publish(It.IsAny(), + It.Is(match => CheckMessage(match, ExportStatus.Success, FileExportStatus.Success))), Times.Once()); + _messageSubscriberService.Verify(p => p.Acknowledge(It.IsAny()), Times.Once()); + _messageSubscriberService.Verify(p => p.RequeueWithDelay(It.IsAny()), Times.Never()); + _messageSubscriberService.Verify(p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny()), Times.Once()); + _logger.VerifyLogging("Association accepted.", LogLevel.Information, Times.Once()); + _logger.VerifyLogging($"Instance sent successfully.", LogLevel.Information, Times.Once()); + } + + [RetryFact(10, 250, DisplayName = "success save ExternalAppDetails")] + public async Task SaveExternalAppDetails() + { + _extAppScpLogger.Invocations.Clear(); + var sopInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID; + var destination = new DestinationApplicationEntity { AeTitle = DicomScpFixture.s_aETITLE, Name = DicomScpFixture.s_aETITLE, HostIp = "localhost", Port = _port }; + var service = new ExtAppScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object, _externalAppRepository.Object); + + _messagePublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())); + _messageSubscriberService.Setup(p => p.Acknowledge(It.IsAny())); + _messageSubscriberService.Setup(p => p.RequeueWithDelay(It.IsAny())); + _messageSubscriberService.Setup( + p => p.SubscribeAsync(It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback, ushort>((topic, queue, messageReceivedCallback, prefetchCount) => + { + messageReceivedCallback(CreateMessageReceivedEventArgs("pacs")); + }); + + _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); + + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); + _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); + + var dataflowCompleted = new ManualResetEvent(false); + service.ReportActionCompleted += (sender, args) => + { + dataflowCompleted.Set(); + }; + + DicomScpFixture.DicomStatus = DicomStatus.Success; + await service.StartAsync(_cancellationTokenSource.Token); + Assert.True(dataflowCompleted.WaitOne(5000)); + await StopAndVerify(service); + + _externalAppRepository.Verify(r => r.AddAsync(It.IsAny(), It.IsAny()), Times.Once); + } + + private bool CheckMessage(Message message, ExportStatus exportStatus, FileExportStatus fileExportStatus) + { + Guard.Against.Null(message, nameof(message)); + + var exportEvent = message.ConvertTo(); + return exportEvent.Status == exportStatus && + exportEvent.FileStatuses.First().Value == fileExportStatus; + } + + private static MessageReceivedEventArgs CreateMessageReceivedEventArgs(string destination) + { + var exportRequestEvent = new ExternalAppRequestEvent + { + ExportTaskId = Guid.NewGuid().ToString(), + CorrelationId = Guid.NewGuid().ToString(), + Targets = new List { new DataOrigin { Destination = destination } }, + Files = new[] { "file1" }, + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = Guid.NewGuid().ToString(), + }; + var jsonMessage = new JsonMessage(exportRequestEvent, MessageBrokerConfiguration.InformaticsGatewayApplicationId, exportRequestEvent.CorrelationId, exportRequestEvent.DeliveryTag); + + return new MessageReceivedEventArgs(jsonMessage.ToMessage(), CancellationToken.None); + } + + private async Task StopAndVerify(ExtAppScuExportService service) + { + await service.StopAsync(_cancellationTokenSource.Token); + _logger.VerifyLogging($"{service.ServiceName} is stopping.", LogLevel.Information, Times.Once()); + await Task.Delay(500); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs index ad538c544..a832401aa 100755 --- a/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs @@ -27,7 +27,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; @@ -156,7 +156,7 @@ public async Task ShallFailWhenNoDestinationIsDefined() It.IsAny(), It.IsAny>(), It.IsAny()), Times.Once()); - _logger.VerifyLogging("SCU Export configuration error: Export task does not have destination set.", LogLevel.Error, Times.Once()); + _logger.VerifyLogging("Export task does not have destination set.", LogLevel.Error, Times.Once()); } [RetryFact(10, 250, DisplayName = "When destination is not configured")] @@ -202,7 +202,7 @@ public async Task ShallFailWhenDestinationIsNotConfigured() It.IsAny>(), It.IsAny()), Times.Once()); - _logger.VerifyLogging($"SCU Export configuration error: Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); + _logger.VerifyLogging($"Specified destination 'pacs' does not exist.", LogLevel.Error, Times.Once()); } [RetryFact(1, 250, DisplayName = "Association rejected")] diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs new file mode 100755 index 000000000..0d9aa2541 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -0,0 +1,204 @@ + +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System.Threading; +using Moq; +using Xunit; +using Microsoft.Extensions.Logging; +using System; +using Monai.Deploy.InformaticsGateway.Api; +using System.Collections.Generic; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Api.Mllp; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using System.Threading.Tasks; +using Monai.Deploy.InformaticsGateway.Api.Models; +using FellowOakDicom; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 +{ + public class MllPExtractTests + { + private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; + private const string ABCDEMessage = "MSH|^~\\&|Rayvolve|ABCDE|RIS|{InstitutionName}|{YYYYMMDDHHMMSS}||ORU^R01|{UniqueIdentifier}|P|2.5\r\nPID|{StudyInstanceUID}|{AccessionNumber}\r\nOBR|{StudyInstanceUID}||{AccessionNumber}|Rayvolve^{AlgorithmUsed}||||||||||||{AccessionNumber}|||||||F||{PriorityValues, ex: A^ASAP^HL70078}\r\nTQ1|||||||||{PriorityValues, ex: A^ASAP^HL70078}\r\nOBX|1|ST|113014^DICOM Study^DCM||{StudyInstanceUID}||||||O\r\nOBX|2|TX|59776-5^Procedure Findings^LN||{Textual findingsm, ex:\"Fracture detected\")}|||{Abnormal flag, ex : A^Abnormal^HL70078}|||F||||{ACR flag, ex : RID49482^Category 3 Non critical Actionable Finding^RadLex}\r\n"; + private const string VendorMessage = "MSH|^~\\&|Vendor INSIGHT CXR |Vendor Inc.|||20231130091315||ORU^R01|ORU20231130091315834|P|2.4||||||UNICODE UTF-8\r\nPID|1||2.25.82866891564990604580806081805518233357\r\nPV1|1|O\r\nORC|RE||||SC\r\nOBR|1|||CXR0001^Chest X-ray Report|||20230418142212.134||||||||||||||||||P|||||||Vendor\r\nNTE|1||Bilateral lungs are clear without remarkable opacity.\\X0A\\Cardiomediastinal contour appears normal.\\X0A\\Pneumothorax is not seen.\\X0A\\Pleural Effusion is present on the bilateral sides.\\X0A\\\\X0A\\Threshold value\\X0A\\Atelectasis: 15\\X0A\\Calcification: 15\\X0A\\Cardiomegaly: 15\\X0A\\Consolidation: 15\\X0A\\Fibrosis: 15\\X0A\\Mediastinal Widening: 15\\X0A\\Nodule: 15\\X0A\\Pleural Effusion: 15\\X0A\\Pneumoperitoneum: 15\\X0A\\Pneumothorax: 15\\X0A\\\r\nZDS|2.25.97606619386020057921123852316852071139||2.25.337759261491022538565548360794987622189|Vendor INSIGHT CXR|v3.1.5.3\r\nOBX|1|NM|RAB0001^Abnormality Score||50.82||||||P|||20230418142212.134||Vendor"; + + private readonly Mock> _logger; + private readonly CancellationTokenSource _cancellationTokenSource; + private readonly MllpExtract _sut; + private readonly Mock _l7ApplicationConfigRepository = new Mock(); + private readonly Mock _externalAppDetailsRepository = new Mock(); + + public MllPExtractTests() + { + _logger = new Mock>(); + _cancellationTokenSource = new CancellationTokenSource(); + _sut = new MllpExtract(_l7ApplicationConfigRepository.Object, _externalAppDetailsRepository.Object, _logger.Object); + } + + [Fact(DisplayName = "Constructor Should Throw on missing arguments")] + public void Constructor_Should_Throw_on_missing_arguments() + { + Assert.Throws(() => new MllpExtract(null, null, null)); + Assert.Throws(() => new MllpExtract(_l7ApplicationConfigRepository.Object, null, null)); + Assert.Throws(() => new MllpExtract(_l7ApplicationConfigRepository.Object, _externalAppDetailsRepository.Object, null)); + + new MllpExtract(_l7ApplicationConfigRepository.Object, _externalAppDetailsRepository.Object, _logger.Object); + } + + [Fact(DisplayName = "ParseConfig Should Return Correct Item")] + public void ParseConfig_Should_Return_Correct_Item() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + var configs = new List { + new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, + }; + + var message = new Message(SampleMessage); + var isParsed = message.ParseMessage(); + + var config = MllpExtract.GetConfig(configs, message); + Assert.Equal(correctid, config?.Id); + + message = new Message(ABCDEMessage); + isParsed = message.ParseMessage(); + + config = MllpExtract.GetConfig(configs, message); + Assert.Equal(azCorrectid, config?.Id); + } + + [Fact(DisplayName = "Should Set MetaData On Hl7FileStorageMetadata Object")] + public async Task Should_Set_MetaData_On_Hl7FileStorageMetadata_Object() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + var configs = new List { + new Hl7ApplicationConfigEntity{ + Id= new Guid("00000000-0000-0000-0000-000000000001"), + SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } + ,DataLink = new DataKeyValuePair{ Key = "PID.1", Value = DataLinkType.StudyInstanceUid } + }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, + }; + + _l7ApplicationConfigRepository + .Setup(x => x.GetAllAsync(new CancellationToken())) + .ReturnsAsync(configs); + + _externalAppDetailsRepository.Setup(x => x.GetByStudyIdOutboundAsync("{StudyInstanceUID}", It.IsAny())) + .ReturnsAsync(new ExternalAppDetails + { + WorkflowInstanceId = "WorkflowInstanceId2", + ExportTaskID = "ExportTaskID2", + CorrelationId = "CorrelationId2", + DestinationFolder = "DestinationFolder2" + }); + + var message = new Message(ABCDEMessage); + var isParsed = message.ParseMessage(); + + var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; + + var configItem = await _sut.GetConfigItem(message); + await _sut.ExtractInfo(meatData, message, configItem); + + Assert.Equal("WorkflowInstanceId2", meatData.WorkflowInstanceId); + Assert.Equal("ExportTaskID2", meatData.TaskId); + Assert.Equal("CorrelationId2", meatData.CorrelationId); + Assert.StartsWith("DestinationFolder2", meatData.File.UploadPath); + } + + [Fact(DisplayName = "Should Set Original Patient And Study Uid")] + public async Task Should_Set_Original_Patient_And_Study_Uid() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + var configs = new List { + new Hl7ApplicationConfigEntity{ + Id= new Guid("00000000-0000-0000-0000-000000000001"), + SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } + ,DataLink = new DataKeyValuePair{ Key = "PID.1", Value = DataLinkType.StudyInstanceUid }, + DataMapping = new List{ + new StringKeyValuePair { Key = "PID.1", Value = DicomTag.StudyInstanceUID.ToString() }, + new StringKeyValuePair { Key = "OBR.3", Value = DicomTag.PatientID.ToString() }, + } + + }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "MD HOSPITAL" } }, + }; + + _l7ApplicationConfigRepository + .Setup(x => x.GetAllAsync(new CancellationToken())) + .ReturnsAsync(configs); + + _externalAppDetailsRepository.Setup(x => x.GetByStudyIdOutboundAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new ExternalAppDetails + { + WorkflowInstanceId = "WorkflowInstanceId2", + ExportTaskID = "ExportTaskID2", + CorrelationId = "CorrelationId2", + DestinationFolder = "DestinationFolder2", + PatientId = "PatentID", + StudyInstanceUid = "StudyInstanceId" + }); + + var message = new Message(ABCDEMessage); + var isParsed = message.ParseMessage(); + + var te = message.GetValue("OBR.1"); + + var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; + + var configItem = await _sut.GetConfigItem(message); + message = await _sut.ExtractInfo(meatData, message, configItem); + + Assert.Equal("PatentID", message.GetValue("OBR.3")); + Assert.Equal("PatentID", message.GetValue("PID.2")); + Assert.Equal("StudyInstanceId", message.GetValue("PID.1")); + Assert.Equal("StudyInstanceId", message.GetValue("OBR.1")); + + } + + [Fact(DisplayName = "ParseConfig Should Return Correct Item for vendor")] + public void ParseConfig_Should_Return_Correct_Item_For_Vendor() + { + var correctid = new Guid("00000000-0000-0000-0000-000000000002"); + var azCorrectid = new Guid("00000000-0000-0000-0000-000000000001"); + + var configs = new List { + new Hl7ApplicationConfigEntity{ Id= new Guid("00000000-0000-0000-0000-000000000001"), SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "ABCDE" } }, + new Hl7ApplicationConfigEntity{ Id= correctid, SendingId = new StringKeyValuePair{ Key = "MSH.4", Value = "Vendor Inc." } }, + }; + + var message = new Message(VendorMessage); + var isParsed = message.ParseMessage(); + + var config = MllpExtract.GetConfig(configs, message); + Assert.Equal(correctid, config?.Id); + + message = new Message(ABCDEMessage); + isParsed = message.ParseMessage(); + + config = MllpExtract.GetConfig(configs, message); + Assert.Equal(azCorrectid, config?.Id); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs old mode 100644 new mode 100755 index f9900619c..de8b363cd --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs @@ -22,6 +22,7 @@ using System.Threading.Tasks; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; @@ -38,6 +39,7 @@ public class MllpClientTest private readonly Hl7Configuration _config; private readonly Mock> _logger; private readonly CancellationTokenSource _cancellationTokenSource; + private readonly Mock _mIIpExtract = new Mock(); public MllpClientTest() { @@ -55,6 +57,7 @@ public void Constructor() Assert.Throws(() => new MllpClient(null, null, null)); Assert.Throws(() => new MllpClient(_tcpClient.Object, null, null)); Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null)); + Assert.Throws(() => new MllpClient(_tcpClient.Object, _config, null)); new MllpClient(_tcpClient.Object, _config, _logger.Object); } diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 0c8abe39e..1f2119bc6 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -18,9 +18,9 @@ using System.Collections.Generic; using System.IO.Abstractions; using System.Net; -using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; +using HL7.Dotnetcore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -29,13 +29,16 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; -using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; using Monai.Deploy.Messaging.Events; using Moq; using xRetry; using Xunit; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 { @@ -56,6 +59,9 @@ public class MllpServiceTest private readonly Mock> _logger; private readonly IServiceProvider _serviceProvider; private readonly Mock _storageInfoProvider; + private readonly Mock _mIIpExtract = new Mock(); + private readonly Mock _hl7DataPlugInEngine = new Mock(); + private readonly Mock _hl7ApplicationConfigRepository = new Mock(); public MllpServiceTest() { @@ -85,6 +91,9 @@ public MllpServiceTest() services.AddScoped(p => _payloadAssembler.Object); services.AddScoped(p => _fileSystem.Object); services.AddScoped(p => _storageInfoProvider.Object); + services.AddScoped(p => _mIIpExtract.Object); + services.AddScoped(p => _hl7DataPlugInEngine.Object); + services.AddScoped(p => _hl7ApplicationConfigRepository.Object); _serviceProvider = services.BuildServiceProvider(); _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); @@ -274,6 +283,9 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT { var checkEvent = new ManualResetEventSlim(); var client = new Mock(); + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg, Hl7ApplicationConfigEntity configItem) => Msg); + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { @@ -308,5 +320,51 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Exactly(3)); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); } + + [RetryFact(10, 250)] + public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageToBeRePopulated() + { + var checkEvent = new ManualResetEventSlim(); + var client = new Mock(); + + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg, Hl7ApplicationConfigEntity configItem) => Msg); + + _mIIpExtract.Setup(e => e.GetConfigItem(It.IsAny())) + .ReturnsAsync((Message Msg) => new Hl7ApplicationConfigEntity()); + + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) + .Returns(() => + { + client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) + .Callback, CancellationToken>((action, cancellationToken) => + { + var results = new MllpClientResult( + new List + { + new HL7.Dotnetcore.Message(""), + new HL7.Dotnetcore.Message(""), + new HL7.Dotnetcore.Message(""), + }, null); + action(client.Object, results); + checkEvent.Set(); + _cancellationTokenSource.Cancel(); + }); + client.Setup(p => p.Dispose()); + client.SetupGet(p => p.ClientId).Returns(Guid.NewGuid()); + return client.Object; + }); + + _tcpListener.Setup(p => p.AcceptTcpClientAsync(It.IsAny())) + .Returns(ValueTask.FromResult((new Mock()).Object)); + + var service = new MllpService(_serviceScopeFactory.Object, _options); + _ = service.StartAsync(_cancellationTokenSource.Token); + + Assert.True(checkEvent.Wait(3000)); + await Task.Delay(500).ConfigureAwait(false); + + _mIIpExtract.Verify(p => p.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); + } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs old mode 100644 new mode 100755 index f57600a94..297c7362a --- a/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs @@ -27,7 +27,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; diff --git a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs old mode 100644 new mode 100755 index 1558ec691..89bfc3e7d --- a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs @@ -22,7 +22,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common.Pagination; diff --git a/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs new file mode 100755 index 000000000..34dc2a2a8 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Http/Hl7ApplicationConfigControllerTest.cs @@ -0,0 +1,322 @@ +/* + * Copyright 2021-2023 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Http; +using Moq; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Http +{ + public class Hl7ApplicationConfigControllerTest + { + private readonly Mock> _logger; + private readonly Mock _loggerFactory; + private readonly Hl7ApplicationConfigController _controller; + private readonly Mock _repo; + + public Hl7ApplicationConfigControllerTest() + { + _loggerFactory = new Mock(); + _logger = new Mock>(); + _repo = new Mock(); + _loggerFactory.Setup(p => p.CreateLogger(It.IsAny())).Returns(_logger.Object); + + _controller = new Hl7ApplicationConfigController( + _logger.Object, _repo.Object); + } + + private static Hl7ApplicationConfigEntity ValidApplicationEntity(string dicomStr) + { + var validApplicationEntity = new Hl7ApplicationConfigEntity() + { + Id = Guid.Empty, + DataLink = KeyValuePair.Create("testKey", DataLinkType.PatientId), + DataMapping = new() { KeyValuePair.Create("datamapkey", dicomStr) }, + SendingId = KeyValuePair.Create("sendingidkey", "sendingidvalue"), + DateTimeCreated = DateTime.UtcNow + }; + return validApplicationEntity; + } + + #region GET Tests + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsOK() + { + _repo.Setup(r => r.GetAllAsync(It.IsAny())) + .ReturnsAsync(new List()); + var result = await _controller.Get(); + + var okResult = Assert.IsType(result); + var response = Assert.IsType>(okResult.Value); + Assert.Empty(response); + } + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsNotFound() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Get("test"); + + Assert.IsType(result); + } + + [Fact] + public async Task Get_GiveExpectedInput_ReturnsOK2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Get("test"); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + #endregion + + #region DELETE Tests + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsNotFound() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Delete("test"); + + Assert.IsType(result); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsOK() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Delete("test"); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsInternalServerError() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Delete("test"); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Delete_GiveExpectedInput_ReturnsInternalServerError2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + _repo.Setup(r => r.DeleteAsync(It.IsAny(), It.IsAny())) + .Throws(new Exception()); + var result = await _controller.Delete("test"); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + + #region PUT Tests + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsOK() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Put(validApplicationEntity); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsBadRequest() + { + var result = await _controller.Put(null!); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsBadRequest2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(new Hl7ApplicationConfigEntity()); + var result = await _controller.Put(new Hl7ApplicationConfigEntity()); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Put_GiveExpectedInput_ReturnsInternalServerError() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Put(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + + #region POST Tests + + [Theory] + [InlineData("(0001,0001)")] + [InlineData("0001,0001")] + [InlineData("(FFFE,E0DD)")] + [InlineData("FFFE,E0DD")] + public async Task Post_GiveExpectedInput_ReturnsOK(string dicomStr) + { + var validApplicationEntity = ValidApplicationEntity(dicomStr); + + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Post(validApplicationEntity); + + var okResult = Assert.IsType(result); + var response = Assert.IsType(okResult.Value); + Assert.NotNull(response); + } + + [Theory] + [InlineData("(001,0001)")] + [InlineData("(0001,00x1")] + [InlineData("x001,0001)")] + [InlineData("00001,00001)")] + public async Task Post_GivenInvalidDicomValueInput_ReturnsBadRequest(string dicomStr) + { + //valid Hl7ApplicationEntity + var validApplicationEntity = new Hl7ApplicationConfigEntity() + { + Id = Guid.Empty, + DataLink = KeyValuePair.Create("testKey", DataLinkType.PatientId), + DataMapping = new() { KeyValuePair.Create("datamapkey", dicomStr) }, + SendingId = KeyValuePair.Create("sendingidkey", "sendingidvalue"), + DateTimeCreated = DateTime.UtcNow + }; + + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(validApplicationEntity); + var result = await _controller.Post(validApplicationEntity); + + var objResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsBadRequest() + { + var result = await _controller.Post(null!); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsBadRequest2() + { + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync((Hl7ApplicationConfigEntity)null); + var result = await _controller.Post(new Hl7ApplicationConfigEntity()); + + var objectResult = Assert.IsType(result); + + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.UpdateAsync(It.IsAny(), It.IsAny())) + .Throws(new DatabaseException()); + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError3() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status400BadRequest, objectResult.StatusCode); + } + + [Fact] + public async Task Post_GiveExpectedInput_ReturnsInternalServerError2() + { + var validApplicationEntity = ValidApplicationEntity("0001,0001"); + _repo.Setup(r => r.GetByIdAsync(It.IsAny())) + .ReturnsAsync(validApplicationEntity); + _repo.Setup(r => r.CreateAsync(It.IsAny(), It.IsAny())) + .Throws(new Exception()); + var result = await _controller.Post(validApplicationEntity); + + var objectResult = Assert.IsType(result); + Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode); + } + + #endregion + } +} diff --git a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs index 24238c409..1f2058d57 100755 --- a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs @@ -27,7 +27,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; diff --git a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs old mode 100644 new mode 100755 index a5f4dd9f6..0bf0cff4c --- a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityHandlerTest.cs @@ -24,11 +24,12 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -49,6 +50,7 @@ public class ApplicationEntityHandlerTest private readonly Mock _inputDataPlugInEngine; private readonly Mock _payloadAssembler; private readonly Mock _uploadQueue; + private readonly Mock _extAppDetailsRepo = new Mock(); private readonly IOptions _options; private readonly IFileSystem _fileSystem; private readonly IServiceProvider _serviceProvider; @@ -81,14 +83,15 @@ public ApplicationEntityHandlerTest() _options.Value.Storage.TemporaryDataStorage = TemporaryDataStorageLocation.Memory; } - [RetryFact(5, 250)] + [RetryFact(1, 250)] public void GivenAApplicationEntityHandler_WhenInitialized_ExpectParametersToBeValidated() { - Assert.Throws(() => new ApplicationEntityHandler(null, null, null)); - Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, null, null)); - Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, null)); + Assert.Throws(() => new ApplicationEntityHandler(null, null, null, null)); + Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, null, null, null)); + Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, null, null)); + Assert.Throws(() => new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, null)); - _ = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + _ = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); } [RetryFact(5, 250)] @@ -102,13 +105,18 @@ public async Task GivenAApplicationEntityHandler_WhenHandleInstanceAsyncIsCalled IgnoredSopClasses = new List { DicomUID.SecondaryCaptureImageStorage.UID } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); var request = GenerateRequest(); var dicomToolkit = new DicomToolkit(); var uids = dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - await Assert.ThrowsAsync(async () => await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids)); + await Assert.ThrowsAsync(async + () => await handler.HandleInstanceAsync(request, + aet.AeTitle, + "CALLING", + Guid.NewGuid(), + uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger)); } [RetryFact(5, 250)] @@ -122,14 +130,14 @@ public async Task GivenACStoreRequest_WhenTheSopClassIsInTheIgnoreList_ExpectIns IgnoredSopClasses = new List { DicomUID.SecondaryCaptureImageStorage.UID } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); var request = GenerateRequest(); var dicomToolkit = new DicomToolkit(); var uids = dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids); + await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Never()); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); @@ -146,14 +154,14 @@ public async Task GivenACStoreRequest_WhenTheSopClassIsNotInTheAllowedList_Expec AllowedSopClasses = new List { DicomUID.UltrasoundImageStorage.UID } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); var request = GenerateRequest(); var dicomToolkit = new DicomToolkit(); var uids = dicomToolkit.GetStudySeriesSopInstanceUids(request.File); - await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids); + await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Never()); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); @@ -170,7 +178,7 @@ public async Task GivenACStoreRequest_WhenHandleInstanceAsyncIsCalled_ExpectADic PlugInAssemblies = new List() { typeof(TestInputDataPlugInAddWorkflow).AssemblyQualifiedName } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); var request = GenerateRequest(); @@ -179,7 +187,7 @@ public async Task GivenACStoreRequest_WhenHandleInstanceAsyncIsCalled_ExpectADic _inputDataPlugInEngine.Setup(p => p.ExecutePlugInsAsync(It.IsAny(), It.IsAny())) .Returns((DicomFile dicomFile, FileStorageMetadata fileMetadata) => Task.FromResult(new Tuple(dicomFile, fileMetadata))); - await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids); + await handler.HandleInstanceAsync(request, aet.AeTitle, "CALLING", Guid.NewGuid(), uids, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Once()); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); @@ -203,7 +211,7 @@ public void GivenAConfiguredAETitle_WhenConfiguringAgainWithDifferentAETitle_Exp Name = "TESTAET", Workflows = new List() { "AppA", "AppB", Guid.NewGuid().ToString() } }; - var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options); + var handler = new ApplicationEntityHandler(_serviceScopeFactory.Object, _logger.Object, _options, _extAppDetailsRepo.Object); handler.Configure(aet, Configuration.DicomJsonOptions.Complete, true); newAet.AeTitle = "NewAETitle"; @@ -228,4 +236,4 @@ private static DicomCStoreRequest GenerateRequest() return new DicomCStoreRequest(file); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs old mode 100644 new mode 100755 index 8f90693bb..df9934201 --- a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs @@ -26,9 +26,11 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; @@ -108,7 +110,7 @@ public async Task HandleCStoreRequest_ShallThrowIfAENotConfigured() var request = GenerateRequest(); var exception = await Assert.ThrowsAsync(async () => { - await manager.HandleCStoreRequest(request, "BADAET", "CallingAET", Guid.NewGuid()); + await manager.HandleCStoreRequest(request, "BADAET", "CallingAET", Guid.NewGuid(), InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); }); Assert.Equal("Called AE Title 'BADAET' is not configured", exception.Message); @@ -138,7 +140,7 @@ public async Task HandleCStoreRequest_ThrowWhenOnLowStorageSpace() var request = GenerateRequest(); await Assert.ThrowsAsync(async () => { - await manager.HandleCStoreRequest(request, aet, "CallingAET", Guid.NewGuid()); + await manager.HandleCStoreRequest(request, aet, "CallingAET", Guid.NewGuid(), InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); }); _logger.VerifyLogging($"{aet} added to AE Title Manager.", LogLevel.Information, Times.Once()); @@ -297,7 +299,7 @@ public async Task ShallHandleCStoreRequest() Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); var request = GenerateRequest(); - await manager.HandleCStoreRequest(request, "AE1", "AE", associationId); + await manager.HandleCStoreRequest(request, "AE1", "AE", associationId, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); _applicationEntityHandler.Verify(p => p.HandleInstanceAsync( @@ -309,7 +311,8 @@ public async Task ShallHandleCStoreRequest() p.SopClassUid.Equals(request.Dataset.GetSingleValue(DicomTag.SOPClassUID)) && p.StudyInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.StudyInstanceUID)) && p.SeriesInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.SeriesInstanceUID)) && - p.SopInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.SOPInstanceUID)))) + p.SopInstanceUid.Equals(request.Dataset.GetSingleValue(DicomTag.SOPInstanceUID))), + ScpInputTypeEnum.WorkflowTrigger) , Times.Once()); } diff --git a/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs b/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs old mode 100644 new mode 100755 index 299a85afe..9dca2a3ca --- a/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/MonaiAeChangedNotificationServiceTest.cs @@ -16,7 +16,7 @@ using System; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Services.Scp; using Moq; using xRetry; diff --git a/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs b/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs index c8209a0f3..42e4043f5 100755 --- a/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs @@ -28,6 +28,7 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.SharedTest; using Moq; @@ -234,7 +235,7 @@ public async Task CStore_OnCStoreRequest_InsufficientStorageAvailableException() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new InsufficientStorageAvailableException()); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new InsufficientStorageAvailableException()); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -266,7 +267,7 @@ public async Task CStore_OnCStoreRequest_IoException() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new IOException { HResult = Constants.ERROR_HANDLE_DISK_FULL }); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new IOException { HResult = Constants.ERROR_HANDLE_DISK_FULL }); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -297,7 +298,7 @@ public async Task CStore_OnCStoreRequest_Exception() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new Exception()); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new Exception()); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -329,7 +330,7 @@ public async Task CStore_OnCStoreRequest_Success() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); var countdownEvent = new CountdownEvent(3); var service = await CreateService(); @@ -361,7 +362,7 @@ public async Task CStore_OnClientAbort() _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); - _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); var countdownEvent = new CountdownEvent(1); var service = await CreateService(); @@ -380,6 +381,41 @@ public async Task CStore_OnClientAbort() _logger.VerifyLogging($"Aborted {DicomAbortSource.ServiceUser} with reason {DicomAbortReason.NotSpecified}.", LogLevel.Warning, Times.Once()); } + [RetryFact(5, 250, DisplayName = "C-STORE - ExternalApp OnCStoreRequest - SendType")] + public async Task CStore_OnCStoreRequest_SendsType() + { + ScpInputTypeEnum savedType = ScpInputTypeEnum.WorkflowTrigger; + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.CanStore).Returns(true); + _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((DicomCStoreRequest request, string b, string c, Guid d, ScpInputTypeEnum type) => savedType = type); + + var countdownEvent = new CountdownEvent(3); + var service = await CreateExternalAppService(); + + var client = DicomClientFactory.Create("localhost", _configuration.Value.Dicom.Scp.ExternalAppPort, false, "STORESCU", "STORESCP"); + var request = new DicomCStoreRequest(InstanceGenerator.GenerateDicomFile()); + await client.AddRequestAsync(request); + client.AssociationAccepted += (sender, e) => + { + countdownEvent.Signal(); + }; + client.AssociationReleased += (sender, e) => + { + countdownEvent.Signal(); + }; + request.OnResponseReceived += (DicomCStoreRequest request, DicomCStoreResponse response) => + { + Assert.Equal(DicomStatus.Success, response.Status); + countdownEvent.Signal(); + }; + + await client.SendAsync(); + Assert.True(countdownEvent.Wait(2000)); + Assert.Equal(ScpInputTypeEnum.ExternalAppReturn, savedType); + } + private async Task CreateService() { var tryCount = 0; @@ -400,5 +436,26 @@ private async Task CreateService() Assert.Equal(ServiceStatus.Running, service.Status); return service; } + + private async Task CreateExternalAppService() + { + var tryCount = 0; + ExternalAppScpService service = null; + + do + { + _configuration.Value.Dicom.Scp.ExternalAppPort = Interlocked.Increment(ref s_nextPort); + if (service != null) + { + service.Dispose(); + await Task.Delay(100); + } + service = new ExternalAppScpService(_serviceScopeFactory.Object, _associationDataProvider.Object, _appLifetime.Object, _configuration); + _ = service.StartAsync(_cancellationTokenSource.Token); + } while (service.Status != ServiceStatus.Running && tryCount++ < 5); + + Assert.Equal(ServiceStatus.Running, service.Status); + return service; + } } } diff --git a/src/InformaticsGateway/Test/appsettings.json b/src/InformaticsGateway/Test/appsettings.json old mode 100644 new mode 100755 index f3e7bf5c3..c600ee131 --- a/src/InformaticsGateway/Test/appsettings.json +++ b/src/InformaticsGateway/Test/appsettings.json @@ -10,6 +10,7 @@ "dicom": { "scp": { "port": 1104, + "externalAppPort": 1106, "logDimseDatasets": false, "rejectUnknownSources": true }, @@ -35,7 +36,6 @@ "password": "password", "virtualHost": "monaideploy", "exchange": "monaideploy", - "exportRequestQueue": "export_tasks" } }, "storage": { diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index d9bcbd3d0..0cbb69366 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -8,6 +8,15 @@ "resolved": "6.0.0", "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.11.0, )", + "resolved": "6.11.0", + "contentHash": "aBaagwdNtVKkug1F3imGXUlmoBd8ZUZX8oQ5niThaJhF79SpESe1Gzq7OFuZkQdKD5Pa4Mone+jrbas873AT4g==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, "Microsoft.AspNetCore.Mvc.WebApiCompatShim": { "type": "Direct", "requested": "[2.2.0, )", @@ -22,11 +31,11 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22" + "Microsoft.EntityFrameworkCore": "6.0.25" } }, "Microsoft.NET.Test.Sdk": { @@ -410,19 +419,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -432,39 +441,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -570,10 +579,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -581,17 +590,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -807,8 +816,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -818,10 +827,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1234,6 +1243,14 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, "System.Console": { "type": "Transitive", "resolved": "4.3.0", @@ -1819,6 +1836,11 @@ "System.Threading.Tasks": "4.3.0" } }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, "System.Security.Cryptography.X509Certificates": { "type": "Transitive", "resolved": "4.3.0", @@ -2053,7 +2075,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -2063,11 +2085,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -2096,7 +2119,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -2116,8 +2139,8 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -2146,9 +2169,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/InformaticsGateway/appsettings.Development.json b/src/InformaticsGateway/appsettings.Development.json old mode 100644 new mode 100755 index 544cb9858..6c6e82c55 --- a/src/InformaticsGateway/appsettings.Development.json +++ b/src/InformaticsGateway/appsettings.Development.json @@ -10,7 +10,7 @@ "InformaticsGateway": { "dicom": { "scp": { - "port": 1104, + "port": 104, "rejectUnknownSources": false } }, @@ -27,8 +27,7 @@ "username": "rabbitmq", "password": "rabbitmq", "virtualHost": "monaideploy", - "exchange": "monaideploy", - "exportRequestQueue": "export_tasks" + "exchange": "monaideploy" } }, "storage": { diff --git a/src/InformaticsGateway/appsettings.Test.json b/src/InformaticsGateway/appsettings.Test.json old mode 100644 new mode 100755 index 5f81a9e72..a2441e86c --- a/src/InformaticsGateway/appsettings.Test.json +++ b/src/InformaticsGateway/appsettings.Test.json @@ -6,6 +6,7 @@ "dicom": { "scp": { "port": 1104, + "externalAppPort": 1106, "rejectUnknownSources": false } }, @@ -23,7 +24,6 @@ "password": "rabbitmq", "virtualHost": "monaideploy", "exchange": "monaideploy", - "exportRequestQueue": "export_tasks" } }, "storage": { diff --git a/src/InformaticsGateway/appsettings.json b/src/InformaticsGateway/appsettings.json index a47b82df3..61dc5b0dc 100755 --- a/src/InformaticsGateway/appsettings.json +++ b/src/InformaticsGateway/appsettings.json @@ -57,6 +57,7 @@ "dicom": { "scp": { "port": 104, + "externalAppPort": 105, "logDimseDatasets": false, "rejectUnknownSources": true }, @@ -82,11 +83,16 @@ "password": "password", "virtualHost": "monaideploy", "exchange": "monaideploy", - "exportRequestQueue": "export_tasks", "deadLetterExchange": "monaideploy-dead-letter", "deliveryLimit": 3, "requeueDelay": 30 + }, + "topics": { + "externalAppRequest": "md.externalapp.request", + "exportHl7": "md.export.hl7", + "exportHl7Complete": "md.export.hl7complete" } + }, "storage": { "localTemporaryStoragePath": "/payloads", diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 743e6d5b1..1778d145c 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -18,13 +18,23 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Direct", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "dependencies": { + "Humanizer.Core": "2.8.26", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + } + }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.4, )", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -76,16 +86,6 @@ "Swashbuckle.AspNetCore.SwaggerUI": "6.5.0" } }, - "AideDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0062", - "contentHash": "9m4nJ5FyKCdmj/hcnPxwKVgerZbxsBT4imyLUmfK+0S+CuRsGurXOVxH3ePKBq8tUbdzv/72pQV1ZaLa8+qj5g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } - }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -152,6 +152,11 @@ "System.Threading.Channels": "6.0.0" } }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.8.26", + "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -191,19 +196,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -213,39 +218,39 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -299,24 +304,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -341,17 +328,6 @@ "System.Text.Json": "6.0.0" } }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -380,10 +356,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -391,17 +367,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -427,34 +403,6 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -497,55 +445,6 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -662,8 +561,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1072,11 +971,6 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" - }, "System.Diagnostics.Tools": { "type": "Transitive", "resolved": "4.3.0", @@ -1798,32 +1692,15 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AideDicomTools": "[0.1.1-rc0062, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", - "Microsoft.Extensions.Configuration": "[6.0.0, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.3, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } - }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1852,7 +1729,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1872,8 +1749,8 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -1902,9 +1779,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs index 908da3313..19c81aa07 100755 --- a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs +++ b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs @@ -20,7 +20,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database; diff --git a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj index bf2bc0cd2..b02fccd0a 100755 --- a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj +++ b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj @@ -47,13 +47,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs index 52f2be710..fee0722da 100755 --- a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs +++ b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs @@ -16,7 +16,7 @@ using System.Text.Json.Serialization; using FellowOakDicom; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution { diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs index 285771f4a..c1e458cf9 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Database; diff --git a/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj b/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj old mode 100644 new mode 100755 index a1070e061..22f46686c --- a/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj +++ b/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj @@ -43,9 +43,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index d16f2b9c1..ac62dee73 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -10,31 +10,31 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "CcL5ajX+/OkafcP5OMplCBnIgSfaQy5BUjEZQKZ9BlspnwFFucy+wcE0LL1ycOlWcDYGI42FnQ45dD1Kcz+ZKA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22" + "Microsoft.EntityFrameworkCore": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -149,6 +149,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -171,19 +176,19 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -193,20 +198,20 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, @@ -449,8 +454,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -460,10 +465,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -1595,11 +1600,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -1629,9 +1635,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 439940cdf..a171e527a 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -4,12 +4,12 @@ "net6.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -19,31 +19,31 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "es9TKd0cpM263Ou0QMEETN7MDzD7kXDkThiiXl1+c/69v97AZlzeLoM5tDdC0RC4L74ZWyk3+WMnoDPL93DDyQ==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", "dependencies": { "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25" } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, @@ -169,6 +169,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.8.26", @@ -191,29 +196,29 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -378,8 +383,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -389,10 +394,10 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -589,11 +594,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } diff --git a/tests/Integration.Test/Common/Assertions.cs b/tests/Integration.Test/Common/Assertions.cs old mode 100644 new mode 100755 index 09d7eeb5f..f0d861570 --- a/tests/Integration.Test/Common/Assertions.cs +++ b/tests/Integration.Test/Common/Assertions.cs @@ -34,7 +34,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.Common { - internal class Assertions + public class Assertions { private readonly Configurations _configurations; private readonly InformaticsGatewayConfiguration _options; @@ -401,5 +401,10 @@ private void CompareDicomFiles(DicomFile left, DicomFile right, DicomTag[] dicom left.Dataset.GetString(tag).Should().Be(right.Dataset.GetString(tag)); } } + + public static void ShouldBeInMessageDictionary(Dictionary messages, HL7.Dotnetcore.Message message) + { + messages.Values.FirstOrDefault(m => m.HL7Message == message.HL7Message).Should().NotBeNull(); + } } } diff --git a/tests/Integration.Test/Common/DataProvider.cs b/tests/Integration.Test/Common/DataProvider.cs old mode 100644 new mode 100755 diff --git a/tests/Integration.Test/Common/DicomCEchoDataClient.cs b/tests/Integration.Test/Common/DicomCEchoDataClient.cs old mode 100644 new mode 100755 index 49918c0e2..645224589 --- a/tests/Integration.Test/Common/DicomCEchoDataClient.cs +++ b/tests/Integration.Test/Common/DicomCEchoDataClient.cs @@ -71,5 +71,6 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) dataProvider.DimseRsponse = DicomStatus.Cancel; } } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/DicomCStoreDataClient.cs b/tests/Integration.Test/Common/DicomCStoreDataClient.cs old mode 100644 new mode 100755 index bd010a8d0..bda321154 --- a/tests/Integration.Test/Common/DicomCStoreDataClient.cs +++ b/tests/Integration.Test/Common/DicomCStoreDataClient.cs @@ -115,5 +115,6 @@ private async Task SendBatchAsync(List files, string callingAeTitle, await dicomClient.SendAsync(); countdownEvent.Wait(timeout); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/DicomWebDataSink.cs b/tests/Integration.Test/Common/DicomWebDataSink.cs old mode 100644 new mode 100755 index 07ad2ee76..fb1bf9644 --- a/tests/Integration.Test/Common/DicomWebDataSink.cs +++ b/tests/Integration.Test/Common/DicomWebDataSink.cs @@ -81,5 +81,6 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) stopwatch.Stop(); _outputHelper.WriteLine($"Time to upload to DICOMWeb={0}s...", stopwatch.Elapsed.TotalSeconds); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/FhirDataSink.cs b/tests/Integration.Test/Common/FhirDataSink.cs old mode 100644 new mode 100755 index 5db77db96..931442e50 --- a/tests/Integration.Test/Common/FhirDataSink.cs +++ b/tests/Integration.Test/Common/FhirDataSink.cs @@ -59,5 +59,6 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) stopwatch.Stop(); _outputHelper.WriteLine($"Time to upload FHIR data={0}s...", stopwatch.Elapsed.TotalSeconds); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/Hl7DataSink.cs b/tests/Integration.Test/Common/Hl7DataSink.cs old mode 100644 new mode 100755 index 0c340e686..65fc0000c --- a/tests/Integration.Test/Common/Hl7DataSink.cs +++ b/tests/Integration.Test/Common/Hl7DataSink.cs @@ -140,5 +140,6 @@ private async Task SendBatchAsync(DataProvider dataProvider, params object[] arg stopwatch.Stop(); _outputHelper.WriteLine($"Took {stopwatch.Elapsed.TotalSeconds}s to send {messages.Count} messages."); } + public Task SaveHl7Async(DataProvider dataProvider, params object[] args) => throw new NotImplementedException(); } } diff --git a/tests/Integration.Test/Common/IDataClient.cs b/tests/Integration.Test/Common/IDataClient.cs old mode 100644 new mode 100755 index 254572b93..07ff97069 --- a/tests/Integration.Test/Common/IDataClient.cs +++ b/tests/Integration.Test/Common/IDataClient.cs @@ -19,5 +19,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.Common internal interface IDataClient { Task SendAsync(DataProvider dataProvider, params object[] args); + + Task SaveHl7Async(DataProvider dataProvider, params object[] args); } } diff --git a/tests/Integration.Test/Common/MinioDataSink.cs b/tests/Integration.Test/Common/MinioDataSink.cs old mode 100644 new mode 100755 index dde07d4a1..f54d61f2e --- a/tests/Integration.Test/Common/MinioDataSink.cs +++ b/tests/Integration.Test/Common/MinioDataSink.cs @@ -15,6 +15,7 @@ */ using System.Diagnostics; +using System.Text; using Minio; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; @@ -69,6 +70,38 @@ await _retryPolicy.ExecuteAsync(async () => }); } + public async Task SaveHl7Async(DataProvider dataProvider, params object[] args) + { + await _retryPolicy.ExecuteAsync(async () => + { + var minioClient = CreateMinioClient(); + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + _outputHelper.WriteLine($"Uploading {dataProvider.HL7Specs.Files.Count} files to MinIO..."); + + foreach (var key in dataProvider.HL7Specs.Files.Keys) + { + var file = dataProvider.HL7Specs.Files[key]; + var filename = $"{args[0]}/{key.Replace(".txt", ".hl7")}"; + var byteArray = Encoding.ASCII.GetBytes(file.HL7Message); + var stream = new MemoryStream(byteArray); + + stream.Position = 0; + var puObjectArgs = new PutObjectArgs(); + puObjectArgs.WithBucket(_options.Storage.StorageServiceBucketName) + .WithObject(filename) + .WithStreamData(stream) + .WithObjectSize(stream.Length); + await minioClient.PutObjectAsync(puObjectArgs); + } + + stopwatch.Stop(); + _outputHelper.WriteLine($"Time to upload to Minio={0}s...", stopwatch.Elapsed.TotalSeconds); + }); + } + private MinioClient CreateMinioClient() => new MinioClient() .WithEndpoint(_options.Storage.Settings["endpoint"]) .WithCredentials(_options.Storage.Settings["accessKey"], _options.Storage.Settings["accessToken"]) diff --git a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs old mode 100644 new mode 100755 index 2c86182b7..cf1ac780c --- a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs +++ b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs @@ -15,6 +15,7 @@ */ using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api; diff --git a/tests/Integration.Test/Features/ExternalApp.feature b/tests/Integration.Test/Features/ExternalApp.feature new file mode 100755 index 000000000..831f0c85d --- /dev/null +++ b/tests/Integration.Test/Features/ExternalApp.feature @@ -0,0 +1,27 @@ + +# Copyright 2023 MONAI Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# @ignored + +Feature: External App Execution + +This feature tests the External App Execution for saving and +re-identifying data sent and received by the MIG respectively. + + @messaging_workflow_request @messaging + Scenario: End-to-end test of external App scp incomming + Given a externalApp study that is exported to the test host + When the externalApp study is received and sent back to Informatics Gateway with 1 message + Then ensure the original externalApp study and the received study are the same diff --git a/tests/Integration.Test/Features/HL7Export.feature b/tests/Integration.Test/Features/HL7Export.feature new file mode 100755 index 000000000..b40748c8e --- /dev/null +++ b/tests/Integration.Test/Features/HL7Export.feature @@ -0,0 +1,32 @@ + +# Copyright 2023 MONAI Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# @ignored + +Feature: HL7 Export + +This feature tests the Export Hl7. + + @messaging_workflow_request @messaging + Scenario: End-to-end test of HL7 exporting + Given a HL7 message that is exported to the test host + When the HL7 Export message is received with 6 messages acked true + Then ensure that exportcomplete messages are sent with success + + + Scenario: End-to-end test of HL7 exporting with no Ack + Given a HL7 message that is exported to the test host + When the HL7 Export message is received with 6 messages acked false + Then ensure that exportcomplete messages are sent with failure diff --git a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature index 00f91acb8..469408574 100755 --- a/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature +++ b/tests/Integration.Test/Features/RemoteAppExecutionPlugIn.feature @@ -31,3 +31,4 @@ re-identifying data sent and received by the MIG respectively. Given a study that is exported to the test host with a bad plugin When the study is received and sent back to Informatics Gateway with 2 messages Then ensure the original study and the received study are the same + diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 0b9c2f48a..6f1d24e3b 100755 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -42,6 +42,7 @@ public sealed class TestHooks private static RabbitMqConsumer s_rabbitMqConsumer_WorkflowRequest; private static RabbitMqConsumer s_rabbitMqConsumer_ArtifactRecieved; private static RabbitMqConsumer s_rabbitMqConsumer_ExportComplete; + private static RabbitMqConsumer s_rabbitMqConsumer_ExportHL7Complete; private static IDatabaseDataProvider s_database; private static DicomScp s_dicomServer; private static DataProvider s_dataProvider; @@ -131,12 +132,20 @@ private static void SetupRabbitMq(ISpecFlowOutputHelper outputHelper, IServiceSc s_rabbitMqConsumer_ExportComplete = new RabbitMqConsumer(rabbitMqSubscriber_ExportComplete, s_options.Value.Messaging.Topics.ExportComplete, outputHelper); + var rabbitMqSubscriber_ExportHL7Complete = new RabbitMQMessageSubscriberService( + Options.Create(s_options.Value.Messaging), + scope.ServiceProvider.GetRequiredService>(), + s_rabbitMqConnectionFactory); + + s_rabbitMqConsumer_ExportHL7Complete = new RabbitMqConsumer(rabbitMqSubscriber_ExportComplete, s_options.Value.Messaging.Topics.ExportHl7Complete, outputHelper); + var rabbitMqSubscriber_ArtifactRecieved = new RabbitMQMessageSubscriberService( Options.Create(s_options.Value.Messaging), scope.ServiceProvider.GetRequiredService>(), s_rabbitMqConnectionFactory); s_rabbitMqConsumer_ArtifactRecieved = new RabbitMqConsumer(rabbitMqSubscriber_ArtifactRecieved, s_options.Value.Messaging.Topics.ArtifactRecieved, outputHelper); + } private static IDatabaseDataProvider GetDatabase(IServiceProvider serviceProvider, ISpecFlowOutputHelper outputHelper) @@ -173,6 +182,7 @@ public void SetUp(ScenarioContext scenarioContext, ISpecFlowOutputHelper outputH _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_WorkflowRequest, "WorkflowRequestSubscriber"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ExportComplete, "ExportCompleteSubscriber"); _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ArtifactRecieved, "ArtifactRecievedSubscriber"); + _objectContainer.RegisterInstanceAs(s_rabbitMqConsumer_ExportHL7Complete, "ExportHL7CompleteSubscriber"); _objectContainer.RegisterInstanceAs(s_dataProvider, "DataProvider"); _objectContainer.RegisterInstanceAs(s_assertions, "Assertions"); _objectContainer.RegisterInstanceAs(s_storescu, "StoreSCU"); @@ -192,6 +202,7 @@ public static void Shtudown() s_rabbitMqConsumer_WorkflowRequest.Dispose(); s_rabbitMqConsumer_ExportComplete.Dispose(); + s_rabbitMqConsumer_ExportHL7Complete.Dispose(); s_rabbitMqConsumer_ArtifactRecieved.Dispose(); s_rabbitMqConnectionFactory.Dispose(); } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index ca7854f19..2d79b05c2 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -30,15 +30,15 @@ - - + + - + diff --git a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs index 739947582..7bad77fa8 100755 --- a/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/DicomDimseScpServicesStepDefinitions.cs @@ -19,6 +19,7 @@ using BoDi; using FellowOakDicom.Network; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs old mode 100644 new mode 100755 index 8ca5811f9..53cae4359 --- a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs @@ -18,7 +18,7 @@ using System.Net.Http.Headers; using Ardalis.GuardClauses; using BoDi; -using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Configuration; diff --git a/tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs new file mode 100755 index 000000000..168155f11 --- /dev/null +++ b/tests/Integration.Test/StepDefinitions/ExteralAppStepDefinitions.cs @@ -0,0 +1,258 @@ +/* + * Copyright 2022-2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Net; +using BoDi; +using FellowOakDicom; +using FellowOakDicom.Network; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Client; +using Monai.Deploy.InformaticsGateway.Client.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Integration.Test.Common; +using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Messaging.RabbitMQ; +using Polly; +using Polly.Timeout; + +namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions +{ + [Binding] + [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] + public class ExteralAppStepDefinitions + { + private static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + private static readonly TimeSpan DicomScpWaitTimeSpan = TimeSpan.FromMinutes(20); + private static readonly string MonaiAeTitle = "REMOTE-APPS"; + private static readonly string SourceAeTitle = "MIGTestHost"; + private static readonly DicomTag[] DicomTags = new[] { DicomTag.AccessionNumber, DicomTag.StudyDescription, DicomTag.SeriesDescription, DicomTag.PatientAddress, DicomTag.PatientAge, DicomTag.PatientName }; + private static readonly List DefaultDicomTags = new() { DicomTag.PatientID, DicomTag.StudyInstanceUID, DicomTag.SeriesInstanceUID, DicomTag.SOPInstanceUID }; + + private readonly ObjectContainer _objectContainer; + private readonly InformaticsGatewayClient _informaticsGatewayClient; + private readonly IDataClient _dataSinkMinio; + private readonly DicomScp _dicomServer; + private readonly Configurations _configuration; + private string _dicomDestination; + private readonly DataProvider _dataProvider; + private readonly RabbitMqConsumer _receivedExportCompletedMessages; + private readonly RabbitMqConsumer _receivedWorkflowRequestMessages; + private readonly RabbitMqConsumer _receivedArtifactRecievedMessages; + private readonly RabbitMQMessagePublisherService _messagePublisher; + private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; + private Dictionary _originalDicomFiles; + private ExternalAppRequestEvent _exportRequestEvent; + private readonly Assertions _assertions; + private readonly string _correlationId = Guid.NewGuid().ToString(); + private readonly string _exportTaskId = Guid.NewGuid().ToString(); + private readonly string _workflowInstanceId = Guid.NewGuid().ToString(); + + public ExteralAppStepDefinitions( + ObjectContainer objectContainer, + Configurations configuration) + { + _objectContainer = objectContainer ?? throw new ArgumentNullException(nameof(objectContainer)); + _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); + _dataSinkMinio = objectContainer.Resolve("MinioClient"); + _dicomServer = objectContainer.Resolve("DicomScp"); + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _dataProvider = objectContainer.Resolve("DataProvider"); + _receivedExportCompletedMessages = objectContainer.Resolve("ExportCompleteSubscriber"); + _receivedWorkflowRequestMessages = objectContainer.Resolve("WorkflowRequestSubscriber"); + _receivedArtifactRecievedMessages = objectContainer.Resolve("ArtifactRecievedSubscriber"); + _messagePublisher = objectContainer.Resolve("MessagingPublisher"); + _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); + _assertions = objectContainer.Resolve("Assertions"); + + DefaultDicomTags.AddRange(DicomTags); + _dicomServer.ClearFilesAndUseHashes = false; //we need to store actual files to send the data back to MIG + } + + [Given(@"a externalApp study that is exported to the test host")] + public async Task GivenAExternalAppStudyThatIsExportedToTheTestHost() + { + DestinationApplicationEntity destination; + try + { + destination = await _informaticsGatewayClient.DicomDestinations.Create(new DestinationApplicationEntity + { + Name = _dicomServer.FeatureScpAeTitle, + AeTitle = _dicomServer.FeatureScpAeTitle, + HostIp = _configuration.InformaticsGatewayOptions.Host, + Port = _dicomServer.FeatureScpPort + }, CancellationToken.None); + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && ex.ProblemDetails.Detail.Contains("already exists")) + { + destination = await _informaticsGatewayClient.DicomDestinations.GetAeTitle(_dicomServer.FeatureScpAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + _dicomDestination = destination.Name; + + // Generate a study with multiple series + //_dataProvider.GenerateDicomData("MG", 1, 1); + _dataProvider.GenerateDicomData("CT", 1); + _dataProvider.InjectRandomData(DicomTags); + _originalDicomFiles = new Dictionary(_dataProvider.DicomSpecs.Files); + + await _dataSinkMinio.SendAsync(_dataProvider); + + // Emit a export request event + _exportRequestEvent = new ExternalAppRequestEvent + { + CorrelationId = _correlationId, + Targets = new List { new DataOrigin { Destination = destination.Name } }, + ExportTaskId = _exportTaskId, + Files = _dataProvider.DicomSpecs.Files.Keys.ToList(), + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = _workflowInstanceId, + DestinationFolder = "ThisIs/My/Output/Folder", + }; + + //_exportRequestEvent.PluginAssemblies.Add(typeof(DicomDeidentifier).AssemblyQualifiedName); + + var message = new JsonMessage( + _exportRequestEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + _exportRequestEvent.CorrelationId, + string.Empty); + + _receivedExportCompletedMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); + await _messagePublisher.Publish("md.externalapp.request", message.ToMessage()); + } + + [When(@"the externalApp study is received and sent back to Informatics Gateway with (.*) message")] + public async Task WhenTheExternalAppStudyIsReceivedAndSentBackToInformaticsGatewayWithMessage(int exportCount) + { + // setup DICOM Source + try + { + await _informaticsGatewayClient.DicomSources.Create(new SourceApplicationEntity + { + Name = SourceAeTitle, + AeTitle = SourceAeTitle, + HostIp = _configuration.InformaticsGatewayOptions.Host, + }, CancellationToken.None); + _dataProvider.Source = SourceAeTitle; + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && + ex.ProblemDetails.Detail.Contains("already exists")) + { + await _informaticsGatewayClient.DicomSources.GetAeTitle(SourceAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + + // setup MONAI Deploy AET + _dataProvider.StudyGrouping = "0020,000D"; + try + { + await _informaticsGatewayClient.MonaiScpAeTitle.Create(new MonaiApplicationEntity + { + AeTitle = MonaiAeTitle, + Name = MonaiAeTitle, + Grouping = _dataProvider.StudyGrouping, + Timeout = 3, + PlugInAssemblies = new List() + }, CancellationToken.None); + _dataProvider.Destination = MonaiAeTitle; + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && + ex.ProblemDetails.Detail.Contains("already exists")) + { + await _informaticsGatewayClient.MonaiScpAeTitle.GetAeTitle(MonaiAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + + var timeoutPolicy = Policy.TimeoutAsync(140, TimeoutStrategy.Pessimistic); + await timeoutPolicy + .ExecuteAsync( + async () => { await SendRequest(exportCount); } + ); + + // Clear workflow request messages + _receivedWorkflowRequestMessages.ClearMessages(); + _receivedArtifactRecievedMessages.ClearMessages(); + + _dataProvider.DimseRsponse.Should().Be(DicomStatus.Success); + + // Wait for workflow request events + (await _receivedArtifactRecievedMessages.WaitforAsync(1, MessageWaitTimeSpan)).Should().BeTrue(); + _assertions.ShouldHaveCorrectNumberOfWorkflowRequestMessages(_dataProvider, DataService.DIMSE, _receivedArtifactRecievedMessages.Messages, 1); + } + + [Then(@"ensure the original externalApp study and the received study are the same")] + public async Task ThenEnsureTheOriginalExternalAppStudyAndTheReceivedStudyAreTheSame() + { + var workflowRequestEvent = _receivedArtifactRecievedMessages.Messages[0].ConvertTo(); + _exportRequestEvent.CorrelationId.Should().Be(_receivedArtifactRecievedMessages.Messages[0].CorrelationId); + _exportRequestEvent.CorrelationId.Should().Be(workflowRequestEvent.CorrelationId); + _exportRequestEvent.WorkflowInstanceId.Should().Be(workflowRequestEvent.WorkflowInstanceId); + _exportRequestEvent.ExportTaskId.Should().Be(workflowRequestEvent.TaskId); + await _assertions.ShouldRestoreAllDicomMetaata(_receivedArtifactRecievedMessages.Messages, _originalDicomFiles, DefaultDicomTags.ToArray()).ConfigureAwait(false); + } + + private async Task SendRequest(int exportCount = 1) + { + // Wait for export completed event + (await _receivedExportCompletedMessages.WaitforAsync(exportCount, DicomScpWaitTimeSpan)).Should().BeTrue(); + + foreach (var key in _dataProvider.DicomSpecs.FileHashes.Keys) + { + (await Extensions.WaitUntil(() => _dicomServer.Instances.ContainsKey(key), DicomScpWaitTimeSpan)).Should().BeTrue("{0} should be received", key); + } + + // Send data received back to MIG + var storeScu = _objectContainer.Resolve("StoreSCU"); + + var host = _configuration.InformaticsGatewayOptions.Host; + var port = _informaticsGatewayConfiguration.Dicom.Scp.ExternalAppPort; + + _dataProvider.Workflows = null; + _dataProvider.DicomSpecs.Files.Clear(); + _dataProvider.DicomSpecs.Files = new Dictionary(_dicomServer.DicomFiles); + _dataProvider.DicomSpecs.Files.Should().NotBeNull(); + + await storeScu.SendAsync( + _dataProvider, + SourceAeTitle, + host, + port, + MonaiAeTitle); + } + } +} diff --git a/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs new file mode 100755 index 000000000..be93a8bce --- /dev/null +++ b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs @@ -0,0 +1,237 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using BoDi; +using FellowOakDicom; +using Monai.Deploy.InformaticsGateway.Api.Models; +using Monai.Deploy.InformaticsGateway.Client; +using Monai.Deploy.InformaticsGateway.Client.Common; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Integration.Test.Common; +using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; +using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; +using Monai.Deploy.Messaging.RabbitMQ; +using System.Net; +using System.Net.Sockets; +using System.Text; + +namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions +{ + [Binding] + [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] + + internal class Hl7StepDEfinitions + { + private static readonly TimeSpan MessageWaitTimeSpan = TimeSpan.FromMinutes(3); + private static readonly DicomTag[] DicomTags = new[] { DicomTag.AccessionNumber, DicomTag.StudyDescription, DicomTag.SeriesDescription, DicomTag.PatientAddress, DicomTag.PatientAge, DicomTag.PatientName }; + private static readonly List DefaultDicomTags = new() { DicomTag.PatientID, DicomTag.StudyInstanceUID, DicomTag.SeriesInstanceUID, DicomTag.SOPInstanceUID }; + + private readonly ObjectContainer _objectContainer; + private readonly InformaticsGatewayClient _informaticsGatewayClient; + private readonly IDataClient _dataSinkMinio; + private readonly DicomScp _dicomServer; + private readonly Configurations _configuration; + private string _dicomDestination; + private readonly DataProvider _dataProvider; + private readonly RabbitMqConsumer _receivedExportHL7CompletedMessages; + private readonly RabbitMQMessagePublisherService _messagePublisher; + private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; + private Dictionary _originalHL7Files; + private ExportRequestEvent _exportRequestEvent; + private readonly Assertions _assertions; + private readonly string _correlationId = Guid.NewGuid().ToString(); + private readonly string _exportTaskId = Guid.NewGuid().ToString(); + private readonly string _workflowInstanceId = Guid.NewGuid().ToString(); + internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromSeconds(30); + private readonly string _hl7SendAddress = "127.0.0.1"; + private readonly int _hl7Port = 2574; + private JsonMessage _messageToSend; + + private readonly List _hl7Messages = new List(); + private TcpListener _tcpListener; + + public Hl7StepDEfinitions(ObjectContainer objectContainer, Configurations configuration) + { + _objectContainer = objectContainer ?? throw new ArgumentNullException(nameof(objectContainer)); + _informaticsGatewayClient = objectContainer.Resolve("InformaticsGatewayClient"); + _dataSinkMinio = objectContainer.Resolve("MinioClient"); + _dicomServer = objectContainer.Resolve("DicomScp"); + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + _dataProvider = objectContainer.Resolve("DataProvider"); + _receivedExportHL7CompletedMessages = objectContainer.Resolve("ExportHL7CompleteSubscriber"); + _messagePublisher = objectContainer.Resolve("MessagingPublisher"); + _informaticsGatewayConfiguration = objectContainer.Resolve("InformaticsGatewayConfiguration"); + _assertions = objectContainer.Resolve("Assertions"); + + DefaultDicomTags.AddRange(DicomTags); + _dicomServer.ClearFilesAndUseHashes = false; //we need to store actual files to send the data back to MIG + } + + [Given(@"a HL7 message that is exported to the test host")] + public async Task GivenAHLMessageThatIsExportedToTheTestHost() + { + HL7DestinationEntity destination; + try + { + destination = await _informaticsGatewayClient.HL7Destinations.Create(new HL7DestinationEntity + { + Name = _dicomServer.FeatureScpAeTitle, + AeTitle = _dicomServer.FeatureScpAeTitle, + HostIp = _hl7SendAddress, + Port = _hl7Port + }, CancellationToken.None); + } + catch (ProblemException ex) + { + if (ex.ProblemDetails.Status == (int)HttpStatusCode.Conflict && ex.ProblemDetails.Detail.Contains("already exists")) + { + destination = await _informaticsGatewayClient.HL7Destinations.GetAeTitle(_dicomServer.FeatureScpAeTitle, CancellationToken.None); + } + else + { + throw; + } + } + _dicomDestination = destination.Name; + + // Generate a study with multiple series + //_dataProvider.GenerateDicomData("MG", 1, 1); + await _dataProvider.GenerateHl7Messages("2.3"); + + _originalHL7Files = new Dictionary(_dataProvider.HL7Specs.Files); + + var path = "hl7filepath"; + await _dataSinkMinio.SaveHl7Async(_dataProvider, path); + + // Emit a export request event + _exportRequestEvent = new ExportRequestEvent + { + CorrelationId = _correlationId, + Destinations = new string[] { destination.Name }, + ExportTaskId = _exportTaskId, + Files = _dataProvider.HL7Specs.Files.Keys.Select(f => $"{path}/{f.Replace(".txt", ".hl7")}"), + MessageId = Guid.NewGuid().ToString(), + WorkflowInstanceId = _workflowInstanceId, + PayloadId = "ThisIs/My/Output/Folder", + }; + + _messageToSend = new JsonMessage( + _exportRequestEvent, + MessageBrokerConfiguration.InformaticsGatewayApplicationId, + _exportRequestEvent.CorrelationId, + string.Empty); + + } + + [When(@"the HL7 Export message is received with (.*) messages acked (.*)")] + public async Task WhenTheHL7ExportMessageIsReceivedWithMessagesAcked(int messageCount, bool acked) + { + var cancellationToken = new CancellationToken(); + + _tcpListener = new System.Net.Sockets.TcpListener(IPAddress.Parse(_hl7SendAddress), _hl7Port); + _tcpListener.Start(); + + await _messagePublisher.Publish("md.export.hl7", _messageToSend.ToMessage()); + + List recievedMessages = new List(); + + for (int i = 0; i < messageCount; i++) + { + using var _client = await _tcpListener.AcceptTcpClientAsync(cancellationToken).ConfigureAwait(false); + await GetMessageAsync(_client, acked, cancellationToken); + if (_hl7Messages.Count == messageCount) + { break; } + } + + _tcpListener.Stop(); + } + + private async Task GetMessageAsync(TcpClient _client, bool acked, CancellationToken cancellationToken) + { + var messages = new List(); + using var _clientStream = _client.GetStream(); + _clientStream.ReadTimeout = 5000; + _clientStream.WriteTimeout = 5000; + var buffer = new byte[10240]; + + var s_cts = new CancellationTokenSource(); + s_cts.CancelAfter(60000); + + var bytesRead = _clientStream.Read(buffer, 0, buffer.Length); + + + if (bytesRead == 0 || s_cts.IsCancellationRequested) + { + return; + } + + var data = Encoding.UTF8.GetString(buffer.ToArray()); + + var _rawHl7Messages = HL7.Dotnetcore.MessageHelper.ExtractMessages(data); + foreach (var message in _rawHl7Messages) + { + var hl7Message = new HL7.Dotnetcore.Message(message); + hl7Message.ParseMessage(); + _hl7Messages.Add(hl7Message); + if (acked) + { await SendAcknowledgment(_clientStream, hl7Message, cancellationToken); } + } + return; + } + + [Then(@"ensure that exportcomplete messages are sent with (.*)")] + public async Task ThenEnsureThatExportcompleteMessagesAreSentWithSuscess(string valid) + { + var success = await _receivedExportHL7CompletedMessages.WaitforAsync(1, TimeSpan.FromSeconds(600)); + Assert.Equal(1, _receivedExportHL7CompletedMessages.Messages.Count); + var message = _receivedExportHL7CompletedMessages.Messages.First(); + var exportEvent = message.ConvertTo(); + var status = exportEvent.Status; + if (valid == "success") + { + Assert.Equal(ExportStatus.Success, status); + } + else if (valid == "failure") + { + Assert.Equal(ExportStatus.Failure, status); + } + + foreach (var hl7message in _hl7Messages) + { + Assertions.ShouldBeInMessageDictionary(_originalHL7Files, hl7message); + } + } + + private async Task SendAcknowledgment(NetworkStream networkStream, HL7.Dotnetcore.Message message, CancellationToken cancellationToken) + { + if (message == null) { return; } + var ackMessage = message.GetACK(); + var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); + { + try + { + await networkStream.WriteAsync(ackData, cancellationToken).ConfigureAwait(false); + await networkStream.FlushAsync(cancellationToken).ConfigureAwait(false); + } + catch (Exception) + { + throw; + } + } + } + } +} diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index 02984c323..55e7137cf 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -19,12 +19,12 @@ using FellowOakDicom; using FellowOakDicom.Network; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Client; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; -//using Monai.Deploy.InformaticsGateway.PlugIns.Pseudonymisation; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; @@ -211,7 +211,7 @@ public async Task AStudyThatIsExportedToTheTestHostBadPlugin() } [When(@"the study is received and sent back to Informatics Gateway with (.*) messages")] - public async Task TheStudyIsReceivedAndSentBackToInformaticsGateway(int exportCount = 1) + public async Task WhenTheStudyIsReceivedAndSentBackToInformaticsGatewayWith(int exportCount) { // setup DICOM Source diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index 4268c4f29..8e3d304b6 100755 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -5,6 +5,25 @@ "plugins": { "remoteApp": { "ReplaceTags": "AccessionNumber, StudyDescription, SeriesDescription, PatientAddress, PatientAge, PatientName" + }, + "Pseudonymise": { + "ConnectionString": "mongodb://root:rootpassword@localhost:27017", + "DatabaseName": "InformaticsGateway", + "EncriptionClientTimeoutSeconds": "900", + "ExpiresAfterDays": "1", + "ExternalAppTaskInboundKeepTags": "0020 000E, 0020 0010, 0020 00013, 0008 0018, 0020 000E", + "ImportantTags": "0010 0020, 0008 0018, 0008 0016, 0020 000D, 0020 000E, 0020 0010,0008 1155, 0008 0014, 0008 0050, 0008 0080, 0008 0081, 0008 0090, 0008 0092, 0008 0094, 0008 1010, 0008 1030, 0008 103E, 0008 1040, 0008 1048,0008 1050, 0008 1060, 0008 1070, 0008 1080, 0008 2111, 0010 0010, 0010 0030, 0010 0030, 0010 0032, 0010 0040, 0010 1000, 0010 1001, 0010 1001, 0010 1010, 0010 1020, 0010 1030, 0010 1090, 0010 2160, 0010 2180, 0010 21B0, 0010 4000, 0018 1000, 0018 1030, 0020 0052, 0020 0200, 0020 4000, 0040 0275, 0040 A124, 0040 A730, 0088 0140, 3006 0024, 3006 00C2", + "SecurityProfile": "\t\t\t\t0010,0020;K;;;;;;;;;;\r\n\t\t\t\t0008,0018;C;;;;;;;;;;\r\n\t\t\t\t0008,0016;K;;;;;;;;;;\r\n\t\t\t\t0020,000D;K;;;;;;;;;;\r\n\t\t\t\t0020,000E;C;;;;;;;;;;\r\n\t\t\t\t0020,0010;C;;;;;;;;;;\r\n\t\t\t\t0008,1155;C;;;;;;;;;;\r\n\t\t\t\t0008,0014;X;;;;;;;;;;\r\n\t\t\t\t0008,0050;K;;;;;;;;;;\r\n\t\t\t\t0008,0080;X;;;;;;;;;;\r\n\t\t\t\t0008,0081;X;;;;;;;;;;\r\n\t\t\t\t0008,0090;X;;;;;;;;;;\r\n\t\t\t\t0008,0092;X;;;;;;;;;;\r\n\t\t\t\t0008,0094;X;;;;;;;;;;\r\n\t\t\t\t0008,1010;X;;;;;;;;;;\r\n\t\t\t\t0008,1030;X;;;;;;;;;;\r\n\t\t\t\t0008,103E;X;;;;;;;;;;\r\n\t\t\t\t0008,1040;X;;;;;;;;;;\r\n\t\t\t\t0008,1048;X;;;;;;;;;;\r\n\t\t\t\t0008,1050;X;;;;;;;;;;\r\n\t\t\t\t0008,1060;X;;;;;;;;;;\r\n\t\t\t\t0008,1070;X;;;;;;;;;;\r\n\t\t\t\t0008,1080;X;;;;;;;;;;\r\n\t\t\t\t0008,2111;X;;;;;;;;;;\r\n\t\t\t\t0010,0010;X;;;;;;;;;;\r\n\t\t\t\t0010,0030;X;;;;;;;;;;\r\n\t\t\t\t0010,0030;X;;;;;;;;;;\r\n\t\t\t\t0010,0032;X;;;;;;;;;;\r\n\t\t\t\t0010,0040;X;;;;;;;;;;\r\n\t\t\t\t0010,1000;X;;;;;;;;;;\r\n\t\t\t\t0010,1001;X;;;;;;;;;;\r\n\t\t\t\t0010,1001;X;;;;;;;;;;\r\n\t\t\t\t0010,1010;X;;;;;;;;;;\r\n\t\t\t\t0010,1020;X;;;;;;;;;;\r\n\t\t\t\t0010,1030;X;;;;;;;;;;\r\n\t\t\t\t0010,1090;X;;;;;;;;;;\r\n\t\t\t\t0010,2160;X;;;;;;;;;;\r\n\t\t\t\t0010,2180;X;;;;;;;;;;\r\n\t\t\t\t0010,21B0;X;;;;;;;;;;\r\n\t\t\t\t0010,4000;X;;;;;;;;;;\r\n\t\t\t\t\r\n\t\t\t\t0018,1000;X;;;;;;;;;;\r\n\t\t\t\t0018,1030;X;;;;;;;;;;\r\n\t\t\t\t0020,0052;X;;;;;;;;;;\r\n\t\t\t\t0020,0200;X;;;;;;;;;;\r\n\t\t\t\t0020,4000;X;;;;;;;;;;\r\n\t\t\t\t0040,0275;X;;;;;;;;;;\r\n\t\t\t\t0040,A124;X;;;;;;;;;;\r\n\t\t\t\t0040,A730;X;;;;;;;;;;\r\n\t\t\t\t0088,0140;X;;;;;;;;;;\r\n\t\t\t\t3006,0024;X;;;;;;;;;;\r\n\t\t\t\t3006,00C2;X;;;;;;;;;;\r\n\t\t\t\t", + "KMS": { + "KeyVaultNamespace": "InformaticsGateway.KeyVault", + "AWS": { + "accessKeyId": "", + "arnKey": "", + "roleArnToAssume": "", + "region": "eu-west-2", + "secretAccessKey": "" + } + } } }, "ConnectionStrings": { @@ -25,6 +44,7 @@ "dicom": { "scp": { "port": 1104, + "externalAppPort": 1106, "logDimseDatasets": false, "rejectUnknownSources": true }, @@ -80,7 +100,7 @@ "hl7": { "port": 2575, "maximumNumberOfConnections": 10, - "clientTimeout": 60000, + "clientTimeout": 200, "sendAck": true } }, diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index ea3e1fea5..9a208b6ce 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -44,12 +44,12 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "vNe+y8ZsEf1CsfmfYttfKAz/IgCCtphgguvao0HWNJNdjZf9cabD288nZJ17b/WaQMWXhLwYAsofk8vNVkfTOA==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.22", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.22", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.Logging": "6.0.0", @@ -59,11 +59,11 @@ }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.22, )", - "resolved": "6.0.22", - "contentHash": "EDKnYZtxq7P131xxLsEokda86WnFRiVAveLVAYR8kzyWl/UwTpf/RS2m2FrbH/U8vX3A+IQNpabtxcjtCUrY0g==", + "requested": "[6.0.25, )", + "resolved": "6.0.25", + "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.22", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" } }, @@ -132,11 +132,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.4, )", - "resolved": "1.0.4", - "contentHash": "2llZ4XbE91Km2Q+JEKSSeTyhZLWRq3lN5xQ6+Klqow3V8SXBAlOQQ+b5//BEm6x0QdoycFberMOVAsZYYM0j7g==", + "requested": "[1.0.5, )", + "resolved": "1.0.5", + "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.4", + "Monai.Deploy.Messaging": "1.0.5", "Polly": "7.2.4", "RabbitMQ.Client": "6.5.0" } @@ -226,6 +226,16 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, + "AnswerDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0089", + "contentHash": "DgDBjo708kHmr0lUdUrYaRLjmaICrJMBh6w/Vd0E/r2SJ0DDiQuxMABJzIwXwrVFSzrrwpqPqWBQMTCY++9uPQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.1", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -345,38 +355,38 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "gtIGHbGnRq/h4mFSJYr9BdMObvJV/a67nBubs50VjPDusQARtWJzeVTirDWsbL1qTvGzbbZCD7VE7+s2ixZfow==", + "resolved": "6.0.25", + "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", "dependencies": { "SQLitePCLRaw.core": "2.1.2" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "3ycEYrtWoa4kv5mUECU2LNBbWiYh345b1uQLvg4pHCEICXoJZ8Sfu/2yGloKiMNgMdDc02gFYCRHxsqQNZpnWA==" + "resolved": "6.0.25", + "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "82SZfdrLe7bdDB8/3INV0UULvlUzsdHkrEYylDCrzFXRWHXG9eO5jJQjRHU8j9XkGIN+MSPgIlczBnqeDvB36A==" + "resolved": "6.0.25", + "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "W7yfdEbEuS1OPPxU0EOA6haqI4uvzs7OwHKh81DiJFn3NFNP2ztSovkOzBDhTwHX0j+OySsAj3BEJhuzTVYIVw==", + "resolved": "6.0.25", + "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.22", + "Microsoft.EntityFrameworkCore": "6.0.25", "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "xSU77ORQgwlD+s5Cmlk9DzoSCu5oxlHLuQl+v5zAZ0Uv5yH17hp02TBfz3x9nBA+CrIsqaLjGEuyZmLDf/5ATw==", + "resolved": "6.0.25", + "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.22", - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", + "Microsoft.Data.Sqlite.Core": "6.0.25", + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", "Microsoft.Extensions.DependencyModel": "6.0.0" } }, @@ -413,6 +423,15 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -425,6 +444,17 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -453,10 +483,10 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "HB1Zp1NY9m+HwYKLZBgUfNIt0xXzm4APARDuAIPODl8pT4g10oOiEDN8asOzx/sfL9xM+Sse5Zne9L+6qYi/iA==", + "resolved": "6.0.25", + "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" @@ -464,17 +494,17 @@ }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "yvz+0r3qAt6gNEKlGSBO1BXMhtD3Tt8yzU59dHASolpwlSHvgqy0tEP6KXn3MPoKlPr0CiAHUdzOwYSoljzRSg==" + "resolved": "6.0.25", + "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.22", - "contentHash": "PNj+/e/GCJh3ZNzxEGhkMpKJgmmbuGar6Uk/R3mPFZacTx6lBdLs4Ev7uf4XQWqTdJe56rK+2P3oF/9jIGbxgw==", + "resolved": "6.0.25", + "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.22", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.22" + "Microsoft.EntityFrameworkCore.Relational": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -500,6 +530,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -542,6 +600,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -666,8 +773,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.4", - "contentHash": "K6RrbDh7upokvt+sKuKEhQ+B1Xj46DF4sHxqwE6ymZazwmRULzsD0u/1IeDDJCGuRs3iG64QWwCt32j30PSZLg==", + "resolved": "1.0.5", + "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", "dependencies": { "Ardalis.GuardClauses": "4.1.1", "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", @@ -1941,6 +2048,25 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AnswerDicomTools": "[0.1.1-rc0089, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "HL7-dotnetcore": "[2.36.0, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", + "Microsoft.Extensions.Configuration": "[6.0.1, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.4, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -1954,7 +2080,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Security": "[0.1.3, )", "Monai.Deploy.Storage.MinIO": "[0.2.18, )", "NLog.Web.AspNetCore": "[5.3.4, )", @@ -1964,11 +2090,12 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.22, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.4, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.4, )", + "Monai.Deploy.Messaging": "[1.0.5, )", + "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", "Monai.Deploy.Storage": "[0.2.18, )", "fo-dicom": "[5.1.1, )" } @@ -2004,7 +2131,7 @@ "type": "Project", "dependencies": { "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.22, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -2024,8 +2151,8 @@ "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", @@ -2054,9 +2181,9 @@ "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.22, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.22, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", "Microsoft.Extensions.Configuration": "[6.0.1, )", "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", From 70561efc94181ed2137c0a45d575d2433f324ff0 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 8 Dec 2023 12:46:51 +0000 Subject: [PATCH 53/75] fix up merge Signed-off-by: Neil South --- .../Services/HealthLevel7/IMllpExtract.cs | 28 ------------------- .../Services/HealthLevel7/IMllpService.cs | 27 ------------------ 2 files changed, 55 deletions(-) delete mode 100755 src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs delete mode 100755 src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs deleted file mode 100755 index 8fd8bbf37..000000000 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2023 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -using System.Threading.Tasks; -using HL7.Dotnetcore; -using Monai.Deploy.InformaticsGateway.Api.Storage; - -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 -{ - internal interface IMllpExtract - { - Task ExtractInfo(Hl7FileStorageMetadata meta, Message message); - } -} diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs deleted file mode 100755 index 6272464b2..000000000 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2023 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System.Net; -using System.Threading; -using System.Threading.Tasks; - -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 -{ - public interface IMllpService - { - Task SendMllp(IPAddress address, int port, string hl7Message, CancellationToken cancellationToken); - } -} From c1cbbafdff77acb0a1c324dd108f884e001776fd Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 8 Dec 2023 14:44:58 +0000 Subject: [PATCH 54/75] fix for tests Signed-off-by: Neil South --- src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs | 2 +- .../Test/Services/Common/InputHL7DataPlugInEngineTest.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index 520043b0d..a090d610d 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -143,7 +143,7 @@ private async Task> ReceiveData(INetworkStream clientStream, Canc } } while (true); } - linkedCancellationTokenSource.Dispose(); + // linkedCancellationTokenSource.Dispose(); return messages; } diff --git a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs index 4f3298a7b..295322227 100755 --- a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs @@ -133,7 +133,7 @@ public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalled_Exp var message = new HL7.Dotnetcore.Message(SampleMessage); message.ParseMessage(); - var configItem = new Hl7ApplicationConfigEntity { PlugInAssemblies = new List { { "TestInputHL7DataPlugInAddWorkflow" } } }; + var configItem = new Hl7ApplicationConfigEntity { PlugInAssemblies = new List { { "Monai.Deploy.InformaticsGateway.Test.PlugIns.TestInputHL7DataPlugInAddWorkflow" } } }; var (Hl7Message, resultDicomInfo) = await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, configItem); From be40523d7029fe40616228ad8e39a8f29367882d Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 8 Dec 2023 15:03:54 +0000 Subject: [PATCH 55/75] fix test Signed-off-by: Neil South --- src/InformaticsGateway/Services/HealthLevel7/MllpService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 7f247c1b2..00c91d4ef 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -215,7 +215,7 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) private async Task ConfigurePlugInEngine() { var configs = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); - if (configs is not null && configs.Max(c => c.LastModified) > _lastConfigRead) + if (configs is not null && configs.Any() && configs.Max(c => c.LastModified) > _lastConfigRead) { var pluginAssemblies = new List(); foreach (var config in configs.Where(p => p.PlugInAssemblies is not null && p.PlugInAssemblies.Count > 0)) From 634a484307407d266acac3267e248bdb508d9327 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 11 Dec 2023 09:23:40 +0000 Subject: [PATCH 56/75] disposing of linkedcancellationToken Signed-off-by: Neil South --- src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index a090d610d..520043b0d 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -143,7 +143,7 @@ private async Task> ReceiveData(INetworkStream clientStream, Canc } } while (true); } - // linkedCancellationTokenSource.Dispose(); + linkedCancellationTokenSource.Dispose(); return messages; } From 56c76cb4933ad4b77d19ce9ffdc0af93cadd9ff1 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 11 Dec 2023 10:04:01 +0000 Subject: [PATCH 57/75] some fixups Signed-off-by: Neil South --- src/Api/Hl7ApplicationConfigEntity.cs | 2 +- .../Services/Common/InputHL7DataPlugInEngine.cs | 2 +- .../Services/Export/ExportServiceBase.cs | 1 - .../Services/HealthLevel7/MllpExtract.cs | 4 ++-- .../Services/HealthLevel7/MllpService.cs | 7 +++---- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs index 3025cb967..66cc080e3 100755 --- a/src/Api/Hl7ApplicationConfigEntity.cs +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -26,7 +26,7 @@ namespace Monai.Deploy.InformaticsGateway.Api { - public class Hl7ApplicationConfigEntity : MongoDBEntityBase + public sealed class Hl7ApplicationConfigEntity : MongoDBEntityBase { /// /// Gets or sets the name of a Hl7 application entity. diff --git a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs index bd8fdea29..4485d1bc8 100755 --- a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs @@ -55,7 +55,7 @@ public async Task> ExecutePlugInsAsync(Messa foreach (var plugin in _plugsins) { var nm = plugin.ToString(); - if (configItem is not null && configItem.PlugInAssemblies.Any(a => a.StartsWith(plugin.ToString()!))) + if (configItem is not null && configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) { _logger.ExecutingInputDataPlugIn(plugin.Name); (hl7File, fileMetadata) = await plugin.ExecuteAsync(hl7File, fileMetadata).ConfigureAwait(false); diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index 0a80875f3..b6f73b1c6 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -138,7 +138,6 @@ public async Task StopAsync(CancellationToken cancellationToken) await Task.Delay(250).ConfigureAwait(false); #pragma warning restore CA2016 // Forward the 'CancellationToken' parameter to methods _cancellationTokenSource.Dispose(); - return; } private void SetupPolling() diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs index 7e9ed24d3..e579db251 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -105,9 +105,9 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess switch (type) { case DataLinkType.PatientId: - return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; + return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); case DataLinkType.StudyInstanceUid: - return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; + return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); default: break; } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 00c91d4ef..942b5d1c8 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -62,7 +62,7 @@ internal sealed class MllpService : IMllpService, IHostedService, IDisposable, I private readonly IMllpExtract _mIIpExtract; private readonly IInputHL7DataPlugInEngine _inputHL7DataPlugInEngine; private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; - private DateTime _lastConfigRead = new(2000, 1, 1); + private DateTime _lastConfigRead = new DateTime(2000, 1, 1); public int ActiveConnections { @@ -218,12 +218,11 @@ private async Task ConfigurePlugInEngine() if (configs is not null && configs.Any() && configs.Max(c => c.LastModified) > _lastConfigRead) { var pluginAssemblies = new List(); - foreach (var config in configs.Where(p => p.PlugInAssemblies is not null && p.PlugInAssemblies.Count > 0)) + foreach (var config in configs.Where(p => p.PlugInAssemblies?.Count > 0)) { try { - var addMe = config.PlugInAssemblies.Where(p => pluginAssemblies.Any(a => a == p) is false); - pluginAssemblies.AddRange(config.PlugInAssemblies.Where(p => pluginAssemblies.Any(a => a == p) is false)); + pluginAssemblies.AddRange(config.PlugInAssemblies.Where(p => pluginAssemblies.Contains(p) is false)); } catch (Exception ex) { From bf0a592da7dc736add54fda3f98b53e68f725523 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 11 Dec 2023 10:15:53 +0000 Subject: [PATCH 58/75] more sonar cloud sugestions Signed-off-by: Neil South --- src/Api/Hl7ApplicationConfigEntity.cs | 4 ++-- .../Services/Common/InputHL7DataPlugInEngine.cs | 1 - src/InformaticsGateway/Services/HealthLevel7/MllpService.cs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs index 66cc080e3..7ff56855e 100755 --- a/src/Api/Hl7ApplicationConfigEntity.cs +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -116,7 +116,7 @@ public override string ToString() } //string key, string value - public class StringKeyValuePair : IKeyValuePair + public sealed class StringKeyValuePair : IKeyValuePair { [Key] public string Key { get; set; } = string.Empty; @@ -138,7 +138,7 @@ public static List FromDictionary(Dictionary } - public class DataKeyValuePair : IKeyValuePair + public sealed class DataKeyValuePair : IKeyValuePair { [Key] public string Key { get; set; } = string.Empty; diff --git a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs index 4485d1bc8..a4abac3f0 100755 --- a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs @@ -54,7 +54,6 @@ public async Task> ExecutePlugInsAsync(Messa foreach (var plugin in _plugsins) { - var nm = plugin.ToString(); if (configItem is not null && configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) { _logger.ExecutingInputDataPlugIn(plugin.Name); diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 942b5d1c8..b105b58ec 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -62,7 +62,7 @@ internal sealed class MllpService : IMllpService, IHostedService, IDisposable, I private readonly IMllpExtract _mIIpExtract; private readonly IInputHL7DataPlugInEngine _inputHL7DataPlugInEngine; private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; - private DateTime _lastConfigRead = new DateTime(2000, 1, 1); + private DateTime _lastConfigRead = new(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); public int ActiveConnections { From 6c34ffeee9f231524b4c11dad7fcccd4741ef998 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 11 Dec 2023 11:14:49 +0000 Subject: [PATCH 59/75] more sonar cloud sugestions Signed-off-by: Neil South --- src/Api/Hl7ApplicationConfigEntity.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs index 7ff56855e..3cc3160d9 100755 --- a/src/Api/Hl7ApplicationConfigEntity.cs +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -116,7 +116,7 @@ public override string ToString() } //string key, string value - public sealed class StringKeyValuePair : IKeyValuePair + public sealed class StringKeyValuePair : IKeyValuePair, IEquatable { [Key] public string Key { get; set; } = string.Empty; @@ -138,7 +138,7 @@ public static List FromDictionary(Dictionary } - public sealed class DataKeyValuePair : IKeyValuePair + public sealed class DataKeyValuePair : IKeyValuePair, IEquatable { [Key] public string Key { get; set; } = string.Empty; From 11721d41cc308619fec751068820fa6ae48c8ae2 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Tue, 9 Jan 2024 08:39:06 -0800 Subject: [PATCH 60/75] Upgrade to .NET 8.0 (#506) * Upgrade to .NET 8.0 Signed-off-by: Victor Chang --- .github/workflows/ci.yml | 22 +- .licenserc.yaml | 1 + Dockerfile | 4 +- doc/dependency_decisions.yml | 3279 +- docs/compliance/third-party-licenses.md | 28755 ++++++---------- docs/docfx.json | 2 +- global.json | 2 +- src/Api/LoggingDataDictionary.cs | 7 - ...Monai.Deploy.InformaticsGateway.Api.csproj | 25 +- src/Api/Rest/InferenceRequestException.cs | 6 - src/Api/Storage/FileStorageMetadata.cs | 3 - ....Deploy.InformaticsGateway.Api.Test.csproj | 19 +- src/Api/Test/Storage/PayloadTest.cs | 6 +- src/Api/Test/packages.lock.json | 296 +- src/Api/packages.lock.json | 214 +- src/CLI/Commands/AetCommand.cs | 4 +- src/CLI/Commands/CommandBase.cs | 2 +- src/CLI/Commands/ConfigCommand.cs | 22 +- src/CLI/Commands/ConfigurationException.cs | 6 - src/CLI/Commands/DestinationCommand.cs | 20 +- src/CLI/Commands/SourceCommand.cs | 12 +- src/CLI/ControlException.cs | 17 - src/CLI/Logging/ConsoleLogger.cs | 4 +- ...Monai.Deploy.InformaticsGateway.CLI.csproj | 14 +- .../Services/ConfigurationOptionAccessor.cs | 44 +- src/CLI/Services/ConfigurationService.cs | 2 +- src/CLI/Services/ControlService.cs | 2 +- src/CLI/Services/DockerRunner.cs | 14 +- src/CLI/Services/EmbeddedResource.cs | 4 +- src/CLI/Services/IContainerRunner.cs | 14 +- .../NLogConfigurationOptionAccessor.cs | 6 +- src/CLI/Services/Runner.cs | 1 + src/CLI/Test/ConfigurationServiceTest.cs | 4 +- src/CLI/Test/ControlExceptionTest.cs | 54 - ....Deploy.InformaticsGateway.CLI.Test.csproj | 21 +- src/CLI/Test/packages.lock.json | 377 +- src/CLI/packages.lock.json | 289 +- ...oy.InformaticsGateway.Client.Common.csproj | 13 +- src/Client.Common/ProblemDetails.cs | 3 - src/Client.Common/ProblemException.cs | 19 - ...formaticsGateway.Client.Common.Test.csproj | 20 +- .../Test/ProblemExceptionTest.cs | 62 - src/Client.Common/Test/packages.lock.json | 87 +- src/Client.Common/packages.lock.json | 14 +- ...ai.Deploy.InformaticsGateway.Client.csproj | 10 +- .../Test/HttpResponseMessageExtensionsTest.cs | 2 +- ...ploy.InformaticsGateway.Client.Test.csproj | 18 +- src/Client/Test/packages.lock.json | 951 +- src/Client/packages.lock.json | 210 +- ...ai.Deploy.InformaticsGateway.Common.csproj | 16 +- src/Common/Test/ExtensionMethodsTest.cs | 2 +- ...ploy.InformaticsGateway.Common.Test.csproj | 21 +- src/Common/Test/packages.lock.json | 127 +- src/Common/packages.lock.json | 37 +- src/Configuration/ConfigurationException.cs | 9 +- ...oy.InformaticsGateway.Configuration.csproj | 10 +- ...formaticsGateway.Configuration.Test.csproj | 21 +- src/Configuration/Test/packages.lock.json | 302 +- src/Configuration/packages.lock.json | 214 +- src/Database/Api/DatabaseException.cs | 7 - ...loy.InformaticsGateway.Database.Api.csproj | 13 +- ...nformaticsGateway.Database.Api.Test.csproj | 15 +- src/Database/Api/Test/packages.lock.json | 285 +- src/Database/Api/packages.lock.json | 214 +- src/Database/DatabaseManager.cs | 6 +- .../Migrations/20230824185313_R4_0.4.0.cs | 3 +- .../Migrations/20231120161347_202311201611.cs | 3 +- ...icsGateway.Database.EntityFramework.csproj | 26 +- ...tinationApplicationEntityRepositoryTest.cs | 34 +- .../DicomAssociationInfoRepositoryTest.cs | 10 +- .../Test/ExternalAppDetailsRepositoryTest.cs | 8 +- .../HL7DestinationEntityRepositoryTest.cs | 34 +- .../Test/InferenceRequestRepositoryTest.cs | 70 +- ...teway.Database.EntityFramework.Test.csproj | 19 +- .../MonaiApplicationEntityRepositoryTest.cs | 32 +- .../Test/PayloadRepositoryTest.cs | 56 +- .../SourceApplicationEntityRepositoryTest.cs | 36 +- .../StorageMetadataWrapperRepositoryTest.cs | 42 +- .../VirtualApplicationEntityRepositoryTest.cs | 36 +- .../EntityFramework/Test/packages.lock.json | 632 +- .../EntityFramework/packages.lock.json | 545 +- ....Deploy.InformaticsGateway.Database.csproj | 25 +- ...tinationApplicationEntityRepositoryTest.cs | 34 +- .../DicomAssociationInfoRepositoryTest.cs | 12 +- .../ExternalAppDetailsRepositoryTest.cs | 16 +- .../HL7DestinationEntityRepositoryTest.cs | 34 +- .../InferenceRequestRepositoryTest.cs | 68 +- ...y.Database.MongoDB.Integration.Test.csproj | 19 +- .../MonaiApplicationEntityRepositoryTest.cs | 32 +- .../Integration.Test/PayloadRepositoryTest.cs | 52 +- .../SourceApplicationEntityRepositoryTest.cs | 36 +- .../StorageMetadataWrapperRepositoryTest.cs | 42 +- .../VirtualApplicationEntityRepositoryTest.cs | 36 +- .../Integration.Test/packages.lock.json | 325 +- ...InformaticsGateway.Database.MongoDB.csproj | 15 +- src/Database/MongoDB/packages.lock.json | 242 +- src/Database/packages.lock.json | 624 +- .../API/DicomWebClientException.cs | 21 - .../API/ResponseDecodeException.cs | 6 - .../API/UnsupportedReturnTypeException.cs | 6 - ...ormaticsGateway.DicomWeb.Client.CLI.csproj | 14 +- src/DicomWebClient/CLI/Stow.cs | 7 +- src/DicomWebClient/CLI/Utils.cs | 25 +- src/DicomWebClient/CLI/packages.lock.json | 1116 +- ....InformaticsGateway.DicomWeb.Client.csproj | 17 +- src/DicomWebClient/Services/ServiceBase.cs | 9 +- src/DicomWebClient/Services/WadoService.cs | 11 +- .../Test/DicomWebClientExceptionTest.cs | 54 - .../Test/HttpMessageExtensionTest.cs | 2 +- ...rmaticsGateway.DicomWeb.Client.Test.csproj | 20 +- src/DicomWebClient/Test/packages.lock.json | 133 +- .../Third-party/Microsoft/Extensions.cs | 23 + .../InternetMessageFormatHeaderParser.cs | 372 + .../Third-party/Microsoft/MimeBodyPart.cs | 230 + .../Microsoft/MimeMultipartBodyPartParser.cs | 310 + .../Microsoft/MimeMultipartParser.cs | 790 + .../Microsoft/MultipartExtensions.cs | 275 + .../MultipartMemoryStreamProvider.cs | 28 + .../Microsoft/MultipartStreamProvider.cs | 77 + .../Third-party/Microsoft/README.md | 8 + src/DicomWebClient/packages.lock.json | 1112 +- .../ApplicationEntityNotFoundException.cs | 5 - .../Common/DestinationNotSuppliedException.cs | 7 - .../Common/DicomExtensions.cs | 7 +- .../Common/FileMoveException.cs | 6 - .../Common/FileUploadException.cs | 6 - .../InsufficientStorageAvailableException.cs | 7 +- .../Common/ObjectExistsException.cs | 6 - .../Common/PlugInInitializationException.cs | 5 - .../Common/PlugInLoadingException.cs | 5 - .../Common/PostPayloadException.cs | 5 - .../Common/ServiceException.cs | 8 +- .../Common/ServiceNotFoundException.cs | 6 - src/InformaticsGateway/Common/Unsubscriber.cs | 2 +- .../Monai.Deploy.InformaticsGateway.csproj | 33 +- src/InformaticsGateway/Program.cs | 6 +- .../Services/Connectors/IPayloadAssembler.cs | 12 +- .../Services/Connectors/PayloadAssembler.cs | 43 +- .../Connectors/PayloadMoveException.cs | 1 - .../Connectors/PayloadNotificationService.cs | 1 + .../DicomWeb/ConvertStreamException.cs | 6 - .../Services/Export/ExportServiceBase.cs | 2 +- .../Services/Export/ExternalAppExeception.cs | 5 - .../Services/Export/ScuExportService.cs | 3 - .../Services/Fhir/FhirJsonReader.cs | 4 +- .../Services/Fhir/FhirStoreException.cs | 6 - .../Services/Fhir/FhirXmlReader.cs | 4 +- .../Services/HealthLevel7/Hl7SendException.cs | 5 - .../Services/HealthLevel7/MllpClient.cs | 2 +- .../Services/Http/Startup.cs | 3 + .../Services/Scp/ExternalAppScpService.cs | 4 +- .../Services/Scp/IApplicationEntityManager.cs | 6 +- .../Services/Scp/ScpServiceBase.cs | 4 +- .../Services/Scu/ScuService.cs | 2 +- .../Services/Storage/ObjectUploadService.cs | 3 +- .../Services/Storage/StoageInfoProvider.cs | 6 +- .../DicomFileStorageMetadataExtensionsTest.cs | 16 +- ...onai.Deploy.InformaticsGateway.Test.csproj | 26 +- ...loy.InformaticsGateway.Test.PlugIns.csproj | 8 +- .../InputDataPluginEngineFactoryTest.cs | 2 +- .../Common/Pagination/PagedResponseTest.cs | 3 +- .../Connectors/PayloadAssemblerTest.cs | 2 +- .../PayloadNotificationServiceTest.cs | 1 - .../Services/Export/ExportServiceBaseTest.cs | 2 +- .../Services/HealthLevel7/MllpServiceTest.cs | 10 +- .../DicomAssociationInfoControllerTest.cs | 4 +- .../Scp/ApplicationEntityManagerTest.cs | 22 +- .../Storage/StorageInfoProviderTest.cs | 2 +- .../Test/packages.lock.json | 1203 +- src/InformaticsGateway/packages.lock.json | 1621 +- ...sGateway.PlugIns.RemoteAppExecution.csproj | 37 +- .../Test/Database/DatabaseRegistrarTest.cs | 10 +- .../RemoteAppExecutionRepositoryTest.cs | 16 +- .../RemoteAppExecutionRepositoryTest.cs | 16 +- .../Test/DicomDeidentifierTest.cs | 8 +- .../Test/DicomReidentifierTest.cs | 4 +- ...way.PlugIns.RemoteAppExecution.Test.csproj | 27 +- .../Test/packages.lock.json | 707 +- .../RemoteAppExecution/packages.lock.json | 599 +- src/Shared/Test/VerifyLogExtension.cs | 5 +- tests/Integration.Test/Common/Assertions.cs | 3 +- .../Common/DicomWebDataSink.cs | 2 +- tests/Integration.Test/Common/FhirDataSink.cs | 2 +- .../Integration.Test/Common/MinioDataSink.cs | 3 +- tests/Integration.Test/Hooks/TestHooks.cs | 2 +- ...InformaticsGateway.Integration.Test.csproj | 48 +- tests/Integration.Test/debug.sh | 2 +- tests/Integration.Test/packages.lock.json | 1105 +- tests/Integration.Test/run.sh | 2 +- 189 files changed, 19905 insertions(+), 29997 deletions(-) delete mode 100644 src/CLI/Test/ControlExceptionTest.cs mode change 100755 => 100644 src/CLI/packages.lock.json delete mode 100644 src/Client.Common/Test/ProblemExceptionTest.cs mode change 100755 => 100644 src/Client/Test/packages.lock.json mode change 100755 => 100644 src/Client/packages.lock.json mode change 100755 => 100644 src/Configuration/packages.lock.json mode change 100755 => 100644 src/Database/Api/packages.lock.json mode change 100755 => 100644 src/Database/EntityFramework/Test/packages.lock.json mode change 100755 => 100644 src/Database/MongoDB/Integration.Test/packages.lock.json mode change 100755 => 100644 src/Database/packages.lock.json delete mode 100644 src/DicomWebClient/Test/DicomWebClientExceptionTest.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/Extensions.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/InternetMessageFormatHeaderParser.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/MimeBodyPart.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/MimeMultipartBodyPartParser.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/MimeMultipartParser.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/MultipartExtensions.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/MultipartMemoryStreamProvider.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/MultipartStreamProvider.cs create mode 100644 src/DicomWebClient/Third-party/Microsoft/README.md mode change 100755 => 100644 src/InformaticsGateway/Test/packages.lock.json mode change 100755 => 100644 src/InformaticsGateway/packages.lock.json mode change 100755 => 100644 src/Plug-ins/RemoteAppExecution/Test/packages.lock.json mode change 100755 => 100644 tests/Integration.Test/packages.lock.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51a009a7b..02f541a49 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Install GitVersion run: dotnet tool install --global GitVersion.Tool @@ -88,7 +88,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Enable NuGet cache uses: actions/cache@v3.3.1 @@ -129,7 +129,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Enable Homebrew run: echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH @@ -191,7 +191,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Enable NuGet cache uses: actions/cache@v3.3.1 @@ -231,7 +231,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: find ~+ -type f -name "*.Test.csproj" | xargs -L1 dotnet test -c ${{ env.BUILD_CONFIG }} -v=minimal -r "${{ env.TEST_RESULTS }}" --collect:"XPlat Code Coverage" --settings coverlet.runsettings + run: find ~+ -type f -name "*.Test.csproj" | xargs -L1 dotnet test -c ${{ env.BUILD_CONFIG }} -v=minimal --results-directory "${{ env.TEST_RESULTS }}" --collect:"XPlat Code Coverage" --settings coverlet.runsettings working-directory: ./src - name: End SonarScanner @@ -244,7 +244,7 @@ jobs: - uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} - directory: "src/${{ env.TEST_RESULTS }}" + directory: "src/" files: "**/coverage.opencover.xml" flags: unittests name: codecov-umbrella @@ -270,7 +270,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Enable NuGet cache uses: actions/cache@v3.3.1 @@ -335,7 +335,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Enable NuGet cache uses: actions/cache@v3.3.1 @@ -474,7 +474,7 @@ jobs: - uses: actions/setup-dotnet@v3 with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" - name: Enable NuGet cache uses: actions/cache@v3.3.1 @@ -539,7 +539,7 @@ jobs: env: NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" source-url: https://nuget.pkg.github.com/Project-MONAI/index.json - name: Publish to GitHub @@ -572,7 +572,7 @@ jobs: env: NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} with: - dotnet-version: "6.0.x" + dotnet-version: "8.0.x" source-url: https://nuget.pkg.github.com/Project-MONAI/index.json - name: Publish to GitHub diff --git a/.licenserc.yaml b/.licenserc.yaml index b1ea23d84..0cce288ae 100644 --- a/.licenserc.yaml +++ b/.licenserc.yaml @@ -40,6 +40,7 @@ header: - 'tests/Integration.Test/*.dev' - 'tests/Integration.Test/data/**' - 'guidelines/diagrams/*.txt' + - 'src/DicomWebClient/Third-party/**' comment: on-failure diff --git a/Dockerfile b/Dockerfile index 0791426a6..f5ecd0807 100755 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM mcr.microsoft.com/dotnet/sdk:6.0-focal as build +FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy as build # Install the tools RUN dotnet tool install --tool-path /tools dotnet-trace @@ -26,7 +26,7 @@ RUN echo "Building MONAI Deploy Informatics Gateway..." RUN dotnet publish -c Release -o out --nologo src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj # Build runtime image -FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal +FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy # Enable elastic client compatibility mode ENV ELASTIC_CLIENT_APIVERSIONING=true diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index dc7dcac0a..1f67b94a6 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -1,2475 +1,1778 @@ --- - - :approve - AWSSDK.Core - - :who: mocsharp + - :versions: + - 3.7.300.29 + :when: 2022-08-29T18:11:12.923Z + :who: mocsharp :why: Apache-2.0 (https://github.com/aws/aws-sdk-net/raw/master/License.txt) - :versions: - - 3.7.200.13 - :when: 2022-09-01 23:05:22.203089302 Z - - :approve - AWSSDK.S3 - - :who: mocsharp + - :versions: + - 3.7.305.4 + :when: 2022-08-29T18:11:13.354Z + :who: mocsharp :why: Apache-2.0 (https://github.com/aws/aws-sdk-net/raw/master/License.txt) - :versions: - - 3.7.9.16 - :when: 2022-08-16 23:05:28.458938645 Z - - :approve - AWSSDK.SecurityToken - - :who: mocsharp + - :versions: + - 3.7.300.30 + :when: 2022-08-16T18:11:13.781Z + :who: mocsharp :why: Apache-2.0 (https://github.com/aws/aws-sdk-net/raw/master/License.txt) - :versions: - - 3.7.201.9 - :when: 2022-09-01 23:05:28.920368903 Z +- - :approve + - Ardalis.GuardClauses + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:30.077Z + :who: mocsharp + :why: MIT (https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) +- - :approve + - AspNetCore.HealthChecks.MongoDb + - :versions: + - 8.0.0 + :when: 2022-12-08T23:37:56.206Z + :who: mocsharp + :why: Apache-2.0 (https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/raw/master/LICENSE) - - :approve - BoDi - - :who: mocsharp + - :versions: + - 1.5.0 + :when: 2022-08-16T23:05:29.793Z + :who: mocsharp :why: Apache-2.0 (https://raw.githubusercontent.com/SpecFlowOSS/BoDi/master/LICENSE.txt) - :versions: - - 1.5.0 - :when: 2022-08-16 23:05:29.793349995 Z - - :approve - Castle.Core - - :who: mocsharp + - :versions: + - 5.1.1 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio :why: Apache-2.0 (https://github.com/castleproject/Core/raw/master/LICENSE) - :versions: - - 5.0.0 - :when: 2022-08-16 23:05:30.223218630 Z - - :approve - - Castle.Core - - :who: mocsharp - :why: Apache-2.0 (https://github.com/castleproject/Core/raw/master/LICENSE) - :versions: - - 5.1.1 - :when: 2022-08-16 23:05:30.666349504 Z + - CommunityToolkit.HighPerformance + - :versions: + - 8.2.2 + :when: 2023-08-04T00:02:30.206Z + :who: mocsharp + :why: MIT (https://raw.githubusercontent.com/CommunityToolkit/dotnet/main/License.md) - - :approve - ConsoleAppFramework - - :who: mocsharp + - :versions: + - 4.2.4 + :when: 2022-08-16T23:05:31.110Z + :who: mocsharp :why: MIT (https://github.com/Cysharp/ConsoleAppFramework/raw/master/LICENSE) - :versions: - - 4.2.4 - :when: 2022-08-16 23:05:31.110052610 Z - - :approve - Crayon - - :who: mocsharp + - :versions: + - 2.0.69 + :when: 2022-08-16T23:05:31.541Z + :who: mocsharp :why: MIT (https://github.com/riezebosch/crayon/raw/master/LICENSE) - :versions: - - 2.0.69 - :when: 2022-08-16 23:05:31.541983092 Z - - :approve - - Crc32.NET - - :who: mocsharp - :why: MIT (https://github.com/force-net/Crc32.NET/raw/develop/LICENSE) - :versions: - - 1.2.0 - :when: 2022-08-16 23:05:31.982398334 Z + - DnsClient + - :versions: + - 1.6.1 + :when: 2022-11-16T23:33:33.315Z + :who: mocsharp + :why: Apache-2.0 (https://github.com/MichaCo/DnsClient.NET/raw/dev/LICENSE) - - :approve - Docker.DotNet - - :who: mocsharp + - :versions: + - 3.125.15 + :when: 2022-08-16T23:05:32.422Z + :who: mocsharp :why: MIT (https://github.com/dotnet/Docker.DotNet/raw/master/LICENSE) - :versions: - - 3.125.15 - :when: 2022-08-16 23:05:32.422217566 Z - - :approve - DotNext - - :who: mocsharp + - :versions: + - 4.15.2 + :when: 2022-09-01T23:05:32.857Z + :who: mocsharp :why: MIT (https://github.com/dotnet/dotNext/raw/master/LICENSE) - :versions: - - 4.7.4 - :when: 2022-09-01 23:05:32.857032968 Z - - :approve - DotNext.Threading - - :who: mocsharp + - :versions: + - 4.15.2 + :when: 2022-09-01T23:05:33.298Z + :who: mocsharp :why: MIT (https://github.com/dotnet/dotNext/raw/master/LICENSE) - :versions: - - 4.7.4 - :when: 2022-09-01 23:05:33.298402277 Z - - :approve - FluentAssertions - - :who: mocsharp + - :versions: + - 6.12.0 + :when: 2022-08-16T23:05:33.753Z + :who: mocsharp :why: Apache-2.0 (https://github.com/fluentassertions/fluentassertions/raw/develop/LICENSE) - :versions: - - 6.11.0 - :when: 2022-08-16 23:05:33.753437127 Z - - :approve - Gherkin - - :who: mocsharp + - :versions: + - 19.0.3 + :when: 2022-08-16T23:05:34.184Z + :who: mocsharp :why: MIT (https://github.com/cucumber/gherkin/raw/main/LICENSE) - :versions: - - 19.0.3 - :when: 2022-08-16 23:05:34.184272525 Z -- - :approve - - GitVersion.MsBuild - - :who: mocsharp - :why: MIT (https://github.com/GitTools/GitVersion/raw/main/LICENSE) - :versions: - - 5.12.0 - :when: 2022-08-16 23:05:34.633372053 Z - - :approve - HL7-dotnetcore - - :who: mocsharp + - :versions: + - 2.36.0 + :when: 2022-08-16T23:05:35.066Z + :who: mocsharp :why: MIT (https://github.com/Efferent-Health/HL7-dotnetcore/raw/master/LICENSE.txt) - :versions: - - 2.36.0 - :when: 2022-08-16 23:05:35.066879864 Z - - :approve - Humanizer.Core - - :who: mocsharp + - :versions: + - 2.14.1 + :when: 2022-08-16T23:05:35.500Z + :who: mocsharp :why: MIT (https://github.com/Humanizr/Humanizer/raw/main/LICENSE) - :versions: - - 2.8.26 - :when: 2022-08-16 23:05:35.500302268 Z -- - :approve - - JetBrains.Annotations - - :who: mocsharp - :why: MIT (https://github.com/JetBrains/JetBrains.Annotations/raw/main/license.md) - :versions: - - 2021.3.0 - :when: 2022-08-16 23:05:35.941494226 Z - - :approve - Macross.Json.Extensions - - :who: mocsharp + - :versions: + - 3.0.0 + :when: 2022-08-16T23:05:36.807Z + :who: mocsharp :why: MIT (https://github.com/Macross-Software/core/raw/develop/LICENSE.txt) - :versions: - - 3.0.0 - :when: 2022-08-16 23:05:36.807242114 Z -- - :approve - - Microsoft.AspNet.WebApi.Client - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 5.2.9 - :when: 2022-08-16 23:05:37.244143533 Z -- - :approve - - Microsoft.AspNetCore.Authentication.Abstractions - - :who: mocsharp - :why: Apache-2.0 (https://github.com/aspnet/HttpAbstractions/raw/master/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:37.692190919 Z -- - :approve - - Microsoft.AspNetCore.Authentication.Core - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:38.127401143 Z -- - :approve - - Microsoft.AspNetCore.Authorization - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:38.584642464 Z -- - :approve - - Microsoft.AspNetCore.Authorization.Policy - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:39.080479670 Z -- - :approve - - Microsoft.AspNetCore.Hosting.Abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:39.515329423 Z -- - :approve - - Microsoft.AspNetCore.Hosting.Server.Abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:39.956722759 Z -- - :approve - - Microsoft.AspNetCore.Http - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:40.388929669 Z -- - :approve - - Microsoft.AspNetCore.Http.Abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:40.826627099 Z -- - :approve - - Microsoft.AspNetCore.Http.Extensions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:41.270544665 Z -- - :approve - - Microsoft.AspNetCore.Http.Features - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:41.699752560 Z -- - :approve - - Microsoft.AspNetCore.JsonPatch - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:42.149729514 Z -- - :approve - - Microsoft.AspNetCore.Mvc.Abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:42.597684214 Z -- - :approve - - Microsoft.AspNetCore.Mvc.Core - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:43.039048876 Z -- - :approve - - Microsoft.AspNetCore.Mvc.Formatters.Json - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:43.483158620 Z -- - :approve - - Microsoft.AspNetCore.Mvc.WebApiCompatShim - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:43.907848139 Z -- - :approve - - Microsoft.AspNetCore.ResponseCaching.Abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:44.369404969 Z - - :approve - - Microsoft.AspNetCore.Routing - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:44.808937623 Z -- - :approve - - Microsoft.AspNetCore.Routing.Abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:45.246897771 Z -- - :approve - - Microsoft.AspNetCore.WebUtilities - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:05:45.692371402 Z + - Microsoft.AspNetCore.Authentication.JwtBearer + - :versions: + - 8.0.0 + :when: 2022-10-14T23:36:49.751Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - - :approve - - Microsoft.Bcl.AsyncInterfaces - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 1.1.1 - :when: 2022-08-16 23:05:46.134783341 Z + - Microsoft.AspNetCore.TestHost + - :versions: + - 8.0.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - - :approve - Microsoft.Bcl.AsyncInterfaces - - :who: mocsharp + - :versions: + - 6.0.0 + :when: 2022-08-16T23:05:46.589Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:46.589538298 Z - - :approve - - Microsoft.CSharp - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:05:47.470239070 Z + - Microsoft.Bcl.HashCode + - :versions: + - 1.1.1 + :when: 2023-08-04T00:02:30.206Z + :who: mocsharp + :why: MIT (https://licenses.nuget.org/MIT) - - :approve - Microsoft.CSharp - - :who: mocsharp + - :versions: + - 4.7.0 + :when: 2022-08-16T23:05:47.910Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 4.5.0 - - 4.7.0 - :when: 2022-08-16 23:05:47.910358457 Z +- - :approve + - Microsoft.CodeAnalysis.Analyzers + - :versions: + - 3.3.3 + :when: 2024-01-04T11:05:47.910Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/roslyn-analyzers/raw/main/License.txt) +- - :approve + - Microsoft.CodeAnalysis.CSharp + - :versions: + - 4.5.0 + :when: 2024-01-04T11:05:47.910Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/roslyn/raw/main/License.txt) +- - :approve + - Microsoft.CodeAnalysis.CSharp.Workspaces + - :versions: + - 4.5.0 + :when: 2024-01-04T11:05:47.910Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/roslyn/raw/main/License.txt) +- - :approve + - Microsoft.CodeAnalysis.Common + - :versions: + - 4.5.0 + :when: 2024-01-04T11:05:47.910Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/roslyn/raw/main/License.txt) +- - :approve + - Microsoft.CodeAnalysis.Workspaces.Common + - :versions: + - 4.5.0 + :when: 2024-01-04T11:05:47.910Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/roslyn/raw/main/License.txt) - - :approve - Microsoft.CodeCoverage - - :who: mocsharp - :why: MIT (https://github.com/microsoft/vstest/raw/main/LICENSE) - :versions: - - 17.7.2 - :when: 2022-08-16 23:05:48.342748414 Z + - :versions: + - 17.8.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) - - :approve - Microsoft.Data.Sqlite.Core - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:49.698Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-16 23:05:49.698463427 Z - - :approve - Microsoft.EntityFrameworkCore - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:50.137Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - :when: 2022-08-16 23:05:50.137694970 Z - - :approve - Microsoft.EntityFrameworkCore.Abstractions - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:51.008Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-16 23:05:51.008105271 Z - - :approve - Microsoft.EntityFrameworkCore.Analyzers - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:51.445Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-16 23:05:51.445711308 Z - - :approve - Microsoft.EntityFrameworkCore.Design - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:51.922Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-16 23:05:51.922790944 Z - - :approve - Microsoft.EntityFrameworkCore.InMemory - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:52.375Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-16 23:05:52.375150938 Z - - :approve - Microsoft.EntityFrameworkCore.Relational - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:52.828Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-16 23:05:52.828879230 Z - - :approve - Microsoft.EntityFrameworkCore.Tools - - :who: ndsouth + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:52.828Z + :who: ndsouth :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.25 - - :when: 2022-08-16 23:05:52.828879230 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:53.270Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.25 - :when: 2022-08-16 23:05:53.270526921 Z - - :approve - Microsoft.EntityFrameworkCore.Sqlite.Core - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:53.706Z + :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - :when: 2022-08-16 23:05:53.706997823 Z - - :approve - Microsoft.Extensions.ApiDescription.Server - - :who: mocsharp + - :versions: + - 6.0.5 + - 8.0.0 + :when: 2022-08-16T23:05:54.147Z + :who: mocsharp :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - :versions: - - 6.0.5 - :when: 2022-08-16 23:05:54.147788019 Z - - :approve - Microsoft.Extensions.Caching.Abstractions - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:54.613Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:54.613161099 Z - - :approve - Microsoft.Extensions.Caching.Memory - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.1 - :when: 2022-08-16 23:05:55.084861001 Z -- - :approve - - Microsoft.Extensions.Configuration - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:05:55.084Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:55.527814785 Z - - :approve - Microsoft.Extensions.Configuration - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:38.225Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.1 - :when: 2022-08-16 23:05:55.977031585 Z - - :approve - Microsoft.Extensions.Configuration.Abstractions - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:38.225Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:56.428678166 Z - - :approve - Microsoft.Extensions.Configuration.Binder - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:05:56.869Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:56.869915708 Z - - :approve - Microsoft.Extensions.Configuration.CommandLine - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:57.317738091 Z -- - :approve - - Microsoft.Extensions.Configuration.EnvironmentVariables - - :who: mocsharp + - :versions: + - 6.0.0 + :when: 2022-08-16T23:05:57.317Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:57.756429175 Z - - :approve - Microsoft.Extensions.Configuration.EnvironmentVariables - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:05:57.756Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.1 - :when: 2022-08-16 23:05:58.210886620 Z - - :approve - Microsoft.Extensions.Configuration.FileExtensions - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:05:58.646Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:58.646414000 Z - - :approve - Microsoft.Extensions.Configuration.Json - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:59.140939154 Z -- - :approve - - Microsoft.Extensions.Configuration.UserSecrets - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:05:59.140Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:05:59.570260365 Z - - :approve - Microsoft.Extensions.Configuration.UserSecrets - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:05:59.570Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.1 - :when: 2022-08-16 23:06:00.023322781 Z -- - :approve - - Microsoft.Extensions.DependencyInjection - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:06:00.485562894 Z - - :approve - Microsoft.Extensions.DependencyInjection - - :who: mocsharp + - :versions: + - 6.0.1 + - 8.0.0 + :when: 2022-08-16T23:06:00.904Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - - 6.0.1 - :when: 2022-08-16 23:06:00.904189459 Z -- - :approve - - Microsoft.Extensions.DependencyInjection.Abstractions - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:06:01.336363873 Z - - :approve - Microsoft.Extensions.DependencyInjection.Abstractions - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:41.552Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:01.778427777 Z - - :approve - Microsoft.Extensions.DependencyModel - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-16T23:06:02.270Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:02.270628975 Z +- - :approve + - Microsoft.Extensions.Diagnostics + - :versions: + - 8.0.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- - :approve + - Microsoft.Extensions.Diagnostics.Abstractions + - :versions: + - 8.0.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - :versions: - - 6.0.21 - - 6.0.22 - - 6.0.25 - - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - :versions: - - 6.0.21 - - 6.0.22 - - 6.0.25 - - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore - - :who: mocsharp + - :versions: + - 8.0.0 + :when: 2022-08-29T18:11:22.090Z + :who: mocsharp :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - :versions: - - 6.0.22 - - 6.0.25 - - :when: 2022-08-29 18:11:22.090772006 Z - - :approve - Microsoft.Extensions.FileProviders.Abstractions - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:41.978Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - Microsoft.Extensions.Hosting + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:43.643Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - Microsoft.Extensions.Hosting.Abstractions + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:43.643Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:02.711721543 Z - - :approve - Microsoft.Extensions.FileProviders.Physical - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:06:03.153Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:03.153109366 Z - - :approve - Microsoft.Extensions.FileSystemGlobbing - - :who: mocsharp + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:06:03.598Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:03.598159964 Z - - :approve - - Microsoft.Extensions.Hosting - - :who: mocsharp + - Microsoft.Extensions.Logging + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:44.471Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:04.046151373 Z - - :approve - - Microsoft.Extensions.Hosting - - :who: mocsharp + - Microsoft.Extensions.Logging.Abstractions + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:44.471Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.1 - :when: 2022-08-16 23:06:04.488545906 Z - - :approve - - Microsoft.Extensions.Hosting.Abstractions - - :who: mocsharp + - Microsoft.Extensions.Logging.Configuration + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:06:07.178Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:04.935613050 Z - - :approve - - Microsoft.Extensions.Http - - :who: mocsharp + - Microsoft.Extensions.Logging.Console + - :versions: + - 6.0.0 + :when: 2022-08-16T23:06:07.618Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:05.375869736 Z - - :approve - - Microsoft.Extensions.Logging - - :who: mocsharp + - Microsoft.Extensions.Logging.Debug + - :versions: + - 6.0.0 + :when: 2022-08-16T23:06:08.061Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:05.840705669 Z - - :approve - - Microsoft.Extensions.Logging.Abstractions - - :who: mocsharp + - Microsoft.Extensions.Logging.EventLog + - :versions: + - 6.0.0 + :when: 2022-08-16T23:06:08.503Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - - 6.0.3 - - 6.0.4 - :when: 2022-08-16 23:06:06.728283354 Z - - :approve - - Microsoft.Extensions.Logging.Configuration - - :who: mocsharp + - Microsoft.Extensions.Logging.EventSource + - :versions: + - 6.0.0 + :when: 2022-08-16T23:06:08.971Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:07.178037938 Z - - :approve - - Microsoft.Extensions.Logging.Console - - :who: mocsharp + - Microsoft.Extensions.Http + - :versions: + - 8.0.0 + :when: 2022-08-16T23:06:05.375Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:07.618174405 Z - - :approve - - Microsoft.Extensions.Logging.Debug - - :who: mocsharp + - Microsoft.Extensions.Options + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:46.980Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:08.061150392 Z - - :approve - - Microsoft.Extensions.Logging.EventLog - - :who: mocsharp + - Microsoft.Extensions.Primitives + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:47.818Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:08.503025043 Z - - :approve - - Microsoft.Extensions.Logging.EventSource - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:08.971793852 Z + - Microsoft.IdentityModel.Abstractions + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:14.398Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - - :approve - - Microsoft.Extensions.ObjectPool - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:06:09.417876763 Z + - Microsoft.IdentityModel.JsonWebTokens + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:14.398Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - - :approve - - Microsoft.Extensions.Options - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:06:09.875478409 Z + - Microsoft.IdentityModel.Logging + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:15.196Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - - :approve - - Microsoft.Extensions.Options - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:10.315793104 Z + - Microsoft.IdentityModel.Protocols + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:16.007Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - - :approve - - Microsoft.Extensions.Options.ConfigurationExtensions - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:10.759567780 Z + - Microsoft.IdentityModel.Protocols.OpenIdConnect + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:16.403Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - - :approve - - Microsoft.Extensions.Primitives - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:06:11.220257662 Z + - Microsoft.IdentityModel.Tokens + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:16.793Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - - :approve - - Microsoft.Extensions.Primitives - - :who: mocsharp + - Microsoft.NET.ILLink.Tasks + - :versions: + - 8.0.0 + :when: 2022-10-14T23:37:16.793Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:11.669234037 Z - - :approve - Microsoft.NET.Test.Sdk - - :who: mocsharp - :why: MIT (https://raw.githubusercontent.com/microsoft/vstest/main/LICENSE) - :versions: - - 17.7.2 - :when: 2022-09-01 23:06:13.008314524 Z + - :versions: + - 17.8.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) - - :approve - Microsoft.NETCore.Platforms - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License (http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 1.1.0 - :when: 2022-08-16 23:06:13.457444370 Z + - :versions: + - 1.1.0 + :when: 2022-08-16T21:39:48.664Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) +- - :approve + - Microsoft.OpenApi + - :versions: + - 1.2.3 + :when: 2022-08-16T23:06:15.708Z + :who: mocsharp + :why: MIT ( https://raw.githubusercontent.com/Microsoft/OpenAPI.NET/master/LICENSE) +- - :approve + - Microsoft.Win32.Registry + - :versions: + - 5.0.0 + :when: 2022-11-16T23:38:53.540Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - :approve - Microsoft.NETCore.Platforms - - :who: mocsharp + - :versions: + - 5.0.0 + :when: 2022-08-16T23:06:13.902Z + :who: mocsharp :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 3.0.0 - - 5.0.0 - :when: 2022-08-16 23:06:13.902743611 Z -- - :approve - - Microsoft.NETCore.Targets - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 1.1.0 - :when: 2022-08-16 23:06:14.351517365 Z - - :approve - Microsoft.NETCore.Targets - - :who: mocsharp + - :versions: + - 1.1.0 + :when: 2022-08-16T21:39:49.129Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 1.1.3 - :when: 2022-08-16 23:06:14.798049603 Z -- - :approve - - Microsoft.Net.Http.Headers - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - :versions: - - 2.2.0 - :when: 2022-08-16 23:06:15.238479186 Z -- - :approve - - Microsoft.OpenApi - - :who: mocsharp - :why: MIT ( https://raw.githubusercontent.com/Microsoft/OpenAPI.NET/master/LICENSE) - :versions: - - 1.2.3 - :when: 2022-08-16 23:06:15.708769534 Z - - :approve - Microsoft.TestPlatform.ObjectModel - - :who: mocsharp - :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) - :versions: - - 17.7.2 - :when: 2022-08-16 23:06:16.175705981 Z + - :versions: + - 17.8.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) - - :approve - Microsoft.TestPlatform.TestHost - - :who: mocsharp - :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) - :versions: - - 17.7.2 - :when: 2022-08-16 23:06:17.671459450 Z -- - :approve - - Microsoft.Toolkit.HighPerformance - - :who: mocsharp - :why: MIT (https://github.com/CommunityToolkit/WindowsCommunityToolkit/raw/main/License.md) - :versions: - - 7.1.2 - :when: 2022-09-20 00:42:18.619013325 Z -- - :approve - - Microsoft.Toolkit.HighPerformance - - :who: mocsharp - :why: MIT (https://github.com/CommunityToolkit/WindowsCommunityToolkit/raw/main/License.md) - :versions: - - 7.1.2 - :when: 2022-09-20 00:42:18.619013325 Z + - :versions: + - 17.8.0 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) - - :approve - Microsoft.Win32.Primitives - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:50.378Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:19.143002793 Z -- - :approve - - Microsoft.Win32.SystemEvents - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.0 - :when: 2022-08-16 23:06:19.647254594 Z - - :approve - Minio - - :who: mocsharp + - :versions: + - 6.0.1 + :when: 2022-08-16T18:11:34.443Z + :who: mocsharp :why: Apache-2.0 (https://github.com/minio/minio-dotnet/raw/master/LICENSE) - :versions: - - 5.0.0 - :when: 2022-08-16 23:06:20.598551507 Z - - :approve - Monai.Deploy.Messaging - - :who: neilsouth + - :versions: + - 2.0.0 + :when: 2023-10-13T18:06:21.511Z + :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) - :versions: - - 1.0.5-rc0006 - - 1.0.5 - :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Messaging.RabbitMQ - - :who: neilsouth + - :versions: + - 2.0.0 + :when: 2023-10-13T18:06:21.511Z + :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) - :versions: - - 1.0.5-rc0006 - - 1.0.5 - :when: 2023-10-13 18:06:21.511789690 Z - - :approve - Monai.Deploy.Storage - - :who: mocsharp + - :versions: + - 1.0.0 + :when: 2022-08-16T23:06:21.988Z + :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) - :versions: - - 0.2.18 - :when: 2022-08-16 23:06:21.988183476 Z - - :approve - Monai.Deploy.Storage.MinIO - - :who: mocsharp + - :versions: + - 1.0.0 + :when: 2022-08-16T23:06:22.426Z + :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) - :versions: - - 0.2.18 - :when: 2022-08-16 23:06:22.426838304 Z - - :approve - Monai.Deploy.Storage.S3Policy - - :who: mocsharp + - :versions: + - 1.0.0 + :when: 2022-08-16T23:06:22.881Z + :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) - :versions: - - 0.2.18 - :when: 2022-08-16 23:06:22.881956546 Z - - :approve - Monai.Deploy.Security - - :who: mocsharp + - :versions: + - 1.0.0 + :when: 2022-08-16T23:06:21.051Z + :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-security/raw/develop/LICENSE) - :versions: - - 0.1.3 - :when: 2022-08-16 23:06:21.051573547 Z - - :approve - - Moq - - :who: mocsharp - :why: BSD 3-Clause License ( https://raw.githubusercontent.com/moq/moq4/main/License.txt) - :versions: - - 4.20.69 - :when: 2022-08-16 23:06:23.359197359 Z + - MongoDB.Bson + - :versions: + - 2.23.1 + :when: 2022-11-16T23:38:53.891Z + :who: mocsharp + :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - - :approve - - NETStandard.Library - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 1.6.1 - :when: 2022-08-16 23:06:24.297968578 Z + - MongoDB.Driver + - :versions: + - 2.23.1 + :when: 2022-11-16T23:38:54.213Z + :who: mocsharp + :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - - :approve - - NETStandard.Library - - :who: mocsharp - :why: MIT (https://github.com/dotnet/standard/raw/release/2.0.0/LICENSE.TXT) - :versions: - - 2.0.0 - :when: 2022-08-16 23:06:24.756106826 Z + - Microsoft.Extensions.Options.ConfigurationExtensions + - :versions: + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T23:06:10.759Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - :approve - - Newtonsoft.Json - - :who: mocsharp - :why: MIT (https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) - :versions: - - 10.0.1 - - 13.0.1 - - 13.0.2 - - 13.0.3 - :when: 2022-08-16 23:06:26.098713272 Z + - MongoDB.Driver.Core + - :versions: + - 2.23.1 + :when: 2022-11-16T23:38:54.553Z + :who: mocsharp + :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - - :approve - - Newtonsoft.Json.Bson - - :who: mocsharp - :why: MIT (https://github.com/JamesNK/Newtonsoft.Json.Bson/raw/master/LICENSE.md) - :versions: - - 1.0.1 - :when: 2022-08-16 23:06:27.012580404 Z + - MongoDB.Libmongocrypt + - :versions: + - 1.8.0 + :when: 2022-11-16T23:38:54.863Z + :who: mocsharp + :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - - :approve - - NuGet.Frameworks - - :who: mocsharp - :why: Apache-2.0 (https://github.com/NuGet/NuGet.Client/raw/dev/LICENSE.txt) - :versions: - - 6.5.0 - :when: 2022-08-16 23:06:27.464713741 Z + - Mono.TextTemplating + - :versions: + - 2.2.1 + :when: 2022-11-16T23:38:54.863Z + :who: mocsharp + :why: MIT (https://github.com/mono/t4/raw/main/LICENSE) - - :approve - - Polly - - :who: mocsharp - :why: New BSD License (https://raw.githubusercontent.com/App-vNext/Polly/main/LICENSE) - :versions: - - 7.2.4 - :when: 2022-08-16 23:06:27.913122244 Z + - Moq + - :versions: + - 4.20.70 + :when: 2023-08-16T16:49:26.950Z + :who: woodheadio + :why: BSD 3-Clause License ( https://raw.githubusercontent.com/moq/moq4/main/License.txt) - - :approve - - Portable.BouncyCastle - - :who: mocsharp - :why: MIT ( https://www.bouncycastle.org/csharp/licence.html) - :versions: - - 1.8.9 - :when: 2022-08-16 23:06:28.368060282 Z + - NLog + - :versions: + - 5.2.8 + :when: 2022-10-12T03:14:06.538Z + :who: mocsharp + :why: BSD 3-Clause License (https://github.com/NLog/NLog/raw/dev/LICENSE.txt) - - :approve - - RabbitMQ.Client - - :who: mocsharp - :why: Apache-2.0 (https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) - :versions: - - 6.5.0 - :when: 2022-08-16 23:06:28.818109746 Z + - NLog.Extensions.Logging + - :versions: + - 5.3.8 + :when: 2022-10-12T03:14:06.964Z + :who: mocsharp + :why: BSD 2-Clause Simplified License (https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) +- - :approve + - NLog.Web.AspNetCore + - :versions: + - 5.3.8 + :when: 2022-10-12T03:14:07.396Z + :who: mocsharp + :why: BSD 3-Clause License (https://github.com/NLog/NLog.Web/raw/master/LICENSE) +- - :approve + - NETStandard.Library + - :versions: + - 1.6.1 + :when: 2022-08-16T21:39:51.206Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) +- - :approve + - Newtonsoft.Json + - :versions: + - 13.0.1 + - 13.0.3 + :when: 2022-08-16T21:39:51.628Z + :who: mocsharp + :why: MIT (https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) - - :approve - SQLitePCLRaw.bundle_e_sqlite3 - - :who: mocsharp + - :versions: + - 2.1.6 + :when: 2022-08-16T23:06:29.241Z + :who: mocsharp :why: Apache-2.0 (https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) - :versions: - - 2.1.2 - :when: 2022-08-16 23:06:29.241291848 Z - - :approve - SQLitePCLRaw.core - - :who: mocsharp + - :versions: + - 2.1.6 + :when: 2022-08-16T23:06:29.688Z + :who: mocsharp :why: Apache-2.0 (https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) - :versions: - - 2.1.2 - :when: 2022-08-16 23:06:29.688111783 Z - - :approve - SQLitePCLRaw.lib.e_sqlite3 - - :who: mocsharp + - :versions: + - 2.1.6 + :when: 2022-08-16T23:06:30.132Z + :who: mocsharp :why: Apache-2.0 (https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) - :versions: - - 2.1.2 - :when: 2022-08-16 23:06:30.132403902 Z - - :approve - SQLitePCLRaw.provider.e_sqlite3 - - :who: mocsharp + - :versions: + - 2.1.6 + :when: 2022-08-16T23:06:30.585Z + :who: mocsharp :why: Apache-2.0 (https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) - :versions: - - 2.1.2 - :when: 2022-08-16 23:06:30.585184235 Z - - :approve - - SharpZipLib - - :who: mocsharp - :why: MIT (https://github.com/icsharpcode/SharpZipLib/raw/master/LICENSE.txt) - :versions: - - 1.3.3 - :when: 2022-08-16 23:06:31.028484905 Z + - Snappier + - :versions: + - 1.0.0 + :when: 2022-10-14T23:37:36.642Z + :who: mocsharp + :why: BSD-3-Clause (https://github.com/brantburnett/Snappier/raw/main/COPYING.txt) +- - :approve + - SharpCompress + - :versions: + - 0.30.1 + :when: 2022-11-16T23:38:55.192Z + :who: mocsharp + :why: MIT (https://github.com/adamhathcock/sharpcompress/raw/master/LICENSE.txt) - - :approve - SpecFlow - - :who: mocsharp + - :versions: + - 3.9.74 + :when: 2022-08-16T23:06:31.491Z + :who: mocsharp :why: New BSD License (https://github.com/SpecFlowOSS/SpecFlow/raw/master/LICENSE.txt) - :versions: - - 3.9.74 - :when: 2022-08-16 23:06:31.491813346 Z - - :approve - SpecFlow.Internal.Json - - :who: mocsharp + - :versions: + - 1.0.8 + :when: 2022-08-16T23:06:31.986Z + :who: mocsharp :why: MIT (https://github.com/SpecFlowOSS/SpecFlow.Internal.Json/raw/master/LICENSE) - :versions: - - 1.0.8 - :when: 2022-08-16 23:06:31.986496283 Z - - :approve - SpecFlow.Plus.LivingDocPlugin - - :who: mocsharp + - :versions: + - 3.9.57 + :when: 2022-08-16T23:06:32.460Z + :who: mocsharp :why: New BSD License (https://github.com/SpecFlowOSS/SpecFlow/raw/master/LICENSE.txt) - :versions: - - 3.9.57 - :when: 2022-08-16 23:06:32.460398443 Z - - :approve - SpecFlow.Tools.MsBuild.Generation - - :who: mocsharp + - :versions: + - 3.9.74 + :when: 2022-08-16T23:06:32.914Z + :who: mocsharp :why: New BSD License (https://github.com/SpecFlowOSS/SpecFlow/raw/master/LICENSE.txt) - :versions: - - 3.9.74 - :when: 2022-08-16 23:06:32.914789058 Z - - :approve - SpecFlow.xUnit - - :who: mocsharp + - :versions: + - 3.9.74 + :when: 2022-08-16T23:06:33.372Z + :who: mocsharp :why: New BSD License (https://github.com/SpecFlowOSS/SpecFlow/raw/master/LICENSE.txt) - :versions: - - 3.9.74 - :when: 2022-08-16 23:06:33.372884065 Z - - :approve - Swashbuckle.AspNetCore - - :who: mocsharp + - :versions: + - 6.5.0 + :when: 2022-08-16T23:06:33.817Z + :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - :versions: - - 6.5.0 - :when: 2022-08-16 23:06:33.817705411 Z - - :approve - Swashbuckle.AspNetCore.Swagger - - :who: mocsharp + - :versions: + - 6.5.0 + :when: 2022-08-16T23:06:34.264Z + :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - :versions: - - 6.5.0 - :when: 2022-08-16 23:06:34.264757523 Z - - :approve - Swashbuckle.AspNetCore.SwaggerGen - - :who: mocsharp + - :versions: + - 6.5.0 + :when: 2022-08-16T23:06:34.716Z + :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - :versions: - - 6.5.0 - :when: 2022-08-16 23:06:34.716116883 Z - - :approve - Swashbuckle.AspNetCore.SwaggerUI - - :who: mocsharp + - :versions: + - 6.5.0 + :when: 2022-08-16T23:06:35.164Z + :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - :versions: - - 6.5.0 - :when: 2022-08-16 23:06:35.164249703 Z +- - :approve + - NuGet.Frameworks + - :versions: + - 6.5.0 + :when: 2022-08-16T21:39:52.061Z + :who: mocsharp + :why: Apache-2.0 (https://github.com/NuGet/NuGet.Client/raw/dev/LICENSE.txt) +- - :approve + - Polly + - :versions: + - 8.2.0 + - 8.2.1 + :when: 2022-11-09T18:57:32.294Z + :who: mocsharp + :why: MIT ( https://licenses.nuget.org/MIT) +- - :approve + - Polly.Core + - :versions: + - 8.2.0 + - 8.2.1 + :when: 2022-11-09T18:57:32.294Z + :who: mocsharp + :why: MIT ( https://licenses.nuget.org/MIT) +- - :approve + - RabbitMQ.Client + - :versions: + - 6.8.1 + :when: 2022-08-16T21:39:52.474Z + :who: mocsharp + :why: Apache-2.0 (https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) - - :approve - System.AppContext - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:52.894Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:35.616826259 Z - - :approve - System.Buffers - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:36.066158483 Z + - :versions: + - 4.3.0 + - 4.5.1 + :when: 2022-08-16T21:39:53.322Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) +- - :approve + - System.CodeDom + - :versions: + - 4.4.0 + :when: 2022-08-16T21:39:53.322Z + :who: mocsharp + :why: MIT ( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - :approve - - System.Buffers - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.1 - :when: 2022-08-16 23:06:36.511256664 Z + - System.Collections.Immutable + - :versions: + - 6.0.0 + :when: 2022-08-16T23:06:37.885Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.CommandLine + - :versions: + - 2.0.0-beta4.22272.1 + :when: 2022-08-16T23:06:39.201Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) +- - :approve + - System.CommandLine.Hosting + - :versions: + - 0.4.0-alpha.22272.1 + :when: 2022-08-16T23:06:39.663Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) +- - :approve + - System.CommandLine.NamingConventionBinder + - :versions: + - 2.0.0-beta4.22272.1 + :when: 2022-08-16T23:06:40.127Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) +- - :approve + - System.CommandLine.Rendering + - :versions: + - 0.4.0-alpha.22272.1 + :when: 2022-08-16T23:06:40.580Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) - - :approve - System.Collections - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:54.169Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:36.963316512 Z - - :approve - System.Collections.Concurrent - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:54.601Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:37.420188946 Z -- - :approve - - System.Collections.Immutable - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:37.885858733 Z -- - :approve - - System.Collections.NonGeneric - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:38.333847649 Z -- - :approve - - System.Collections.Specialized - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:38.789202996 Z -- - :approve - - System.CommandLine - - :who: mocsharp - :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) - :versions: - - 2.0.0-beta4.22272.1 - :when: 2022-08-16 23:06:39.201706331 Z -- - :approve - - System.CommandLine.Hosting - - :who: mocsharp - :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) - :versions: - - 0.4.0-alpha.22272.1 - :when: 2022-08-16 23:06:39.663166680 Z -- - :approve - - System.CommandLine.NamingConventionBinder - - :who: mocsharp - :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) - :versions: - - 2.0.0-beta4.22272.1 - :when: 2022-08-16 23:06:40.127130435 Z -- - :approve - - System.CommandLine.Rendering - - :who: mocsharp - :why: MIT (https://github.com/dotnet/command-line-api/raw/main/LICENSE.md) - :versions: - - 0.4.0-alpha.22272.1 - :when: 2022-08-16 23:06:40.580085686 Z -- - :approve - - System.ComponentModel - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:41.023605543 Z -- - :approve - - System.ComponentModel.Annotations - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.0 - :when: 2022-08-16 23:06:41.481488759 Z -- - :approve - - System.ComponentModel.Annotations - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 5.0.0 - :when: 2022-08-16 23:06:41.944451098 Z -- - :approve - - System.ComponentModel.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:42.393536803 Z -- - :approve - - System.ComponentModel.TypeConverter - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:42.868721834 Z -- - :approve - - System.Configuration.ConfigurationManager - - :who: mocsharp - :why: MIT ( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.4.0 - - 4.5.0 - :when: 2022-08-16 23:06:43.335979768 Z - - :approve - System.Console - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:43.790988552 Z - - :approve - System.Diagnostics.Debug - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:44.247110250 Z -- - :approve - - System.Diagnostics.DiagnosticSource - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:55.889Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:44.697068615 Z - - :approve - System.Diagnostics.DiagnosticSource - - :who: mocsharp + - :versions: + - 4.3.0 + - 6.0.0 + - 8.0.0 + :when: 2022-08-16T21:39:56.310Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - - 6.0.1 - :when: 2022-08-16 23:06:45.141361948 Z - - :approve - System.Diagnostics.EventLog - - :who: mocsharp + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:56.734Z + :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:06:45.597825555 Z - - :approve - System.Diagnostics.Tools - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:57.149Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:46.046733015 Z - - :approve - System.Diagnostics.Tracing - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:46.512191360 Z -- - :approve - - System.Drawing.Common - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.0 - :when: 2022-08-16 23:06:46.958823153 Z -- - :approve - - System.Dynamic.Runtime - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.0.11 - :when: 2022-08-16 23:06:47.416090147 Z -- - :approve - - System.Dynamic.Runtime - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:57.568Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:47.870298502 Z - - :approve - System.Globalization - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:57.992Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:48.351904637 Z - - :approve - System.Globalization.Calendars - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:58.421Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:48.816801957 Z - - :approve - System.Globalization.Extensions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:58.878Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:49.237248446 Z - - :approve - System.IO - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:39:59.280Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:49.709349587 Z - - :approve - System.IO.Abstractions - - :who: mocsharp + - :versions: + - 20.0.4 + :when: 2022-12-14T12:28:00.728Z + :who: samrooke :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - :versions: - - 17.2.3 - :when: 2022-08-16 23:06:50.602318269 Z - - :approve - System.IO.Abstractions.TestingHelpers - - :who: mocsharp + - :versions: + - 20.0.4 + :when: 2022-12-14T12:28:00.728Z + :who: samrooke :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - :versions: - - 17.2.3 - :when: 2022-08-16 23:06:51.524564913 Z - - :approve - System.IO.Compression - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:00.565Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:51.984085743 Z - - :approve - System.IO.Compression.ZipFile - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:01.013Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:52.443609672 Z - - :approve - System.IO.FileSystem - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:01.433Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:52.894925276 Z - - :approve - System.IO.FileSystem.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:53.356642197 Z -- - :approve - - System.Linq - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:53.837042740 Z + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:02.283Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) +- - :approve + - System.IO.Pipelines + - :versions: + - 6.0.3 + - 8.0.0 + :when: 2022-08-16T23:06:53.356Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - :approve - System.Linq.Async - - :who: mocsharp + - :versions: + - 6.0.1 + :when: 2022-08-16T23:06:54.280Z + :who: mocsharp :why: MIT (https://github.com/dotnet/reactive/raw/main/LICENSE) - :versions: - - 6.0.1 - :when: 2022-08-16 23:06:54.280123540 Z - - :approve - - System.Linq.Expressions - - :who: mocsharp + - System.IdentityModel.Tokens.Jwt + - :versions: + - 7.0.3 + :when: 2022-10-14T23:37:56.206Z + :who: mocsharp + :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) +- - :approve + - System.Linq + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:02.703Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:54.757028877 Z - - :approve - - System.Memory - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.1 - :when: 2022-08-16 23:06:55.212678404 Z + - System.Linq.Expressions + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:03.119Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - - :approve - System.Memory - - :who: mocsharp + - :versions: + - 4.5.5 + :when: 2022-08-16T21:40:03.543Z + :who: mocsharp :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.4 - - 4.5.5 - :when: 2022-08-16 23:06:55.672403035 Z - - :approve - - System.Net.NameResolution - - :who: mocsharp + - System.Net.Http + - :versions: + - 4.3.0 + - 4.3.4 + :when: 2022-08-16T21:40:03.993Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:57.061395380 Z - - :approve - - System.Net.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:57.515482658 Z + - System.Reactive + - :versions: + - 6.0.0 + :when: 2022-08-16T23:06:59.849Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/reactive/raw/main/LICENSE) - - :approve - System.Net.Primitives - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:04.417Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.1 - :when: 2022-08-16 23:06:57.978353117 Z - - :approve - System.Net.Sockets - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:04.847Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:58.430570828 Z - - :approve - System.ObjectModel - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:58.928908929 Z -- - :approve - - System.Private.Uri - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:05.684Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:06:59.382471132 Z -- - :approve - - System.Reactive - - :who: mocsharp - :why: MIT (https://github.com/dotnet/reactive/raw/main/LICENSE) - :versions: - - 5.0.0 - :when: 2022-08-16 23:06:59.849937437 Z -- - :approve - - System.Reactive.Linq - - :who: mocsharp - :why: MIT (https://github.com/dotnet/reactive/raw/main/LICENSE) - :versions: - - 5.0.0 - :when: 2022-08-16 23:07:00.301865283 Z - - :approve - System.Reflection - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:06.105Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:00.774912239 Z - - :approve - System.Reflection.Emit - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:06.527Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:01.233784676 Z - - :approve - System.Reflection.Emit.ILGeneration - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:06.948Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:01.700190013 Z - - :approve - System.Reflection.Emit.Lightweight - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:07.376Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:02.198989958 Z - - :approve - System.Reflection.Extensions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:07.793Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:02.660700392 Z - - :approve - System.Reflection.Metadata - - :who: mocsharp + - :versions: + - 1.6.0 + - 6.0.1 + :when: 2022-08-16T21:40:08.221Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- - :approve + - System.Runtime.CompilerServices.Unsafe + - :versions: + - 6.0.0 + :when: 2022-08-16T23:07:06.347Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Runtime.Loader + - :versions: + - 4.3.0 + :when: 2022-08-16T23:07:08.646Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) +- - :approve + - System.Security.AccessControl + - :versions: + - 5.0.0 + :when: 2022-08-16T23:07:11.063Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- - :approve + - System.Security.Permissions + - :versions: + - 4.5.0 + :when: 2022-08-16T23:07:15.681Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- - :approve + - System.Text.Encoding.CodePages + - :versions: + - 6.0.0 + :when: 2022-08-16T23:07:17.991Z + :who: mocsharp :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- - :approve + - System.Text.Encodings.Web + - :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) :versions: - - 1.6.0 - :when: 2022-08-16 23:07:03.120522282 Z + - 6.0.0 + - 8.0.0 + :when: 2022-08-16 23:07:19.377530263 Z +- - :approve + - System.Text.Json + - :versions: + - 6.0.9 + - 8.0.0 + :when: 2022-08-16T23:07:20.787Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Security.Principal.Windows + - :versions: + - 5.0.0 + :when: 2022-08-16T23:07:17.059Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Security.Cryptography.ProtectedData + - :versions: + - 4.4.0 + - 4.5.0 + :when: 2022-08-16T23:07:14.759Z + :who: mocsharp + :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - :approve - System.Reflection.Primitives - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:08.640Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:03.573971058 Z - - :approve - System.Reflection.TypeExtensions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:09.096Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:04.045468423 Z - - :approve - System.Resources.ResourceManager - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:04.510917760 Z -- - :approve - - System.Runtime - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:09.522Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:04.967405911 Z - - :approve - System.Runtime - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:09.951Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.1 - :when: 2022-08-16 23:07:05.426503590 Z -- - :approve - - System.Runtime.CompilerServices.Unsafe - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.1 - :when: 2022-08-16 23:07:05.893799510 Z -- - :approve - - System.Runtime.CompilerServices.Unsafe - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:07:06.347562690 Z - - :approve - System.Runtime.Extensions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:10.795Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:06.806629733 Z - - :approve - System.Runtime.Handles - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:11.214Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:07.266021950 Z - - :approve - System.Runtime.InteropServices - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:11.634Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:07.723619378 Z - - :approve - System.Runtime.InteropServices.RuntimeInformation - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:12.076Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:08.188254082 Z - - :approve - - System.Runtime.Loader - - :who: mocsharp + - System.Runtime.Numerics + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:12.501Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:08.646709109 Z - - :approve - - System.Runtime.Numerics - - :who: mocsharp + - System.Security.Cryptography.Algorithms + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:13.349Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:09.168158855 Z - - :approve - - System.Runtime.Serialization.Formatters - - :who: mocsharp + - System.Security.Cryptography.Cng + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:13.768Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:09.642273748 Z - - :approve - - System.Runtime.Serialization.Primitives - - :who: mocsharp + - System.Security.Cryptography.Csp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:14.196Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.1.1 - :when: 2022-08-16 23:07:10.146543477 Z - - :approve - - System.Runtime.Serialization.Primitives - - :who: mocsharp + - System.Security.Cryptography.Encoding + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:14.641Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:10.608285434 Z - - :approve - - System.Security.AccessControl - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 5.0.0 - :when: 2022-08-16 23:07:11.063425328 Z -- - :approve - - System.Security.Claims - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:11.524172409 Z -- - :approve - - System.Security.Cryptography.Algorithms - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:11.995074441 Z -- - :approve - - System.Security.Cryptography.Cng - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - - 4.5.0 - :when: 2022-08-16 23:07:12.460027529 Z -- - :approve - - System.Security.Cryptography.Csp - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:12.915683406 Z -- - :approve - - System.Security.Cryptography.Encoding - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:13.372792205 Z -- - :approve - - System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:13.833567880 Z + - System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:15.059Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - - :approve - System.Security.Cryptography.Primitives - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:15.494Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:14.288309340 Z -- - :approve - - System.Security.Cryptography.ProtectedData - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.4.0 - - 4.5.0 - :when: 2022-08-16 23:07:14.759818552 Z - - :approve - System.Security.Cryptography.X509Certificates - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:15.218020510 Z -- - :approve - - System.Security.Permissions - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.0 - :when: 2022-08-16 23:07:15.681971110 Z -- - :approve - - System.Security.Principal - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:16.144884093 Z -- - :approve - - System.Security.Principal.Windows - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:15.916Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:16.594561848 Z -- - :approve - - System.Security.Principal.Windows - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 5.0.0 - :when: 2022-08-16 23:07:17.059464936 Z - - :approve - System.Text.Encoding - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:16.760Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:17.528153938 Z -- - :approve - - System.Text.Encoding.CodePages - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:07:17.991171210 Z - - :approve - System.Text.Encoding.Extensions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:17.179Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:18.447188540 Z -- - :approve - - System.Text.Encodings.Web - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.7.2 - :when: 2022-08-16 23:07:18.927665553 Z -- - :approve - - System.Text.Encodings.Web - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:07:19.377530263 Z -- - :approve - - System.Text.Json - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.7 - - 6.0.8 - :when: 2022-08-16 23:07:20.787263056 Z - - :approve - System.Text.RegularExpressions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:18.441Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:21.228544774 Z - - :approve - System.Threading - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:18.900Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:21.683762371 Z - - :approve - System.Threading.Channels - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 4.7.1 - :when: 2022-08-16 23:07:22.192780172 Z -- - :approve - - System.Threading.Channels - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - - 7.0.0 - :when: 2022-08-16 23:07:22.653576384 Z -- - :approve - - System.Threading.Overlapped - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:23.112954683 Z + - :versions: + - 6.0.0 + - 7.0.0 + :when: 2022-08-16T21:40:19.306Z + :who: mocsharp + :why: MIT ( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) - - :approve - System.Threading.Tasks - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:23.571361753 Z -- - :approve - - System.Threading.Tasks.Dataflow - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 6.0.0 - :when: 2022-08-16 23:07:24.033230543 Z -- - :approve - - System.Threading.Tasks.Extensions - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:19.741Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:24.492365116 Z - - :approve - System.Threading.Tasks.Extensions - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.5.4 - :when: 2022-08-16 23:07:24.949679540 Z -- - :approve - - System.Threading.ThreadPool - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:25.418534550 Z + - :versions: + - 4.3.0 + - 4.5.4 + :when: 2022-08-16T21:40:20.164Z + :who: mocsharp + :why: MIT (https://dotnet.microsoft.com/en-us/dotnet_library_license.htm) - - :approve - System.Threading.Timer - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:20.589Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:25.883963589 Z - - :approve - - System.ValueTuple - - :who: mocsharp - :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - :versions: - - 4.4.0 - :when: 2022-08-16 23:07:26.336720827 Z + - Validation + - :versions: + - 2.4.18 + :when: 2022-08-16T23:07:28.177Z + :who: mocsharp + :why: Microsoft Public License ( https://raw.githubusercontent.com/AArnott/Validation/69e6a2c4f3/LICENSE.txt) - - :approve - System.Xml.ReaderWriter - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:21.012Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:26.793971546 Z - - :approve - System.Xml.XDocument - - :who: mocsharp + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:21.430Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:27.254750074 Z - - :approve - - System.Xml.XmlDocument - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:27.710993680 Z + - TestableIO.System.IO.Abstractions + - :versions: + - 20.0.4 + :when: 2022-08-16T21:40:21.430Z + :who: mocsharp + :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - - :approve - - Validation - - :who: mocsharp - :why: Microsoft Public License ( https://raw.githubusercontent.com/AArnott/Validation/69e6a2c4f3/LICENSE.txt) - :versions: - - 2.4.18 - :when: 2022-08-16 23:07:28.177073804 Z + - TestableIO.System.IO.Abstractions.TestingHelpers + - :versions: + - 20.0.4 + :when: 2022-08-16T21:40:21.430Z + :who: mocsharp + :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - - :approve - - Xunit.SkippableFact - - :who: mocsharp - :why: Microsoft Public License ( https://raw.githubusercontent.com/AArnott/Xunit.SkippableFact/c7f20eaa78/LICENSE.txt) - :versions: - - 1.3.12 - :when: 2022-08-16 23:07:28.614499928 Z + - TestableIO.System.IO.Abstractions.Wrappers + - :versions: + - 20.0.4 + :when: 2022-08-16T21:40:21.430Z + :who: mocsharp + :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) +- - :approve + - ZstdSharp.Port + - :versions: + - 0.7.3 + :when: 2022-10-14T23:38:32.685Z + :who: mocsharp + :why: MIT (https://github.com/oleg-st/ZstdSharp/raw/master/LICENSE) - - :approve - coverlet.collector - - :who: mocsharp + - :versions: + - 6.0.0 + :when: 2022-08-16T21:40:21.855Z + :who: mocsharp :why: MIT (https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) - :versions: - - 6.0.0 - :when: 2022-08-16 23:07:29.112978564 Z - - :approve - fo-dicom - - :who: mocsharp + - :versions: + - 5.1.2 + :when: 2022-08-16T23:07:29.574Z + :who: mocsharp :why: Microsoft Public License (https://github.com/fo-dicom/fo-dicom/raw/development/License.txt) - :versions: - - 5.1.1 - :when: 2022-08-16 23:07:29.574869349 Z - - :approve - - runtime.any.System.Collections - - :who: mocsharp + - runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:22.289Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:30.069677397 Z - - :approve - - runtime.any.System.Diagnostics.Tools - - :who: mocsharp + - runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:22.712Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:30.529945784 Z - - :approve - - runtime.any.System.Diagnostics.Tracing - - :who: mocsharp + - runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:23.140Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:31.021730702 Z - - :approve - - runtime.any.System.Globalization - - :who: mocsharp + - runtime.native.System + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:23.578Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:31.481132711 Z - - :approve - - runtime.any.System.Globalization.Calendars - - :who: mocsharp + - runtime.native.System.IO.Compression + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:23.998Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:31.945695771 Z - - :approve - - runtime.any.System.IO - - :who: mocsharp + - runtime.native.System.Net.Http + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:24.434Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:32.403765835 Z - - :approve - - runtime.any.System.Reflection - - :who: mocsharp + - runtime.native.System.Security.Cryptography.Apple + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:24.868Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:32.858655636 Z - - :approve - - runtime.any.System.Reflection.Extensions - - :who: mocsharp + - runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:25.303Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:33.315602333 Z - - :approve - - runtime.any.System.Reflection.Primitives - - :who: mocsharp + - runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:25.719Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:33.771768025 Z - - :approve - - runtime.any.System.Resources.ResourceManager - - :who: mocsharp + - runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:26.152Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:34.228810352 Z - - :approve - - runtime.any.System.Runtime - - :who: mocsharp + - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple + - :versions: + - 4.3.0 + :when: 2022-08-16T21:40:26.579Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:34.690529850 Z - - :approve - - runtime.any.System.Runtime.Handles - - :who: mocsharp + - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:27.001Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:35.150542193 Z - - :approve - - runtime.any.System.Runtime.InteropServices - - :who: mocsharp + - runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:27.431Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:35.620394499 Z - - :approve - - runtime.any.System.Text.Encoding - - :who: mocsharp + - runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:27.853Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:36.100093192 Z - - :approve - - runtime.any.System.Text.Encoding.Extensions - - :who: mocsharp + - runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:28.265Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:36.572772075 Z - - :approve - - runtime.any.System.Threading.Tasks - - :who: mocsharp + - runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl + - :versions: + - 4.3.0 + - 4.3.2 + :when: 2022-08-16T21:40:28.686Z + :who: mocsharp :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:37.042733737 Z - - :approve - - runtime.any.System.Threading.Timer - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:37.510163706 Z + - xRetry + - :versions: + - 1.9.0 + :when: 2022-08-16T23:07:57.794Z + :who: mocsharp + :why: MIT (https://github.com/JoshKeegan/xRetry/raw/master/LICENSE) - - :approve - - runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:37.975510010 Z + - xunit + - :versions: + - 2.6.5 + :when: 2022-08-16T21:40:29.166Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - - runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:38.442665116 Z + - xunit.abstractions + - :versions: + - 2.0.3 + :when: 2022-08-16T21:40:29.587Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - - runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:38.916484375 Z + - xunit.analyzers + - :versions: + - 1.9.0 + :when: 2022-08-16T21:40:30.047Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit.analyzers/master/LICENSE) - - :approve - - runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:39.378413588 Z + - xunit.assert + - :versions: + - 2.6.5 + :when: 2022-08-16T21:40:30.526Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - - runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:39.846759614 Z + - xunit.core + - :versions: + - 2.6.5 + :when: 2022-08-16T21:40:30.973Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - - runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:40.310122568 Z + - xunit.extensibility.core + - :versions: + - 2.6.5 + :when: 2022-08-16T21:40:31.401Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - - runtime.native.System - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:40.770387468 Z + - xunit.extensibility.execution + - :versions: + - 2.6.5 + :when: 2022-08-16T21:40:31.845Z + :who: mocsharp + :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - - runtime.native.System.IO.Compression - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:41.256353878 Z + - xunit.runner.visualstudio + - :versions: + - 2.5.6 + :when: 2022-08-16T21:40:32.294Z + :who: mocsharp + :why: MIT ( https://licenses.nuget.org/MIT) - - :approve - - runtime.native.System.Net.Http - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:41.735502132 Z -- - :approve - - runtime.native.System.Security.Cryptography.Apple - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:42.215870949 Z -- - :approve - - runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:42.677550528 Z -- - :approve - - runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:43.146802503 Z -- - :approve - - runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:43.607437995 Z -- - :approve - - runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:44.063686661 Z -- - :approve - - runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:44.531336835 Z -- - :approve - - runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:44.993904411 Z -- - :approve - - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:45.456102215 Z -- - :approve - - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:45.914491629 Z -- - :approve - - runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:46.387398978 Z -- - :approve - - runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:46.875356107 Z -- - :approve - - runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:47.338714846 Z -- - :approve - - runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:47.799517867 Z -- - :approve - - runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:48.261167359 Z -- - :approve - - runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:48.721519740 Z -- - :approve - - runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:49.217063386 Z -- - :approve - - runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:49.744187064 Z -- - :approve - - runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.2 - :when: 2022-08-16 23:07:50.215973953 Z -- - :approve - - runtime.unix.Microsoft.Win32.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:50.699325453 Z -- - :approve - - runtime.unix.System.Console - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:51.169241694 Z -- - :approve - - runtime.unix.System.Diagnostics.Debug - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:51.636258264 Z -- - :approve - - runtime.unix.System.IO.FileSystem - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:52.162021614 Z -- - :approve - - runtime.unix.System.Net.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:52.626421521 Z -- - :approve - - runtime.unix.System.Net.Sockets - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:53.095872278 Z -- - :approve - - runtime.unix.System.Private.Uri - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:53.570244807 Z -- - :approve - - runtime.unix.System.Runtime.Extensions - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:54.028175638 Z -- - :approve - - runtime.win.Microsoft.Win32.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:54.501591322 Z -- - :approve - - runtime.win.System.Console - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:54.973922104 Z -- - :approve - - runtime.win.System.Diagnostics.Debug - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:55.444537287 Z -- - :approve - - runtime.win.System.IO.FileSystem - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:55.920296048 Z -- - :approve - - runtime.win.System.Net.Primitives - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:56.376768598 Z -- - :approve - - runtime.win.System.Net.Sockets - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:56.838741736 Z -- - :approve - - runtime.win.System.Runtime.Extensions - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - :when: 2022-08-16 23:07:57.326794959 Z -- - :approve - - xRetry - - :who: mocsharp - :why: MIT (https://github.com/JoshKeegan/xRetry/raw/master/LICENSE) - :versions: - - 1.9.0 - :when: 2022-08-16 23:07:57.794503140 Z -- - :approve - - xunit - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.5.0 - :when: 2022-08-16 23:07:58.264039741 Z -- - :approve - - xunit - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.4.2 - :when: 2022-08-16 23:07:58.741042809 Z -- - :approve - - xunit.abstractions - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.0.3 - :when: 2022-08-16 23:07:59.230841326 Z -- - :approve - - xunit.analyzers - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 1.2.0 - :when: 2022-08-16 23:08:00.165216213 Z -- - :approve - - xunit.assert - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.5.0 - :when: 2022-08-16 23:08:01.105384447 Z -- - :approve - - xunit.core - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.5.0 - :when: 2022-08-16 23:08:02.057792372 Z -- - :approve - - xunit.extensibility.core - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.5.0 - :when: 2022-08-16 23:08:03.019024760 Z -- - :approve - - xunit.extensibility.execution - - :who: mocsharp - :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - :versions: - - 2.5.0 - :when: 2022-08-16 23:08:03.959558421 Z -- - :approve - - xunit.runner.visualstudio - - :who: mocsharp - :why: MIT ( https://licenses.nuget.org/MIT) - :versions: - - 2.5.0 - :when: 2022-08-16 23:08:04.892608686 Z -- - :approve - - Ardalis.GuardClauses - - :who: mocsharp - :why: MIT (https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) - :versions: - - 4.1.1 - :when: 2022-08-16 23:10:21.184627612 Z -- - :approve - - NLog - - :who: mocsharp - :why: BSD 3-Clause License (https://github.com/NLog/NLog/raw/dev/LICENSE.txt) - :versions: - - 5.2.4 - :when: 2022-10-12 03:14:06.538744982 Z -- - :approve - - NLog.Extensions.Logging - - :who: mocsharp - :why: BSD 2-Clause Simplified License (https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) - :versions: - - 5.3.4 - :when: 2022-10-12 03:14:06.964203977 Z -- - :approve - - NLog.Web.AspNetCore - - :who: mocsharp - :why: BSD 3-Clause License (https://github.com/NLog/NLog.Web/raw/master/LICENSE) - :versions: - - 5.3.4 - :when: 2022-10-12 03:14:07.396706995 Z -- - :approve - - fo-dicom.NLog - - :who: mocsharp - :why: Microsoft Public License (https://github.com/fo-dicom/fo-dicom/raw/development/License.txt) - :versions: - - 5.0.3 - :when: 2022-10-12 03:14:08.789273776 Z -- - :approve - - DnsClient - - :who: mocsharp - :why: Apache-2.0 (https://github.com/MichaCo/DnsClient.NET/raw/dev/LICENSE) - :versions: - - 1.6.1 - :when: 2022-11-16 23:33:33.315560769 Z -- - :approve - - Snappier - - :who: mocsharp - :why: BSD-3-Clause (https://github.com/brantburnett/Snappier/raw/main/COPYING.txt) - :versions: - - 1.0.0 - :when: 2022-10-14 23:37:36.642306800 Z -- - :approve - - ZstdSharp.Port - - :who: mocsharp - :why: MIT (https://github.com/oleg-st/ZstdSharp/raw/master/LICENSE) - :versions: - - 0.6.2 - :when: 2022-10-14 23:38:32.685243680 Z -- - :approve - - Microsoft.Win32.Registry - - :who: mocsharp - :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - :versions: - - 5.0.0 - :when: 2022-11-16 23:38:53.540718932 Z -- - :approve - - MongoDB.Bson - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - :versions: - - 2.21.0 - :when: 2022-11-16 23:38:53.891380809 Z -- - :approve - - MongoDB.Driver - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - :versions: - - 2.21.0 - :when: 2022-11-16 23:38:54.213853364 Z -- - :approve - - MongoDB.Driver.Core - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - :versions: - - 2.21.0 - :when: 2022-11-16 23:38:54.553730219 Z -- - :approve - - MongoDB.Libmongocrypt - - :who: mocsharp - :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - :versions: - - 1.8.0 - :when: 2022-11-16 23:38:54.863359236 Z -- - :approve - - SharpCompress - - :who: mocsharp - :why: MIT (https://github.com/adamhathcock/sharpcompress/raw/master/LICENSE.txt) - :versions: - - 0.30.1 - :when: 2022-11-16 23:38:55.192078193 Z -- - :approve - - SharpCompress - - :who: mocsharp - :why: MIT (https://github.com/adamhathcock/sharpcompress/raw/master/LICENSE.txt) - :versions: - - 0.30.1 - :when: 2022-11-16 23:38:55.532789254 Z -- - :approve - - Microsoft.AspNetCore.Authentication.JwtBearer - - :who: mocsharp - :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - :versions: - - 6.0.11 - :when: 2022-10-14 23:36:49.751931025 Z -- - :approve - - Microsoft.IdentityModel.JsonWebTokens - - :who: mocsharp - :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - :versions: - - 6.10.0 - :when: 2022-10-14 23:37:14.398733049 Z -- - :approve - - Microsoft.IdentityModel.Logging - - :who: mocsharp - :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - :versions: - - 6.10.0 - :when: 2022-10-14 23:37:15.196566449 Z -- - :approve - - Microsoft.IdentityModel.Protocols - - :who: mocsharp - :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - :versions: - - 6.10.0 - :when: 2022-10-14 23:37:16.007362554 Z -- - :approve - - Microsoft.IdentityModel.Protocols.OpenIdConnect - - :who: mocsharp - :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - :versions: - - 6.10.0 - :when: 2022-10-14 23:37:16.403183970 Z -- - :approve - - Microsoft.IdentityModel.Tokens - - :who: mocsharp - :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - :versions: - - 6.10.0 - :when: 2022-10-14 23:37:16.793759607 Z -- - :approve - - System.IdentityModel.Tokens.Jwt - - :who: mocsharp - :why: MIT (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) - :versions: - - 6.10.0 - :when: 2022-10-14 23:37:56.206982078 Z -- - :approve - - AspNetCore.HealthChecks.MongoDb - - :who: mocsharp - :why: Apache-2.0 (https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/raw/master/LICENSE) - :versions: - - 6.0.2 - :when: 2022-12-08 23:37:56.206982078 Z -- - :approve - - CommunityToolkit.HighPerformance - - :who: mocsharp - :why: MIT (https://raw.githubusercontent.com/CommunityToolkit/dotnet/main/License.md) - :versions: - - 8.2.0 - :when: 2023-08-04 0:02:30.206982078 Z -- - :approve - - Microsoft.Bcl.HashCode - - :who: mocsharp - :why: MIT (https://licenses.nuget.org/MIT) - :versions: - - 1.1.1 - :when: 2023-08-04 0:02:30.206982078 Z + - Xunit.SkippableFact + - :versions: + - 1.3.12 + :when: 2022-08-16T23:07:28.614Z + :who: mocsharp + :why: Microsoft Public License (https://raw.githubusercontent.com/AArnott/Xunit.SkippableFact/c7f20eaa78/LICENSE.txt) +- - :approve + - System.Composition + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Composition.AttributedModel + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Composition.Convention + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Composition.Hosting + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Composition.Runtime + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- - :approve + - System.Composition.TypedParts + - :versions: + - 6.0.0 + :when: 2022-08-16T21:39:55.442Z + :who: mocsharp + :why: MICROSOFT .NET LIBRARY License (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - :approve - - Devlooped.SponsorLink - - :who: mocsharp - :why: MIT (https://licenses.nuget.org/MIT) - :versions: - - 1.0.0 - :when: 2023-08-08 0:08:05.206982078 Z + - System.Configuration.ConfigurationManager + - :versions: + - 4.4.0 + - 4.5.0 + :when: 2022-08-16T23:06:43.335Z + :who: mocsharp + :why: MIT ( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - :approve - System.IO.Hashing - - :who: mocsharp - :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) - :versions: - - 7.0.0 - :when: 2023-08-10 20:50:14.759818552 Z -- - :approve - - System.Net.Http - - :who: mocsharp - :why: MICROSOFT .NET LIBRARY License ( http://go.microsoft.com/fwlink/?LinkId=329770) - :versions: - - 4.3.0 - - 4.3.4 - :when: 2022-08-16 23:07:41.735502132 Z - - - - - - - + - :versions: + - 7.0.0 + :when: 2023-08-10T20:50:14.759Z + :who: mocsharp + :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) \ No newline at end of file diff --git a/docs/compliance/third-party-licenses.md b/docs/compliance/third-party-licenses.md index 952785a9f..843dacd96 100644 --- a/docs/compliance/third-party-licenses.md +++ b/docs/compliance/third-party-licenses.md @@ -18,11 +18,11 @@
-Microsoft .NET 6 6.0 +Microsoft .NET 8 8.0 -## Microsoft .NET 6 +## Microsoft .NET 8 -- Version: 6.0 +- Version: 8.0 - Source: https://dot.net - Publisher: Microsoft - Project URL: https://dotnet.microsoft.com/en-us/ @@ -60,15 +60,15 @@ SOFTWARE.
-AWSSDK.Core 3.7.100.25 +AWSSDK.Core 3.7.300.29 ## AWSSDK.Core -- Version: 3.7.100.25 +- Version: 3.7.300.29 - Authors: Amazon Web Services - Owners: Amazon Web Services - Project URL: https://github.com/aws/aws-sdk-net/ -- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.Core/3.7.100.25) +- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.Core/3.7.300.29) - License: [Apache-2.0](https://github.com/aws/aws-sdk-net/raw/master/License.txt) @@ -107,11 +107,11 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and +You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. @@ -133,15 +133,15 @@ END OF TERMS AND CONDITIONS
-AWSSDK.S3 3.7.9.16 +AWSSDK.S3 3.7.305.4 ## AWSSDK.S3 -- Version: 3.7.9.16 +- Version: 3.7.305.4 - Authors: Amazon Web Services - Owners: Amazon Web Services - Project URL: https://github.com/aws/aws-sdk-net/ -- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.S3/3.7.9.16) +- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.S3/3.7.305.4) - License: [Apache-2.0](https://github.com/aws/aws-sdk-net/raw/master/License.txt) @@ -180,11 +180,11 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and +You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. @@ -206,15 +206,15 @@ END OF TERMS AND CONDITIONS
-AWSSDK.SecurityToken 3.7.100.25 +AWSSDK.SecurityToken 3.7.300.30 ## AWSSDK.SecurityToken -- Version: 3.7.100.25 +- Version: 3.7.300.30 - Authors: Amazon Web Services - Owners: Amazon Web Services - Project URL: https://github.com/aws/aws-sdk-net/ -- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.SecurityToken/3.7.100.25) +- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.SecurityToken/3.7.300.30) - License: [Apache-2.0](https://github.com/aws/aws-sdk-net/raw/master/License.txt) @@ -253,11 +253,11 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and +You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. @@ -279,14 +279,14 @@ END OF TERMS AND CONDITIONS
-Ardalis.GuardClauses 4.0.1 +Ardalis.GuardClauses 4.3.0 ## Ardalis.GuardClauses -- Version: 4.0.1 +- Version: 4.3.0 - Authors: Steve Smith (@ardalis) - Project URL: https://github.com/ardalis/guardclauses -- Source: [NuGet](https://www.nuget.org/packages/Ardalis.GuardClauses/4.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Ardalis.GuardClauses/4.3.0) - License: [MIT](https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) @@ -318,14 +318,14 @@ SOFTWARE.
-AspNetCore.HealthChecks.MongoDb 6.0.2 +AspNetCore.HealthChecks.MongoDb 8.0.0 ## AspNetCore.HealthChecks.MongoDb -- Version: 6.0.2 +- Version: 8.0.0 - Authors: Xabaril Contributors - Project URL: https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks -- Source: [NuGet](https://www.nuget.org/packages/AspNetCore.HealthChecks.MongoDb/6.0.2) +- Source: [NuGet](https://www.nuget.org/packages/AspNetCore.HealthChecks.MongoDb/8.0.0) - License: [Apache-2.0](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/raw/master/LICENSE) @@ -746,14 +746,14 @@ Apache License
-Castle.Core 5.0.0 +Castle.Core 5.1.1 ## Castle.Core -- Version: 5.0.0 +- Version: 5.1.1 - Authors: Castle Project Contributors - Project URL: http://www.castleproject.org/ -- Source: [NuGet](https://www.nuget.org/packages/Castle.Core/5.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Castle.Core/5.1.1) - License: [Apache-2.0](https://github.com/castleproject/Core/raw/master/LICENSE) @@ -777,31 +777,31 @@ limitations under the License.
-Castle.Core 5.1.1 +CommunityToolkit.HighPerformance 8.2.2 -## Castle.Core +## CommunityToolkit.HighPerformance -- Version: 5.1.1 -- Authors: Castle Project Contributors -- Project URL: http://www.castleproject.org/ -- Source: [NuGet](https://www.nuget.org/packages/Castle.Core/5.1.1) -- License: [Apache-2.0](https://github.com/castleproject/Core/raw/master/LICENSE) +- Version: 8.2.2 +- Authors: Microsoft +- Project URL: https://github.com/CommunityToolkit/dotnet +- Source: [NuGet](https://www.nuget.org/packages/CommunityToolkit.HighPerformance/8.2.2) +- License: [MIT](https://raw.githubusercontent.com/CommunityToolkit/dotnet/main/License.md) ``` -Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +# .NET Community Toolkit -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Copyright © .NET Foundation and Contributors - http://www.apache.org/licenses/LICENSE-2.0 +All rights reserved. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +## MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ```
@@ -884,46 +884,6 @@ SOFTWARE.
-
-Crc32.NET 1.2.0 - -## Crc32.NET - -- Version: 1.2.0 -- Authors: force -- Owners: force -- Project URL: https://github.com/force-net/Crc32.NET -- Source: [NuGet](https://www.nuget.org/packages/Crc32.NET/1.2.0) -- License: [MIT](https://github.com/force-net/Crc32.NET/raw/develop/LICENSE) - - -``` -The MIT License (MIT) - -Copyright (c) 2016 force - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- -
DnsClient 1.6.1 @@ -1144,13 +1104,13 @@ Apache License
-Docker.DotNet 3.125.13 +Docker.DotNet 3.125.15 ## Docker.DotNet -- Version: 3.125.13 +- Version: 3.125.15 - Authors: Docker.DotNet -- Source: [NuGet](https://www.nuget.org/packages/Docker.DotNet/3.125.13) +- Source: [NuGet](https://www.nuget.org/packages/Docker.DotNet/3.125.15) - License: [MIT](https://github.com/dotnet/Docker.DotNet/raw/master/LICENSE) @@ -1184,14 +1144,14 @@ SOFTWARE.
-DotNext 4.7.4 +DotNext 4.15.2 ## DotNext -- Version: 4.7.4 +- Version: 4.15.2 - Authors: .NET Foundation and Contributors - Project URL: https://dotnet.github.io/dotNext/ -- Source: [NuGet](https://www.nuget.org/packages/DotNext/4.7.4) +- Source: [NuGet](https://www.nuget.org/packages/DotNext/4.15.2) - License: [MIT](https://github.com/dotnet/dotNext/raw/master/LICENSE) @@ -1223,14 +1183,14 @@ SOFTWARE.
-DotNext.Threading 4.7.4 +DotNext.Threading 4.15.2 ## DotNext.Threading -- Version: 4.7.4 +- Version: 4.15.2 - Authors: .NET Foundation and Contributors - Project URL: https://dotnet.github.io/dotNext/ -- Source: [NuGet](https://www.nuget.org/packages/DotNext.Threading/4.7.4) +- Source: [NuGet](https://www.nuget.org/packages/DotNext.Threading/4.15.2) - License: [MIT](https://github.com/dotnet/dotNext/raw/master/LICENSE) @@ -1262,14 +1222,14 @@ SOFTWARE.
-FluentAssertions 6.10.0 +FluentAssertions 6.12.0 ## FluentAssertions -- Version: 6.10.0 +- Version: 6.12.0 - Authors: Dennis Doomen,Jonas Nyrup - Project URL: https://www.fluentassertions.com/ -- Source: [NuGet](https://www.nuget.org/packages/FluentAssertions/6.10.0) +- Source: [NuGet](https://www.nuget.org/packages/FluentAssertions/6.12.0) - License: [Apache-2.0](https://github.com/fluentassertions/fluentassertions/raw/develop/LICENSE) @@ -1509,44 +1469,6 @@ THE SOFTWARE.
-
-GitVersion.MsBuild 5.12.0 - -## GitVersion.MsBuild - -- Version: 5.12.0 -- Authors: GitTools and Contributors -- Project URL: https://github.com/GitTools/GitVersion -- Source: [NuGet](https://www.nuget.org/packages/GitVersion.MsBuild/5.12.0) -- License: [MIT](https://github.com/GitTools/GitVersion/raw/main/LICENSE) - - -``` -The MIT License (MIT) - -Copyright (c) 2021 NServiceBus Ltd, GitTools and contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -
- -
HL7-dotnetcore 2.36.0 @@ -1587,15 +1509,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-Humanizer.Core 2.8.26 +Humanizer.Core 2.14.1 ## Humanizer.Core -- Version: 2.8.26 +- Version: 2.14.1 - Authors: Mehdi Khalili, Claire Novotny -- Owners: Mehdi Khalili, Claire Novotny - Project URL: https://github.com/Humanizr/Humanizer -- Source: [NuGet](https://www.nuget.org/packages/Humanizer.Core/2.8.26) +- Source: [NuGet](https://www.nuget.org/packages/Humanizer.Core/2.14.1) - License: [MIT](https://github.com/Humanizr/Humanizer/raw/main/LICENSE) @@ -1641,22 +1562,21 @@ Copyright (c) 2013-2014 Omar Khudeira (http://omar.io)
-JetBrains.Annotations 2021.3.0 +Macross.Json.Extensions 3.0.0 -## JetBrains.Annotations +## Macross.Json.Extensions -- Version: 2021.3.0 -- Authors: JetBrains -- Owners: JetBrains -- Project URL: https://www.jetbrains.com/help/resharper/Code_Analysis__Code_Annotations.html -- Source: [NuGet](https://www.nuget.org/packages/JetBrains.Annotations/2021.3.0) -- License: [MIT](https://github.com/JetBrains/JetBrains.Annotations/raw/main/license.md) +- Version: 3.0.0 +- Authors: Macross.Json.Extensions +- Project URL: https://github.com/Macross-Software/core/tree/develop/ClassLibraries/Macross.Json.Extensions +- Source: [NuGet](https://www.nuget.org/packages/Macross.Json.Extensions/3.0.0) +- License: [MIT](https://github.com/Macross-Software/core/raw/develop/LICENSE.txt) ``` MIT License -Copyright (c) 2016 JetBrains http://www.jetbrains.com +Copyright (c) 2020 Macross Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1681,21 +1601,23 @@ SOFTWARE.
-Macross.Json.Extensions 3.0.0 +Microsoft.AspNetCore.Authentication.JwtBearer 8.0.0 -## Macross.Json.Extensions +## Microsoft.AspNetCore.Authentication.JwtBearer -- Version: 3.0.0 -- Authors: Macross.Json.Extensions -- Project URL: https://github.com/Macross-Software/core/tree/develop/ClassLibraries/Macross.Json.Extensions -- Source: [NuGet](https://www.nuget.org/packages/Macross.Json.Extensions/3.0.0) -- License: [MIT](https://github.com/Macross-Software/core/raw/develop/LICENSE.txt) +- Version: 8.0.0 +- Authors: Microsoft +- Project URL: https://asp.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearer/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` -MIT License +The MIT License (MIT) -Copyright (c) 2020 Macross Software +Copyright (c) .NET Foundation and Contributors + +All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1720,468 +1642,196 @@ SOFTWARE.
-Microsoft.AspNet.WebApi.Client 5.2.9 +Microsoft.AspNetCore.TestHost 8.0.0 -## Microsoft.AspNet.WebApi.Client +## Microsoft.AspNetCore.TestHost -- Version: 5.2.9 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft,aspnet -- Project URL: https://www.asp.net/web-api -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/5.2.9) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Project URL: https://asp.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.TestHost/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +The MIT License (MIT) -MICROSOFT .NET -LIBRARY +Copyright (c) .NET Foundation and Contributors -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +All rights reserved. -If -you comply with these license terms, you have the rights below. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Authentication.Abstractions 2.2.0 +Microsoft.Bcl.AsyncInterfaces 6.0.0 -## Microsoft.AspNetCore.Authentication.Abstractions +## Microsoft.Bcl.AsyncInterfaces -- Version: 2.2.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Abstractions/2.2.0) -- License: [Apache-2.0](https://github.com/aspnet/HttpAbstractions/raw/master/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Bcl.AsyncInterfaces/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +The MIT License (MIT) - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) .NET Foundation and Contributors - 1. Definitions. +All rights reserved. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +
- "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +
+Microsoft.Bcl.HashCode 1.1.1 - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +## Microsoft.Bcl.HashCode - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +- Version: 1.1.1 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://github.com/dotnet/corefx +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Bcl.HashCode/1.1.1) +- License: [MIT](https://licenses.nuget.org/MIT) - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +``` +'MIT' reference - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +MIT License +SPDX identifier +MIT +License text - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +MIT License - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +Copyright (c) + - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: +The above copyright notice and this permission notice + (including the next paragraph) + shall be included in all copies or substantial + portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +SPDX web page - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +https://spdx.org/licenses/MIT.html - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +Notice +This license content is provided by the SPDX project. For more information about licenses.nuget.org, see our documentation. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Data pulled from spdx/license-list-data on February 9, 2023. +``` - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +
- 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +
+Microsoft.CSharp 4.7.0 - END OF TERMS AND CONDITIONS +## Microsoft.CSharp - APPENDIX: How to apply the Apache License to your work. +- Version: 4.7.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://github.com/dotnet/corefx +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CSharp/4.7.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) .NET Foundation and Contributors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ``` +The MIT License (MIT) -
- - -
-Microsoft.AspNetCore.Authentication.Core 2.2.0 - -## Microsoft.AspNetCore.Authentication.Core - -- Version: 2.2.0 -- Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Core/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Authentication.JwtBearer 6.0.11 +Microsoft.CodeAnalysis.Analyzers 3.3.3 -## Microsoft.AspNetCore.Authentication.JwtBearer +## Microsoft.CodeAnalysis.Analyzers -- Version: 6.0.11 +- Version: 3.3.3 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearer/6.0.11) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Owners: Microsoft +- Project URL: https://github.com/dotnet/roslyn-analyzers +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeAnalysis.Analyzers/3.3.3) +- License: [MIT](https://github.com/dotnet/roslyn-analyzers/raw/main/License.txt) ``` @@ -2214,576 +1864,707 @@ SOFTWARE.
-Microsoft.AspNetCore.Authorization 2.2.0 +Microsoft.CodeAnalysis.CSharp 4.5.0 -## Microsoft.AspNetCore.Authorization +## Microsoft.CodeAnalysis.CSharp -- Version: 2.2.0 +- Version: 4.5.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Authorization/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://github.com/dotnet/roslyn +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp/4.5.0) +- License: [MIT](https://github.com/dotnet/roslyn/raw/main/License.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Authorization.Policy 2.2.0 +Microsoft.CodeAnalysis.CSharp.Workspaces 4.5.0 -## Microsoft.AspNetCore.Authorization.Policy +## Microsoft.CodeAnalysis.CSharp.Workspaces -- Version: 2.2.0 +- Version: 4.5.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Authorization.Policy/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://github.com/dotnet/roslyn +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Workspaces/4.5.0) +- License: [MIT](https://github.com/dotnet/roslyn/raw/main/License.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Hosting.Abstractions 2.2.0 +Microsoft.CodeAnalysis.Common 4.5.0 -## Microsoft.AspNetCore.Hosting.Abstractions +## Microsoft.CodeAnalysis.Common -- Version: 2.2.0 +- Version: 4.5.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Hosting.Abstractions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://github.com/dotnet/roslyn +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeAnalysis.Common/4.5.0) +- License: [MIT](https://github.com/dotnet/roslyn/raw/main/License.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Hosting.Server.Abstractions 2.2.0 +Microsoft.CodeAnalysis.Workspaces.Common 4.5.0 -## Microsoft.AspNetCore.Hosting.Server.Abstractions +## Microsoft.CodeAnalysis.Workspaces.Common -- Version: 2.2.0 +- Version: 4.5.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://github.com/dotnet/roslyn +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeAnalysis.Workspaces.Common/4.5.0) +- License: [MIT](https://github.com/dotnet/roslyn/raw/main/License.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Http 2.2.0 +Microsoft.CodeCoverage 17.8.0 -## Microsoft.AspNetCore.Http +## Microsoft.CodeCoverage -- Version: 2.2.0 +- Version: 17.8.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Http/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://github.com/microsoft/vstest +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.8.0) +- License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) ``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. +Copyright (c) 2020 Microsoft Corporation -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Http.Abstractions 2.2.0 +Microsoft.Data.Sqlite.Core 8.0.0 -## Microsoft.AspNetCore.Http.Abstractions +## Microsoft.Data.Sqlite.Core -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Http.Abstractions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/dotnet/standard/data/sqlite/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Http.Extensions 2.2.0 +Microsoft.EntityFrameworkCore 8.0.0 -## Microsoft.AspNetCore.Http.Extensions +## Microsoft.EntityFrameworkCore -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Http.Extensions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Http.Features 2.2.0 +Microsoft.EntityFrameworkCore.Abstractions 8.0.0 -## Microsoft.AspNetCore.Http.Features +## Microsoft.EntityFrameworkCore.Abstractions -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Http.Features/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Abstractions/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.JsonPatch 2.2.0 +Microsoft.EntityFrameworkCore.Analyzers 8.0.0 -## Microsoft.AspNetCore.JsonPatch +## Microsoft.EntityFrameworkCore.Analyzers -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.JsonPatch/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Analyzers/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Mvc.Abstractions 2.2.0 +Microsoft.EntityFrameworkCore.Design 8.0.0 -## Microsoft.AspNetCore.Mvc.Abstractions +## Microsoft.EntityFrameworkCore.Design -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Abstractions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Mvc.Core 2.2.0 +Microsoft.EntityFrameworkCore.InMemory 8.0.0 -## Microsoft.AspNetCore.Mvc.Core +## Microsoft.EntityFrameworkCore.InMemory -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Core/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Mvc.Formatters.Json 2.2.0 +Microsoft.EntityFrameworkCore.Relational 8.0.0 -## Microsoft.AspNetCore.Mvc.Formatters.Json +## Microsoft.EntityFrameworkCore.Relational -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Formatters.Json/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Mvc.WebApiCompatShim 2.2.0 +Microsoft.EntityFrameworkCore.Sqlite 8.0.0 -## Microsoft.AspNetCore.Mvc.WebApiCompatShim +## Microsoft.EntityFrameworkCore.Sqlite -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.WebApiCompatShim/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.ResponseCaching.Abstractions 2.2.0 +Microsoft.EntityFrameworkCore.Sqlite.Core 8.0.0 -## Microsoft.AspNetCore.ResponseCaching.Abstractions +## Microsoft.EntityFrameworkCore.Sqlite.Core -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.ResponseCaching.Abstractions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite.Core/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Routing 2.2.0 +Microsoft.EntityFrameworkCore.Tools 8.0.0 -## Microsoft.AspNetCore.Routing +## Microsoft.EntityFrameworkCore.Tools -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Routing/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Project URL: https://docs.microsoft.com/ef/core/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/8.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.Routing.Abstractions 2.2.0 +Microsoft.Extensions.ApiDescription.Server 6.0.5 -## Microsoft.AspNetCore.Routing.Abstractions +## Microsoft.Extensions.ApiDescription.Server -- Version: 2.2.0 +- Version: 6.0.5 - Authors: Microsoft -- Owners: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.Routing.Abstractions/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.ApiDescription.Server/6.0.5) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.AspNetCore.WebUtilities 2.2.0 +Microsoft.Extensions.ApiDescription.Server 8.0.0 -## Microsoft.AspNetCore.WebUtilities +## Microsoft.Extensions.ApiDescription.Server -- Version: 2.2.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.AspNetCore.WebUtilities/2.2.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.ApiDescription.Server/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` +The MIT License (MIT) + Copyright (c) .NET Foundation and Contributors All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.Bcl.AsyncInterfaces 1.1.1 +Microsoft.Extensions.Caching.Abstractions 8.0.0 -## Microsoft.Bcl.AsyncInterfaces +## Microsoft.Extensions.Caching.Abstractions -- Version: 1.1.1 +- Version: 8.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Bcl.AsyncInterfaces/1.1.1) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Abstractions/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -2817,14 +2598,14 @@ SOFTWARE.
-Microsoft.Bcl.AsyncInterfaces 6.0.0 +Microsoft.Extensions.Caching.Memory 8.0.0 -## Microsoft.Bcl.AsyncInterfaces +## Microsoft.Extensions.Caching.Memory -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Bcl.AsyncInterfaces/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -2858,415 +2639,96 @@ SOFTWARE.
-Microsoft.CSharp 4.0.1 +Microsoft.Extensions.Configuration 6.0.0 -## Microsoft.CSharp +## Microsoft.Extensions.Configuration -- Version: 4.0.1 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CSharp/4.0.1) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +The MIT License (MIT) -MICROSOFT .NET -LIBRARY +Copyright (c) .NET Foundation and Contributors -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +All rights reserved. -If -you comply with these license terms, you have the rights below. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.CSharp 4.3.0 +Microsoft.Extensions.Configuration 8.0.0 -## Microsoft.CSharp +## Microsoft.Extensions.Configuration -- Version: 4.3.0 +- Version: 8.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CSharp/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +The MIT License (MIT) -MICROSOFT .NET -LIBRARY +Copyright (c) .NET Foundation and Contributors -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +All rights reserved. -If -you comply with these license terms, you have the rights below. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-Microsoft.CSharp 4.7.0 +Microsoft.Extensions.Configuration.Abstractions 6.0.0 -## Microsoft.CSharp +## Microsoft.Extensions.Configuration.Abstractions -- Version: 4.7.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CSharp/4.7.0) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Abstractions/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3300,20 +2762,23 @@ SOFTWARE.
-Microsoft.CodeCoverage 17.7.2 +Microsoft.Extensions.Configuration.Abstractions 8.0.0 -## Microsoft.CodeCoverage +## Microsoft.Extensions.Configuration.Abstractions -- Version: 17.7.2 +- Version: 8.0.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.7.2) -- License: [MIT](https://github.com/microsoft/vstest/raw/main/LICENSE) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Abstractions/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -Copyright (c) 2020 Microsoft Corporation +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -3338,15 +2803,15 @@ SOFTWARE.
-Microsoft.Data.Sqlite.Core 6.0.22 +Microsoft.Extensions.Configuration.Binder 6.0.0 -## Microsoft.Data.Sqlite.Core +## Microsoft.Extensions.Configuration.Binder -- Version: 6.0.22 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/dotnet/standard/data/sqlite/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Binder/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3379,15 +2844,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore 6.0.22 +Microsoft.Extensions.Configuration.Binder 8.0.0 -## Microsoft.EntityFrameworkCore +## Microsoft.Extensions.Configuration.Binder -- Version: 6.0.22 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Binder/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3420,15 +2885,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Abstractions 6.0.22 +Microsoft.Extensions.Configuration.CommandLine 6.0.0 -## Microsoft.EntityFrameworkCore.Abstractions +## Microsoft.Extensions.Configuration.CommandLine -- Version: 6.0.22 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Abstractions/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.CommandLine/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3461,15 +2926,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Analyzers 6.0.22 +Microsoft.Extensions.Configuration.EnvironmentVariables 6.0.0 -## Microsoft.EntityFrameworkCore.Analyzers +## Microsoft.Extensions.Configuration.EnvironmentVariables -- Version: 6.0.22 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Analyzers/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3502,15 +2967,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Design 6.0.22 +Microsoft.Extensions.Configuration.EnvironmentVariables 8.0.0 -## Microsoft.EntityFrameworkCore.Design +## Microsoft.Extensions.Configuration.EnvironmentVariables -- Version: 6.0.22 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3543,15 +3008,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.InMemory 6.0.22 +Microsoft.Extensions.Configuration.FileExtensions 6.0.0 -## Microsoft.EntityFrameworkCore.InMemory +## Microsoft.Extensions.Configuration.FileExtensions -- Version: 6.0.22 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.FileExtensions/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3584,15 +3049,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Relational 6.0.22 +Microsoft.Extensions.Configuration.FileExtensions 8.0.0 -## Microsoft.EntityFrameworkCore.Relational +## Microsoft.Extensions.Configuration.FileExtensions -- Version: 6.0.22 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.FileExtensions/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3625,15 +3090,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Sqlite 6.0.22 +Microsoft.Extensions.Configuration.Json 6.0.0 -## Microsoft.EntityFrameworkCore.Sqlite +## Microsoft.Extensions.Configuration.Json -- Version: 6.0.22 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3666,15 +3131,15 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Sqlite.Core 6.0.22 +Microsoft.Extensions.Configuration.Json 8.0.0 -## Microsoft.EntityFrameworkCore.Sqlite.Core +## Microsoft.Extensions.Configuration.Json -- Version: 6.0.22 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite.Core/6.0.22) -- License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3707,15 +3172,15 @@ SOFTWARE.
-Microsoft.Extensions.ApiDescription.Server 6.0.5 +Microsoft.Extensions.Configuration.UserSecrets 6.0.0 -## Microsoft.Extensions.ApiDescription.Server +## Microsoft.Extensions.Configuration.UserSecrets -- Version: 6.0.5 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.ApiDescription.Server/6.0.5) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.UserSecrets/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -3748,14 +3213,14 @@ SOFTWARE.
-Microsoft.Extensions.Caching.Abstractions 6.0.0 +Microsoft.Extensions.Configuration.UserSecrets 8.0.0 -## Microsoft.Extensions.Caching.Abstractions +## Microsoft.Extensions.Configuration.UserSecrets -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Abstractions/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.UserSecrets/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3789,14 +3254,14 @@ SOFTWARE.
-Microsoft.Extensions.Caching.Memory 6.0.1 +Microsoft.Extensions.DependencyInjection 6.0.1 -## Microsoft.Extensions.Caching.Memory +## Microsoft.Extensions.DependencyInjection - Version: 6.0.1 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/6.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/6.0.1) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3830,14 +3295,14 @@ SOFTWARE.
-Microsoft.Extensions.Configuration 6.0.0 +Microsoft.Extensions.DependencyInjection 8.0.0 -## Microsoft.Extensions.Configuration +## Microsoft.Extensions.DependencyInjection -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3871,14 +3336,14 @@ SOFTWARE.
-Microsoft.Extensions.Configuration 6.0.1 +Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0 -## Microsoft.Extensions.Configuration +## Microsoft.Extensions.DependencyInjection.Abstractions -- Version: 6.0.1 +- Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/6.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3912,14 +3377,14 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.Abstractions 6.0.0 +Microsoft.Extensions.DependencyInjection.Abstractions 8.0.0 -## Microsoft.Extensions.Configuration.Abstractions +## Microsoft.Extensions.DependencyInjection.Abstractions -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Abstractions/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3953,14 +3418,14 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.Binder 6.0.0 +Microsoft.Extensions.DependencyModel 8.0.0 -## Microsoft.Extensions.Configuration.Binder +## Microsoft.Extensions.DependencyModel -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Binder/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyModel/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3994,15 +3459,15 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.CommandLine 6.0.0 +Microsoft.Extensions.Diagnostics 8.0.0 -## Microsoft.Extensions.Configuration.CommandLine +## Microsoft.Extensions.Diagnostics -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.CommandLine/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` @@ -4035,15 +3500,15 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.EnvironmentVariables 6.0.0 +Microsoft.Extensions.Diagnostics.Abstractions 8.0.0 -## Microsoft.Extensions.Configuration.EnvironmentVariables +## Microsoft.Extensions.Diagnostics.Abstractions -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.Abstractions/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` @@ -4076,15 +3541,15 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.EnvironmentVariables 6.0.1 +Microsoft.Extensions.Diagnostics.HealthChecks 8.0.0 -## Microsoft.Extensions.Configuration.EnvironmentVariables +## Microsoft.Extensions.Diagnostics.HealthChecks -- Version: 6.0.1 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.1) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Project URL: https://asp.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` @@ -4117,15 +3582,15 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.FileExtensions 6.0.0 +Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 8.0.0 -## Microsoft.Extensions.Configuration.FileExtensions +## Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.FileExtensions/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Project URL: https://asp.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` @@ -4158,15 +3623,15 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.Json 6.0.0 +Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 8.0.0 -## Microsoft.Extensions.Configuration.Json +## Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Project URL: https://asp.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/8.0.0) +- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) ``` @@ -4199,14 +3664,14 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.UserSecrets 6.0.0 +Microsoft.Extensions.FileProviders.Abstractions 6.0.0 -## Microsoft.Extensions.Configuration.UserSecrets +## Microsoft.Extensions.FileProviders.Abstractions - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.UserSecrets/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Abstractions/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4240,14 +3705,14 @@ SOFTWARE.
-Microsoft.Extensions.Configuration.UserSecrets 6.0.1 +Microsoft.Extensions.FileProviders.Abstractions 8.0.0 -## Microsoft.Extensions.Configuration.UserSecrets +## Microsoft.Extensions.FileProviders.Abstractions -- Version: 6.0.1 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.UserSecrets/6.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Abstractions/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4281,47 +3746,14 @@ SOFTWARE.
-Microsoft.Extensions.DependencyInjection 2.2.0 - -## Microsoft.Extensions.DependencyInjection - -- Version: 2.2.0 -- Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/2.2.0) -- License: [Apache-2.0](https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -``` - -
- - -
-Microsoft.Extensions.DependencyInjection 6.0.0 +Microsoft.Extensions.FileProviders.Physical 6.0.0 -## Microsoft.Extensions.DependencyInjection +## Microsoft.Extensions.FileProviders.Physical - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Physical/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4355,14 +3787,14 @@ SOFTWARE.
-Microsoft.Extensions.DependencyInjection 6.0.1 +Microsoft.Extensions.FileProviders.Physical 8.0.0 -## Microsoft.Extensions.DependencyInjection +## Microsoft.Extensions.FileProviders.Physical -- Version: 6.0.1 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/6.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Physical/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4396,47 +3828,14 @@ SOFTWARE.
-Microsoft.Extensions.DependencyInjection.Abstractions 2.2.0 - -## Microsoft.Extensions.DependencyInjection.Abstractions - -- Version: 2.2.0 -- Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0) -- License: [Apache-2.0](https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -``` - -
- - -
-Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0 +Microsoft.Extensions.FileSystemGlobbing 6.0.0 -## Microsoft.Extensions.DependencyInjection.Abstractions +## Microsoft.Extensions.FileSystemGlobbing - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileSystemGlobbing/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4470,14 +3869,14 @@ SOFTWARE.
-Microsoft.Extensions.DependencyModel 6.0.0 +Microsoft.Extensions.FileSystemGlobbing 8.0.0 -## Microsoft.Extensions.DependencyModel +## Microsoft.Extensions.FileSystemGlobbing -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyModel/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileSystemGlobbing/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4511,15 +3910,15 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks 6.0.12 +Microsoft.Extensions.Hosting 6.0.0 -## Microsoft.Extensions.Diagnostics.HealthChecks +## Microsoft.Extensions.Hosting -- Version: 6.0.12 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/6.0.12) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -4552,15 +3951,15 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks 6.0.22 +Microsoft.Extensions.Hosting 8.0.0 -## Microsoft.Extensions.Diagnostics.HealthChecks +## Microsoft.Extensions.Hosting -- Version: 6.0.22 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/6.0.22) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -4593,15 +3992,15 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.12 +Microsoft.Extensions.Hosting.Abstractions 6.0.0 -## Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions +## Microsoft.Extensions.Hosting.Abstractions -- Version: 6.0.12 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/6.0.12) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting.Abstractions/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -4634,15 +4033,15 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.22 +Microsoft.Extensions.Hosting.Abstractions 8.0.0 -## Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions +## Microsoft.Extensions.Hosting.Abstractions -- Version: 6.0.22 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/6.0.22) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting.Abstractions/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -4675,15 +4074,15 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.11 +Microsoft.Extensions.Http 8.0.0 -## Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore +## Microsoft.Extensions.Http -- Version: 6.0.11 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/6.0.11) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Http/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -4716,15 +4115,15 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.22 +Microsoft.Extensions.Logging 6.0.0 -## Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore +## Microsoft.Extensions.Logging -- Version: 6.0.22 +- Version: 6.0.0 - Authors: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/6.0.22) -- License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -4757,14 +4156,14 @@ SOFTWARE.
-Microsoft.Extensions.FileProviders.Abstractions 6.0.0 +Microsoft.Extensions.Logging 8.0.0 -## Microsoft.Extensions.FileProviders.Abstractions +## Microsoft.Extensions.Logging -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Abstractions/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4798,14 +4197,14 @@ SOFTWARE.
-Microsoft.Extensions.FileProviders.Physical 6.0.0 +Microsoft.Extensions.Logging.Abstractions 6.0.0 -## Microsoft.Extensions.FileProviders.Physical +## Microsoft.Extensions.Logging.Abstractions - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Physical/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4839,14 +4238,14 @@ SOFTWARE.
-Microsoft.Extensions.FileSystemGlobbing 6.0.0 +Microsoft.Extensions.Logging.Abstractions 8.0.0 -## Microsoft.Extensions.FileSystemGlobbing +## Microsoft.Extensions.Logging.Abstractions -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.FileSystemGlobbing/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4880,14 +4279,14 @@ SOFTWARE.
-Microsoft.Extensions.Hosting 6.0.0 +Microsoft.Extensions.Logging.Configuration 6.0.0 -## Microsoft.Extensions.Hosting +## Microsoft.Extensions.Logging.Configuration - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Configuration/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4921,14 +4320,14 @@ SOFTWARE.
-Microsoft.Extensions.Hosting 6.0.1 +Microsoft.Extensions.Logging.Configuration 8.0.0 -## Microsoft.Extensions.Hosting +## Microsoft.Extensions.Logging.Configuration -- Version: 6.0.1 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting/6.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Configuration/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4962,14 +4361,14 @@ SOFTWARE.
-Microsoft.Extensions.Hosting.Abstractions 6.0.0 +Microsoft.Extensions.Logging.Console 6.0.0 -## Microsoft.Extensions.Hosting.Abstractions +## Microsoft.Extensions.Logging.Console - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Hosting.Abstractions/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Console/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5003,14 +4402,14 @@ SOFTWARE.
-Microsoft.Extensions.Http 6.0.0 +Microsoft.Extensions.Logging.Debug 6.0.0 -## Microsoft.Extensions.Http +## Microsoft.Extensions.Logging.Debug - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Http/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Debug/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5044,14 +4443,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging 6.0.0 +Microsoft.Extensions.Logging.EventLog 6.0.0 -## Microsoft.Extensions.Logging +## Microsoft.Extensions.Logging.EventLog - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.EventLog/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5085,14 +4484,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Abstractions 6.0.0 +Microsoft.Extensions.Logging.EventSource 6.0.0 -## Microsoft.Extensions.Logging.Abstractions +## Microsoft.Extensions.Logging.EventSource - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.EventSource/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5126,14 +4525,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Abstractions 6.0.2 +Microsoft.Extensions.Options 6.0.0 -## Microsoft.Extensions.Logging.Abstractions +## Microsoft.Extensions.Options -- Version: 6.0.2 +- Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/6.0.2) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5167,14 +4566,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Abstractions 6.0.3 +Microsoft.Extensions.Options 8.0.0 -## Microsoft.Extensions.Logging.Abstractions +## Microsoft.Extensions.Options -- Version: 6.0.3 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/6.0.3) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5208,14 +4607,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Configuration 6.0.0 +Microsoft.Extensions.Options.ConfigurationExtensions 6.0.0 -## Microsoft.Extensions.Logging.Configuration +## Microsoft.Extensions.Options.ConfigurationExtensions - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Configuration/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options.ConfigurationExtensions/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5249,14 +4648,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Console 6.0.0 +Microsoft.Extensions.Options.ConfigurationExtensions 8.0.0 -## Microsoft.Extensions.Logging.Console +## Microsoft.Extensions.Options.ConfigurationExtensions -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Console/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5290,14 +4689,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Debug 6.0.0 +Microsoft.Extensions.Primitives 6.0.0 -## Microsoft.Extensions.Logging.Debug +## Microsoft.Extensions.Primitives - Version: 6.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Debug/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Primitives/6.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5331,14 +4730,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.EventLog 6.0.0 +Microsoft.Extensions.Primitives 8.0.0 -## Microsoft.Extensions.Logging.EventLog +## Microsoft.Extensions.Primitives -- Version: 6.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.EventLog/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Primitives/8.0.0) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5372,23 +4771,21 @@ SOFTWARE.
-Microsoft.Extensions.Logging.EventSource 6.0.0 +Microsoft.IdentityModel.Abstractions 7.0.3 -## Microsoft.Extensions.Logging.EventSource +## Microsoft.IdentityModel.Abstractions -- Version: 6.0.0 +- Version: 7.0.3 - Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.EventSource/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Abstractions/7.0.3) +- License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) ``` The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors - -All rights reserved. +Copyright (c) Microsoft Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5413,204 +4810,21 @@ SOFTWARE.
-Microsoft.Extensions.ObjectPool 2.2.0 +Microsoft.IdentityModel.JsonWebTokens 7.0.3 -## Microsoft.Extensions.ObjectPool +## Microsoft.IdentityModel.JsonWebTokens -- Version: 2.2.0 +- Version: 7.0.3 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.ObjectPool/2.2.0) -- License: [Apache-2.0](https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -``` - -
- - -
-Microsoft.Extensions.Options 2.2.0 - -## Microsoft.Extensions.Options - -- Version: 2.2.0 -- Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options/2.2.0) -- License: [Apache-2.0](https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -``` - -
- - -
-Microsoft.Extensions.Options 6.0.0 - -## Microsoft.Extensions.Options - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-Microsoft.Extensions.Options.ConfigurationExtensions 6.0.0 - -## Microsoft.Extensions.Options.ConfigurationExtensions - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options.ConfigurationExtensions/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-Microsoft.Extensions.Primitives 2.2.0 - -## Microsoft.Extensions.Primitives - -- Version: 2.2.0 -- Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Primitives/2.2.0) -- License: [Apache-2.0](https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -``` - -
- - -
-Microsoft.Extensions.Primitives 6.0.0 - -## Microsoft.Extensions.Primitives - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Primitives/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.JsonWebTokens/7.0.3) +- License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) ``` The MIT License (MIT) -Copyright (c) .NET Foundation and Contributors - -All rights reserved. +Copyright (c) Microsoft Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5635,14 +4849,14 @@ SOFTWARE.
-Microsoft.IdentityModel.JsonWebTokens 6.10.0 +Microsoft.IdentityModel.Logging 7.0.3 -## Microsoft.IdentityModel.JsonWebTokens +## Microsoft.IdentityModel.Logging -- Version: 6.10.0 +- Version: 7.0.3 - Authors: Microsoft - Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.JsonWebTokens/6.10.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Logging/7.0.3) - License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) @@ -5674,14 +4888,14 @@ SOFTWARE.
-Microsoft.IdentityModel.Logging 6.10.0 +Microsoft.IdentityModel.Protocols 7.0.3 -## Microsoft.IdentityModel.Logging +## Microsoft.IdentityModel.Protocols -- Version: 6.10.0 +- Version: 7.0.3 - Authors: Microsoft - Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Logging/6.10.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Protocols/7.0.3) - License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) @@ -5713,14 +4927,14 @@ SOFTWARE.
-Microsoft.IdentityModel.Protocols 6.10.0 +Microsoft.IdentityModel.Protocols.OpenIdConnect 7.0.3 -## Microsoft.IdentityModel.Protocols +## Microsoft.IdentityModel.Protocols.OpenIdConnect -- Version: 6.10.0 +- Version: 7.0.3 - Authors: Microsoft - Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Protocols/6.10.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Protocols.OpenIdConnect/7.0.3) - License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) @@ -5752,14 +4966,14 @@ SOFTWARE.
-Microsoft.IdentityModel.Protocols.OpenIdConnect 6.10.0 +Microsoft.IdentityModel.Tokens 7.0.3 -## Microsoft.IdentityModel.Protocols.OpenIdConnect +## Microsoft.IdentityModel.Tokens -- Version: 6.10.0 +- Version: 7.0.3 - Authors: Microsoft - Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Protocols.OpenIdConnect/6.10.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Tokens/7.0.3) - License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) @@ -5791,21 +5005,23 @@ SOFTWARE.
-Microsoft.IdentityModel.Tokens 6.10.0 +Microsoft.NET.ILLink.Tasks 8.0.0 -## Microsoft.IdentityModel.Tokens +## Microsoft.NET.ILLink.Tasks -- Version: 6.10.0 +- Version: 8.0.0 - Authors: Microsoft -- Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.IdentityModel.Tokens/6.10.0) -- License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.ILLink.Tasks/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` The MIT License (MIT) -Copyright (c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors + +All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5830,16 +5046,15 @@ SOFTWARE.
-Microsoft.NET.Test.Sdk 17.7.2 +Microsoft.NET.Test.Sdk 17.8.0 ## Microsoft.NET.Test.Sdk -- Version: 17.7.2 +- Version: 17.8.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.7.2) -- License: [MIT](https://raw.githubusercontent.com/microsoft/vstest/main/LICENSE) +- Project URL: https://github.com/microsoft/vstest +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.8.0) +- License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) ``` @@ -5877,10 +5092,15 @@ SOFTWARE. - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ - Source: [NuGet](https://www.nuget.org/packages/Microsoft.NETCore.Platforms/1.1.0) -- License: [MICROSOFT .NET LIBRARY License](http://go.microsoft.com/fwlink/?LinkId=329770) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -5896,7 +5116,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -5910,36 +5130,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -5948,11 +5168,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -5971,22 +5191,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -5995,10 +5215,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -6006,7 +5226,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -6027,10 +5247,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -6041,11 +5261,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -6067,48 +5287,6 @@ consequential or other damages.
-
-Microsoft.NETCore.Platforms 3.0.0 - -## Microsoft.NETCore.Platforms - -- Version: 3.0.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NETCore.Platforms/3.0.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- -
Microsoft.NETCore.Platforms 5.0.0 @@ -6165,6 +5343,11 @@ SOFTWARE. ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -6180,7 +5363,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -6194,36 +5377,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -6232,11 +5415,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -6255,22 +5438,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -6279,10 +5462,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -6290,7 +5473,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -6311,10 +5494,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -6325,11 +5508,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -6352,254 +5535,21 @@ consequential or other damages.
-Microsoft.NETCore.Targets 1.1.3 +Microsoft.OpenApi 1.2.3 -## Microsoft.NETCore.Targets +## Microsoft.OpenApi -- Version: 1.1.3 +- Version: 1.2.3 - Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NETCore.Targets/1.1.3) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Project URL: https://github.com/Microsoft/OpenAPI.NET +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.OpenApi/1.2.3) +- License: [MIT]( https://raw.githubusercontent.com/Microsoft/OpenAPI.NET/master/LICENSE) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +Copyright (c) Microsoft Corporation. All rights reserved. -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-Microsoft.Net.Http.Headers 2.2.8 - -## Microsoft.Net.Http.Headers - -- Version: 2.2.8 -- Authors: Microsoft -- Owners: Microsoft -- Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Net.Http.Headers/2.2.8) -- License: [Apache-2.0]( https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt) - - -``` -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -``` - -
- - -
-Microsoft.OpenApi 1.2.3 - -## Microsoft.OpenApi - -- Version: 1.2.3 -- Authors: Microsoft -- Project URL: https://github.com/Microsoft/OpenAPI.NET -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.OpenApi/1.2.3) -- License: [MIT]( https://raw.githubusercontent.com/Microsoft/OpenAPI.NET/master/LICENSE) - - -``` -Copyright (c) Microsoft Corporation. All rights reserved. - -MIT License +MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6624,16 +5574,15 @@ SOFTWARE.
-Microsoft.TestPlatform.ObjectModel 17.7.2 +Microsoft.TestPlatform.ObjectModel 17.8.0 ## Microsoft.TestPlatform.ObjectModel -- Version: 17.7.2 +- Version: 17.8.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.7.2) -- License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) +- Project URL: https://github.com/microsoft/vstest +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.8.0) +- License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) ``` @@ -6662,16 +5611,15 @@ SOFTWARE.
-Microsoft.TestPlatform.TestHost 17.7.2 +Microsoft.TestPlatform.TestHost 17.8.0 ## Microsoft.TestPlatform.TestHost -- Version: 17.7.2 +- Version: 17.8.0 - Authors: Microsoft -- Owners: Microsoft -- Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.7.2) -- License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.0/LICENSE) +- Project URL: https://github.com/microsoft/vstest +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.8.0) +- License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) ``` @@ -6699,68 +5647,6 @@ SOFTWARE.
-
-Microsoft.Toolkit.HighPerformance 7.1.2 - -## Microsoft.Toolkit.HighPerformance - -- Version: 7.1.2 -- Authors: Microsoft.Toolkit -- Project URL: https://github.com/CommunityToolkit/WindowsCommunityToolkit -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Toolkit.HighPerformance/7.1.2) -- License: [MIT](https://github.com/CommunityToolkit/WindowsCommunityToolkit/raw/main/License.md) - - -``` -# Windows Community Toolkit - -Copyright © .NET Foundation and Contributors - -All rights reserved. - -## MIT License (MIT) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -
- - -
-Microsoft.Toolkit.HighPerformance 7.1.2 - -## Microsoft.Toolkit.HighPerformance - -- Version: 7.1.2 -- Authors: Microsoft.Toolkit -- Project URL: https://github.com/CommunityToolkit/WindowsCommunityToolkit -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Toolkit.HighPerformance/7.1.2) -- License: [MIT](https://github.com/CommunityToolkit/WindowsCommunityToolkit/raw/main/License.md) - - -``` -# Windows Community Toolkit - -Copyright © .NET Foundation and Contributors - -All rights reserved. - -## MIT License (MIT) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -
- -
Microsoft.Win32.Primitives 4.3.0 @@ -6775,6 +5661,11 @@ THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -6790,7 +5681,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -6804,36 +5695,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -6842,11 +5733,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -6865,22 +5756,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -6889,10 +5780,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -6900,7 +5791,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -6921,10 +5812,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -6935,11 +5826,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -7004,57 +5895,15 @@ SOFTWARE.
-Microsoft.Win32.SystemEvents 4.5.0 +Minio 6.0.1 -## Microsoft.Win32.SystemEvents +## Minio -- Version: 4.5.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Win32.SystemEvents/4.5.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-Minio 4.0.6 - -## Minio - -- Version: 4.0.6 -- Authors: MinIO, Inc. -- Project URL: https://github.com/minio/minio-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Minio/4.0.6) -- License: [Apache-2.0](https://github.com/minio/minio-dotnet/raw/master/LICENSE) +- Version: 6.0.1 +- Authors: MinIO, Inc. +- Project URL: https://github.com/minio/minio-dotnet +- Source: [NuGet](https://www.nuget.org/packages/Minio/6.0.1) +- License: [Apache-2.0](https://github.com/minio/minio-dotnet/raw/master/LICENSE) ``` @@ -7265,14 +6114,14 @@ Apache License
-Monai.Deploy.Messaging 1.0.1 +Monai.Deploy.Messaging 2.0.0 ## Monai.Deploy.Messaging -- Version: 1.0.1 +- Version: 2.0.0 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-messaging -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging/1.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging/2.0.0) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) @@ -7493,14 +6342,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Messaging.RabbitMQ 1.0.1 +Monai.Deploy.Messaging.RabbitMQ 2.0.0 ## Monai.Deploy.Messaging.RabbitMQ -- Version: 1.0.1 +- Version: 2.0.0 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-messaging -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging.RabbitMQ/1.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging.RabbitMQ/2.0.0) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) @@ -7721,14 +6570,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Security 0.1.3 +Monai.Deploy.Security 1.0.0 ## Monai.Deploy.Security -- Version: 0.1.3 +- Version: 1.0.0 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-security -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Security/0.1.3) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Security/1.0.0) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-security/raw/develop/LICENSE) @@ -7949,14 +6798,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Storage 0.2.18 +Monai.Deploy.Storage 1.0.0 ## Monai.Deploy.Storage -- Version: 0.2.18 +- Version: 1.0.0 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-storage -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage/0.2.18) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage/1.0.0) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -8177,14 +7026,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Storage.MinIO 0.2.18 +Monai.Deploy.Storage.MinIO 1.0.0 ## Monai.Deploy.Storage.MinIO -- Version: 0.2.18 +- Version: 1.0.0 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-storage -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.MinIO/0.2.18) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.MinIO/1.0.0) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -8405,14 +7254,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Storage.S3Policy 0.2.18 +Monai.Deploy.Storage.S3Policy 1.0.0 ## Monai.Deploy.Storage.S3Policy -- Version: 0.2.18 +- Version: 1.0.0 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-storage -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.S3Policy/0.2.18) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.S3Policy/1.0.0) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -8633,1195 +7482,1603 @@ By downloading this software, you agree to the license terms & all licenses list
-MongoDB.Bson 2.19.1 +MongoDB.Bson 2.23.1 ## MongoDB.Bson -- Version: 2.19.1 +- Version: 2.23.1 - Authors: MongoDB Inc. - Project URL: https://www.mongodb.com/docs/drivers/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Bson/2.19.1) -- License: [Apache-2.0](https://github.com/mongodb/mongo-csharp-driver/raw/master/License.txt) +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Bson/2.23.1) +- License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) ``` -/* Copyright 2010-present MongoDB Inc. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. -
-MongoDB.Driver 2.19.1 + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -## MongoDB.Driver + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -- Version: 2.19.1 -- Authors: MongoDB Inc. -- Project URL: https://www.mongodb.com/docs/drivers/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver/2.19.1) -- License: [Apache-2.0](https://github.com/mongodb/mongo-csharp-driver/raw/master/License.txt) + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -``` -/* Copyright 2010-present MongoDB Inc. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -``` + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -
+ "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -
-MongoDB.Driver.Core 2.19.1 + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -## MongoDB.Driver.Core + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -- Version: 2.19.1 -- Authors: MongoDB Inc. -- Project URL: https://www.mongodb.com/docs/drivers/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver.Core/2.19.1) -- License: [Apache-2.0](https://github.com/mongodb/mongo-csharp-driver/raw/master/License.txt) + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -``` -/* Copyright 2010-present MongoDB Inc. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -``` + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -
+ 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -
-MongoDB.Libmongocrypt 1.7.0 + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -## MongoDB.Libmongocrypt + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -- Version: 1.7.0 -- Authors: MongoDB Inc. -- Project URL: http://www.mongodb.org/display/DOCS/CSharp+Language+Center -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Libmongocrypt/1.7.0) -- License: [Apache-2.0](https://github.com/mongodb/mongo-csharp-driver/raw/master/License.txt) + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -``` -/* Copyright 2010-present MongoDB Inc. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -``` + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -
+ 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -
-Moq 4.20.69 + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -## Moq + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -- Version: 4.20.69 -- Authors: Daniel Cazzulino, kzu -- Project URL: https://github.com/moq/moq4 -- Source: [NuGet](https://www.nuget.org/packages/Moq/4.20.69) -- License: [BSD 3-Clause License]( https://raw.githubusercontent.com/moq/moq4/main/License.txt) + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. -``` -BSD 3-Clause License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, -and Contributors. All rights reserved. + Copyright {yyyy} {name of copyright owner} -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + http://www.apache.org/licenses/LICENSE-2.0 - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +
+ + +
+MongoDB.Driver 2.23.1 + +## MongoDB.Driver + +- Version: 2.23.1 +- Authors: MongoDB Inc. +- Project URL: https://www.mongodb.com/docs/drivers/csharp/ +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver/2.23.1) +- License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - * Neither the names of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. -
-Moq 4.20.1 + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -## Moq + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -- Version: 4.20.1 -- Authors: Daniel Cazzulino, kzu -- Project URL: https://github.com/moq/moq4 -- Source: [NuGet](https://www.nuget.org/packages/Moq/4.20.1) -- License: [BSD 3-Clause License]( https://raw.githubusercontent.com/moq/moq4/main/License.txt) + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -``` -BSD 3-Clause License + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, -and Contributors. All rights reserved. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." - * Neither the names of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -
+ 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -
-NETStandard.Library 1.6.1 + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -## NETStandard.Library + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -- Version: 1.6.1 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/NETStandard.Library/1.6.1) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY +
-These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. +
+MongoDB.Driver.Core 2.23.1 -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +## MongoDB.Driver.Core -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
+- Version: 2.23.1 +- Authors: MongoDB Inc. +- Project URL: https://www.mongodb.com/docs/drivers/csharp/ +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver.Core/2.23.1) +- License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) -
-NETStandard.Library 2.0.0 +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -## NETStandard.Library + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -- Version: 2.0.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/NETStandard.Library/2.0.0) -- License: [MIT](https://github.com/dotnet/standard/raw/release/2.0.0/LICENSE.TXT) + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -``` -The MIT License (MIT) + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Copyright (c) .NET Foundation and Contributors + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -
+ "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -
-NLog 5.2.3 + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -## NLog + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -- Version: 5.2.3 -- Authors: Jarek Kowalski,Kim Christensen,Julian Verdurmen -- Project URL: https://nlog-project.org/ -- Source: [NuGet](https://www.nuget.org/packages/NLog/5.2.3) -- License: [BSD 3-Clause License](https://github.com/NLog/NLog/raw/dev/LICENSE.txt) + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -``` -Copyright (c) 2004-2021 Jaroslaw Kowalski , Kim Christensen, Julian Verdurmen + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -All rights reserved. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -* Neither the name of Jaroslaw Kowalski nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. -``` + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -
+ 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -
-NLog.Extensions.Logging 5.2.3 + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -## NLog.Extensions.Logging + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -- Version: 5.2.3 -- Authors: Microsoft,Julian Verdurmen -- Project URL: https://github.com/NLog/NLog.Extensions.Logging -- Source: [NuGet](https://www.nuget.org/packages/NLog.Extensions.Logging/5.2.3) -- License: [BSD 2-Clause Simplified License](https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. -``` -Copyright (c) 2016, NLog -All rights reserved. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + Copyright {yyyy} {name of copyright owner} -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + http://www.apache.org/licenses/LICENSE-2.0 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ```
-NLog.Web.AspNetCore 5.2.3 +MongoDB.Libmongocrypt 1.8.0 -## NLog.Web.AspNetCore +## MongoDB.Libmongocrypt -- Version: 5.2.3 -- Authors: Julian Verdurmen -- Project URL: https://github.com/NLog/NLog.Web -- Source: [NuGet](https://www.nuget.org/packages/NLog.Web.AspNetCore/5.2.3) -- License: [BSD 3-Clause License](https://github.com/NLog/NLog.Web/raw/master/LICENSE) +- Version: 1.8.0 +- Authors: MongoDB Inc. +- Project URL: http://www.mongodb.org/display/DOCS/CSharp+Language+Center +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Libmongocrypt/1.8.0) +- License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) ``` -BSD 3-Clause License +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Copyright (c) 2015-2020, Jaroslaw Kowalski , Kim Christensen, Julian Verdurmen -All rights reserved. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + 1. Definitions. -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -* Neither the name of NLog nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -
+ "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -
-Newtonsoft.Json 10.0.1 + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## Newtonsoft.Json + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -- Version: 10.0.1 -- Authors: James Newton-King -- Owners: James Newton-King -- Project URL: http://www.newtonsoft.com/json -- Source: [NuGet](https://www.nuget.org/packages/Newtonsoft.Json/10.0.1) -- License: [MIT](https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -``` -The MIT License (MIT) + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Copyright (c) 2007 James Newton-King + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -
- - -
-Newtonsoft.Json 13.0.1 - -## Newtonsoft.Json - -- Version: 13.0.1 -- Authors: James Newton-King -- Project URL: https://www.newtonsoft.com/json -- Source: [NuGet](https://www.nuget.org/packages/Newtonsoft.Json/13.0.1) -- License: [MIT](https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) - - -``` -The MIT License (MIT) + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Copyright (c) 2007 James Newton-King + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -
+ 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -
-Newtonsoft.Json 13.0.2 + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -## Newtonsoft.Json + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -- Version: 13.0.2 -- Authors: James Newton-King -- Project URL: https://www.newtonsoft.com/json -- Source: [NuGet](https://www.nuget.org/packages/Newtonsoft.Json/13.0.2) -- License: [MIT](https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. -``` -The MIT License (MIT) + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2007 James Newton-King + Copyright {yyyy} {name of copyright owner} -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ```
-Newtonsoft.Json.Bson 1.0.1 +Mono.TextTemplating 2.2.1 -## Newtonsoft.Json.Bson +## Mono.TextTemplating -- Version: 1.0.1 -- Authors: James Newton-King -- Owners: James Newton-King -- Project URL: http://www.newtonsoft.com/json -- Source: [NuGet](https://www.nuget.org/packages/Newtonsoft.Json.Bson/1.0.1) -- License: [MIT](https://github.com/JamesNK/Newtonsoft.Json.Bson/raw/master/LICENSE.md) +- Version: 2.2.1 +- Authors: mhutch +- Project URL: https://github.com/mono/t4 +- Source: [NuGet](https://www.nuget.org/packages/Mono.TextTemplating/2.2.1) +- License: [MIT](https://github.com/mono/t4/raw/main/LICENSE) ``` -The MIT License (MIT) +Mono.TextTemplating is licensed under the MIT license: -Copyright (c) 2017 James Newton-King +Copyright (c) 2009-2011 Novell, Inc. (http://www.novell.com) +Copyright (c) 2011-2016 Xamarin Inc. (http://www.xamarin.com) +Copyright (c) Microsoft Corp. (http://www.microsoft.com) +Copyright (c) The contributors -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ```
-NuGet.Frameworks 5.11.0 +Moq 4.20.70 -## NuGet.Frameworks +## Moq -- Version: 5.11.0 -- Authors: Microsoft -- Project URL: https://aka.ms/nugetprj -- Source: [NuGet](https://www.nuget.org/packages/NuGet.Frameworks/5.11.0) -- License: [Apache-2.0](https://github.com/NuGet/NuGet.Client/raw/dev/LICENSE.txt) +- Version: 4.20.70 +- Authors: Daniel Cazzulino, kzu +- Project URL: https://github.com/moq/moq +- Source: [NuGet](https://www.nuget.org/packages/Moq/4.20.70) +- License: [BSD 3-Clause License]( https://raw.githubusercontent.com/moq/moq4/main/License.txt) ``` -Copyright (c) .NET Foundation and Contributors. +BSD 3-Clause License -All rights reserved. +Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, +and Contributors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the -License at + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. -http://www.apache.org/licenses/LICENSE-2.0 + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. + * Neither the names of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ```
-Polly 7.2.3 - -## Polly +NETStandard.Library 1.6.1 -- Version: 7.2.3 -- Authors: Michael Wolfenden, App vNext -- Project URL: https://github.com/App-vNext/Polly -- Source: [NuGet](https://www.nuget.org/packages/Polly/7.2.3) -- License: [New BSD License](https://github.com/App-vNext/Polly/raw/main/LICENSE.txt) +## NETStandard.Library +- Version: 1.6.1 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/NETStandard.Library/1.6.1) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -New BSD License -= -Copyright (c) 2015-2020, App vNext -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of App vNext nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +.NET Library License Terms | .NET -
-
-Portable.BouncyCastle 1.8.9 -## Portable.BouncyCastle - -- Version: 1.8.9 -- Authors: Claire Novotny -- Project URL: https://www.bouncycastle.org/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/Portable.BouncyCastle/1.8.9) -- License: [MIT]( https://www.bouncycastle.org/csharp/licence.html) - - -``` -bouncycastle.org +MICROSOFT SOFTWARE LICENSE +TERMS +MICROSOFT .NET +LIBRARY +These +license terms are an agreement between you and Microsoft Corporation (or based +on where you live, one of its affiliates). They apply to the software named +above. The terms also apply to any Microsoft services or updates for the +software, except to the extent those have different terms. +If +you comply with these license terms, you have the rights below. +1.    INSTALLATION AND USE RIGHTS. +You may +install and use any number of copies of the software to develop and test your applications.  +2.    +THIRD PARTY COMPONENTS. The software may include third party components with +separate legal notices or governed by other agreements, as may be described in +the ThirdPartyNotices file(s) accompanying the software. +3.    +ADDITIONAL LICENSING +REQUIREMENTS AND/OR USE RIGHTS. +a.     +DISTRIBUTABLE +CODE.  The software is +comprised of Distributable Code. “Distributable Code” is code that you are +permitted to distribute in applications you develop if you comply with the +terms below. +i.      Right to Use and Distribute. +·        +You may copy and distribute the object code form of the software. +·        +Third Party Distribution. You may permit distributors of your applications +to copy and distribute the Distributable Code as part of those applications. +ii.     Distribution Requirements. For any +Distributable Code you distribute, you must +·        +use the Distributable Code in your applications and not as a +standalone distribution; +·        +require distributors and external end users to agree to terms that +protect it at least as much as this agreement; and +·        +indemnify, defend, and hold harmless Microsoft from any claims, +including attorneys’ fees, related to the distribution or use of your applications, +except to the extent that any claim is based solely on the unmodified Distributable +Code. +iii.   Distribution Restrictions. You may not +·        +use Microsoft’s trademarks in your applications’ names or in a way +that suggests your applications come from or are endorsed by Microsoft; or +·        +modify or distribute the source code of any Distributable Code so +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or +distribution of code, that (i) it be disclosed or distributed in source code +form; or (ii) others have the right to modify it. +4.    +DATA. +a.     +Data Collection. The software may collect +information about you and your use of the software, and send that to Microsoft. +Microsoft may use this information to provide services and improve our products +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and +Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with Microsoft’s +privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and its use from the software documentation and our privacy +statement. Your use of the software operates as your consent to these +practices. +b.    +Processing of Personal Data. To the extent Microsoft is a +processor or subprocessor of personal data in connection with the software, +Microsoft makes the commitments in the European Union General Data Protection +Regulation Terms of the Online Services Terms to all customers effective May +25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. +5.    +Scope of +License. The software is licensed, not sold. This agreement +only gives you some rights to use the software. Microsoft reserves all other +rights. Unless applicable law gives you more rights despite this limitation, +you may use the software only as expressly permitted in this agreement. In +doing so, you must comply with any technical limitations in the software that +only allow you to use it in certain ways. You may not +·        +work around any technical +limitations in the software; +·        +reverse engineer, decompile or +disassemble the software, or otherwise attempt to derive the source code for +the software, except and to the extent required by third party licensing terms +governing use of certain open source components that may be included in the +software; +·        +remove, minimize, block or modify +any notices of Microsoft or its suppliers in the software; +·        +use the software in any way that +is against the law; or +·        +share, publish, rent or lease the +software, provide the software as a stand-alone offering for others to use, or +transfer the software or this agreement to any third party. +6.    +Export +Restrictions. You must comply with all domestic and international +export laws and regulations that apply to the software, which include +restrictions on destinations, end users, and end use. For further information +on export restrictions, visit www.microsoft.com/exporting. +7.    +SUPPORT +SERVICES. Because this software is “as is,” we may not provide +support services for it. +8.    +Entire +Agreement. This +agreement, and the terms for supplements, updates, Internet-based services and +support services that you use, are the entire agreement for the software and +support services. +9.    Applicable Law.  If you acquired the software in the United States, Washington law +applies to interpretation of and claims for breach of this agreement, and the +laws of the state where you live apply to all other claims. If you acquired the +software in any other country, its laws apply. +10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You +may have other rights, including consumer rights, under the laws of your state +or country. Separate and apart from your relationship with Microsoft, you may +also have rights with respect to the party from which you acquired the +software. This agreement does not change those other rights if the laws of your +state or country do not permit it to do so. For example, if you acquired the +software in one of the below regions, or mandatory country law applies, then +the following provisions apply to you: +a)    Australia. You have statutory guarantees under the Australian Consumer +Law and nothing in this agreement is intended to affect those rights. +b)    Canada. If you acquired this software in Canada, you may stop +receiving updates by turning off the automatic update feature, disconnecting +your device from the Internet (if and when you re-connect to the Internet, +however, the software will resume checking for and installing updates), or uninstalling +the software. The product documentation, if any, may also specify how to turn +off updates for your specific device or software. +c)    Germany and Austria. +(i)        Warranty. The software will perform +substantially as described in any Microsoft materials that accompany it. +However, Microsoft gives no contractual guarantee in relation to the software. +(ii)       Limitation of Liability. In case of +intentional conduct, gross negligence, claims based on the Product Liability +Act, as well as in case of death or personal or physical injury, Microsoft is +liable according to the statutory law. +Subject to the foregoing clause (ii), Microsoft will only +be liable for slight negligence if Microsoft is in breach of such material +contractual obligations, the fulfillment of which facilitate the due +performance of this agreement, the breach of which would endanger the purpose +of this agreement and the compliance with which a party may constantly trust in +(so-called "cardinal obligations"). In other cases of slight negligence, +Microsoft will not be liable for slight negligence +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK +OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. +TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NON-INFRINGEMENT. +12. +Limitation +on and Exclusion of Remedies and Damages. YOU +CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. +$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST +PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) +anything related to the software, services, content (including code) on third +party Internet sites, or third party applications; and (b) claims for breach of +contract, breach of warranty, guarantee or condition, strict liability, +negligence, or other tort to the extent permitted by applicable law. +It +also applies even if Microsoft knew or should have known about the possibility +of the damages. The above limitation or exclusion may not apply to you because +your state or country may not allow the exclusion or limitation of incidental, +consequential or other damages. +``` +
+
+NLog 5.2.8 +## NLog +- Version: 5.2.8 +- Authors: Jarek Kowalski,Kim Christensen,Julian Verdurmen +- Project URL: https://nlog-project.org/ +- Source: [NuGet](https://www.nuget.org/packages/NLog/5.2.8) +- License: [BSD 3-Clause License](https://github.com/NLog/NLog/raw/dev/LICENSE.txt) +``` +Copyright (c) 2004-2021 Jaroslaw Kowalski , Kim Christensen, Julian Verdurmen -The Legion of the Bouncy Castle +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Jaroslaw Kowalski nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. +``` -home -wiki -issue tracker -mailing lists -resources -legal and licencing -contributors +
-  +
+NLog.Extensions.Logging 5.3.8 +## NLog.Extensions.Logging -Please note: our license is an adaptation of the MIT X11 License and should be read as such. -Please also note: this licensing model is made possible through funding from donations and the sale of support contracts. -License -Copyright (c) 2000 - 2022 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +- Version: 5.3.8 +- Authors: Microsoft,Julian Verdurmen +- Project URL: https://github.com/NLog/NLog.Extensions.Logging +- Source: [NuGet](https://www.nuget.org/packages/NLog.Extensions.Logging/5.3.8) +- License: [BSD 2-Clause Simplified License](https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) -  +``` +Copyright (c) 2016, NLog +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -  +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -Site hosted by Tau Ceti Co-operative Ltd. -Graphics provided by Geoff Hook. -Layout and design by Travis Winters. -C# is a registered trademark of Microsoft ®. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ```
-RabbitMQ.Client 6.5.0 +NLog.Web.AspNetCore 5.3.8 -## RabbitMQ.Client +## NLog.Web.AspNetCore -- Version: 6.5.0 -- Authors: VMware -- Project URL: https://www.rabbitmq.com/dotnet.html -- Source: [NuGet](https://www.nuget.org/packages/RabbitMQ.Client/6.5.0) -- License: [Apache-2.0](https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) +- Version: 5.3.8 +- Authors: Julian Verdurmen +- Project URL: https://github.com/NLog/NLog.Web +- Source: [NuGet](https://www.nuget.org/packages/NLog.Web.AspNetCore/5.3.8) +- License: [BSD 3-Clause License](https://github.com/NLog/NLog.Web/raw/master/LICENSE) ``` -Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ +BSD 3-Clause License - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) 2015-2020, Jaroslaw Kowalski , Kim Christensen, Julian Verdurmen +All rights reserved. - 1. Definitions. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +* Neither the name of NLog nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +
- "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +
+Newtonsoft.Json 13.0.1 - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +## Newtonsoft.Json - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +- Version: 13.0.1 +- Authors: James Newton-King +- Project URL: https://www.newtonsoft.com/json +- Source: [NuGet](https://www.nuget.org/packages/Newtonsoft.Json/13.0.1) +- License: [MIT](https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +``` +The MIT License (MIT) - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +Copyright (c) 2007 James Newton-King - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +
- 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +
+Newtonsoft.Json 13.0.3 - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +## Newtonsoft.Json - END OF TERMS AND CONDITIONS +- Version: 13.0.3 +- Authors: James Newton-King +- Project URL: https://www.newtonsoft.com/json +- Source: [NuGet](https://www.nuget.org/packages/Newtonsoft.Json/13.0.3) +- License: [MIT](https://github.com/JamesNK/Newtonsoft.Json/raw/master/LICENSE.md) - APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +``` +The MIT License (MIT) - Copyright [yyyy] [name of copyright owner] +Copyright (c) 2007 James Newton-King - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: - https://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ```
-SQLitePCLRaw.bundle_e_sqlite3 2.1.2 +NuGet.Frameworks 6.5.0 -## SQLitePCLRaw.bundle_e_sqlite3 +## NuGet.Frameworks -- Version: 2.1.2 -- Authors: Eric Sink -- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.bundle_e_sqlite3/2.1.2) -- License: [Apache-2.0](https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) +- Version: 6.5.0 +- Authors: Microsoft +- Project URL: https://aka.ms/nugetprj +- Source: [NuGet](https://www.nuget.org/packages/NuGet.Frameworks/6.5.0) +- License: [Apache-2.0](https://github.com/NuGet/NuGet.Client/raw/dev/LICENSE.txt) ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) .NET Foundation and Contributors. - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +All rights reserved. - 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +these files except in compliance with the License. You may obtain a copy of the +License at - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +http://www.apache.org/licenses/LICENSE-2.0 - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. +``` - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +
- "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +
+Polly 8.2.1 - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +## Polly - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +- Version: 8.2.1 +- Authors: Michael Wolfenden, App vNext +- Project URL: https://github.com/App-vNext/Polly +- Source: [NuGet](https://www.nuget.org/packages/Polly/8.2.1) +- License: [MIT]( https://licenses.nuget.org/MIT) - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." + +``` +'MIT' reference + + + +MIT License +SPDX identifier +MIT +License text + +MIT License + + +Copyright (c) + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: +The above copyright notice and this permission notice + (including the next paragraph) + shall be included in all copies or substantial + portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +SPDX web page + +https://spdx.org/licenses/MIT.html + +Notice +This license content is provided by the SPDX project. For more information about licenses.nuget.org, see our documentation. + +Data pulled from spdx/license-list-data on February 9, 2023. +``` + +
+ + +
+Polly.Core 8.2.1 + +## Polly.Core + +- Version: 8.2.1 +- Authors: Michael Wolfenden, App vNext +- Project URL: https://github.com/App-vNext/Polly +- Source: [NuGet](https://www.nuget.org/packages/Polly.Core/8.2.1) +- License: [MIT]( https://licenses.nuget.org/MIT) + + +``` +'MIT' reference + + + +MIT License +SPDX identifier +MIT +License text + +MIT License + + +Copyright (c) + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: +The above copyright notice and this permission notice + (including the next paragraph) + shall be included in all copies or substantial + portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +SPDX web page + +https://spdx.org/licenses/MIT.html + +Notice +This license content is provided by the SPDX project. For more information about licenses.nuget.org, see our documentation. + +Data pulled from spdx/license-list-data on February 9, 2023. +``` + +
+ + +
+RabbitMQ.Client 6.8.1 + +## RabbitMQ.Client + +- Version: 6.8.1 +- Authors: VMware +- Project URL: https://www.rabbitmq.com/dotnet.html +- Source: [NuGet](https://www.nuget.org/packages/RabbitMQ.Client/6.8.1) +- License: [Apache-2.0](https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) + + +``` +Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and @@ -9956,7 +9213,7 @@ Apache License you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -9969,13 +9226,13 @@ Apache License
-SQLitePCLRaw.core 2.1.2 +SQLitePCLRaw.bundle_e_sqlite3 2.1.6 -## SQLitePCLRaw.core +## SQLitePCLRaw.bundle_e_sqlite3 -- Version: 2.1.2 +- Version: 2.1.6 - Authors: Eric Sink -- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.core/2.1.2) +- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.bundle_e_sqlite3/2.1.6) - License: [Apache-2.0](https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) @@ -10187,13 +9444,13 @@ Apache License
-SQLitePCLRaw.lib.e_sqlite3 2.1.2 +SQLitePCLRaw.core 2.1.6 -## SQLitePCLRaw.lib.e_sqlite3 +## SQLitePCLRaw.core -- Version: 2.1.2 +- Version: 2.1.6 - Authors: Eric Sink -- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.lib.e_sqlite3/2.1.2) +- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.core/2.1.6) - License: [Apache-2.0](https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) @@ -10405,13 +9662,13 @@ Apache License
-SQLitePCLRaw.provider.e_sqlite3 2.1.2 +SQLitePCLRaw.lib.e_sqlite3 2.1.6 -## SQLitePCLRaw.provider.e_sqlite3 +## SQLitePCLRaw.lib.e_sqlite3 -- Version: 2.1.2 +- Version: 2.1.6 - Authors: Eric Sink -- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.provider.e_sqlite3/2.1.2) +- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.lib.e_sqlite3/2.1.6) - License: [Apache-2.0](https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) @@ -10623,113 +9880,257 @@ Apache License
-SharpCompress 0.30.1 +SQLitePCLRaw.provider.e_sqlite3 2.1.6 -## SharpCompress +## SQLitePCLRaw.provider.e_sqlite3 -- Version: 0.30.1 -- Authors: Adam Hathcock -- Project URL: https://github.com/adamhathcock/sharpcompress -- Source: [NuGet](https://www.nuget.org/packages/SharpCompress/0.30.1) -- License: [MIT](https://github.com/adamhathcock/sharpcompress/raw/master/LICENSE.txt) +- Version: 2.1.6 +- Authors: Eric Sink +- Source: [NuGet](https://www.nuget.org/packages/SQLitePCLRaw.provider.e_sqlite3/2.1.6) +- License: [Apache-2.0](https://github.com/ericsink/SQLitePCL.raw/raw/master/LICENSE.TXT) ``` -The MIT License (MIT) - -Copyright (c) 2014 Adam Hathcock - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -
+ 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -
-SharpCompress 0.30.1 + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -## SharpCompress + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -- Version: 0.30.1 -- Authors: Adam Hathcock -- Project URL: https://github.com/adamhathcock/sharpcompress -- Source: [NuGet](https://www.nuget.org/packages/SharpCompress/0.30.1) -- License: [MIT](https://github.com/adamhathcock/sharpcompress/raw/master/LICENSE.txt) + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -``` -The MIT License (MIT) + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Copyright (c) 2014 Adam Hathcock + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ```
-SharpZipLib 1.3.3 +SharpCompress 0.30.1 -## SharpZipLib +## SharpCompress -- Version: 1.3.3 -- Authors: ICSharpCode -- Project URL: https://github.com/icsharpcode/SharpZipLib -- Source: [NuGet](https://www.nuget.org/packages/SharpZipLib/1.3.3) -- License: [MIT](https://github.com/icsharpcode/SharpZipLib/raw/master/LICENSE.txt) +- Version: 0.30.1 +- Authors: Adam Hathcock +- Project URL: https://github.com/adamhathcock/sharpcompress +- Source: [NuGet](https://www.nuget.org/packages/SharpCompress/0.30.1) +- License: [MIT](https://github.com/adamhathcock/sharpcompress/raw/master/LICENSE.txt) ``` -Copyright © 2000-2018 SharpZipLib Contributors +The MIT License (MIT) + +Copyright (c) 2014 Adam Hathcock -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons -to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ```
@@ -10747,7 +10148,7 @@ DEALINGS IN THE SOFTWARE. ``` -Copyright 2011-2020, Snappier Authors +Copyright 2011-2020, Google, Inc. and Snappier Authors All rights reserved. Redistribution and use in source and binary forms, with or without @@ -10760,9 +10161,9 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + * Neither the name of Google, Inc., any Snappier authors, nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -10794,7 +10195,7 @@ Some of the benchmark data in testdata/ is licensed differently: “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA Replication Timing in _Drosophila_” by Federico Comoglio and Renato Paro, which is licensed under the CC-BY license. See - http://www.ploscompbiol.org/static/license for more ifnormation. + http://www.ploscompbiol.org/static/license for more information. - alice29.txt, asyoulik.txt, plrabn12.txt and lcet10.txt are from Project Gutenberg. The first three have expired copyrights and are in the public @@ -11207,6 +10608,11 @@ SOFTWARE. ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -11222,7 +10628,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -11236,36 +10642,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -11274,11 +10680,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -11297,22 +10703,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -11321,10 +10727,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -11332,7 +10738,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -11353,10 +10759,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -11367,11 +10773,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -11407,6 +10813,11 @@ consequential or other damages. ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -11422,7 +10833,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -11436,36 +10847,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -11474,11 +10885,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -11497,22 +10908,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -11521,10 +10932,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -11532,7 +10943,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -11553,10 +10964,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -11567,11 +10978,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -11603,52 +11014,15 @@ consequential or other damages. - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ - Source: [NuGet](https://www.nuget.org/packages/System.Buffers/4.5.1) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` +.NET Library License Terms | .NET -
- - -
-System.Collections 4.3.0 - -## System.Collections -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Collections/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` MICROSOFT SOFTWARE LICENSE TERMS @@ -11664,7 +11038,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -11678,36 +11052,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -11716,11 +11090,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -11739,22 +11113,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -11763,10 +11137,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -11774,7 +11148,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -11795,10 +11169,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -11809,11 +11183,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -11836,223 +11210,24 @@ consequential or other damages.
-System.Collections.Concurrent 4.3.0 +System.CodeDom 4.4.0 -## System.Collections.Concurrent +## System.CodeDom -- Version: 4.3.0 +- Version: 4.4.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Collections.Concurrent/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.CodeDom/4.4.0) +- License: [MIT]( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +The MIT License (MIT) -MICROSOFT .NET -LIBRARY +Copyright (c) .NET Foundation and Contributors -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Collections.Immutable 6.0.0 - -## System.Collections.Immutable - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Collections.Immutable/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. +All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -12077,19 +11252,24 @@ SOFTWARE.
-System.Collections.NonGeneric 4.3.0 +System.Collections 4.3.0 -## System.Collections.NonGeneric +## System.Collections - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Collections.NonGeneric/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Collections/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -12105,7 +11285,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -12119,36 +11299,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -12157,11 +11337,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -12180,22 +11360,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -12204,10 +11384,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -12215,7 +11395,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -12236,10 +11416,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -12250,11 +11430,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -12277,19 +11457,24 @@ consequential or other damages.
-System.Collections.Specialized 4.3.0 +System.Collections.Concurrent 4.3.0 -## System.Collections.Specialized +## System.Collections.Concurrent - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Collections.Specialized/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Collections.Concurrent/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -12305,7 +11490,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -12319,36 +11504,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -12357,11 +11542,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -12380,22 +11565,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -12404,10 +11589,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -12415,7 +11600,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -12436,10 +11621,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -12450,11 +11635,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -12476,6 +11661,47 @@ consequential or other damages.
+
+System.Collections.Immutable 6.0.0 + +## System.Collections.Immutable + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Collections.Immutable/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ +
System.CommandLine 2.0.0-beta4.22272.1 @@ -12641,216 +11867,56 @@ SOFTWARE.
-System.ComponentModel 4.3.0 +System.Composition 6.0.0 -## System.ComponentModel +## System.Composition -- Version: 4.3.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.ComponentModel/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Composition/6.0.0) +- License: [MICROSOFT .NET LIBRARY License](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +The MIT License (MIT) -MICROSOFT .NET -LIBRARY +Copyright (c) .NET Foundation and Contributors -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +All rights reserved. -If -you comply with these license terms, you have the rights below. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-System.ComponentModel.Annotations 4.5.0 +System.Composition.AttributedModel 6.0.0 -## System.ComponentModel.Annotations +## System.Composition.AttributedModel -- Version: 4.5.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.ComponentModel.Annotations/4.5.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- Source: [NuGet](https://www.nuget.org/packages/System.Composition.AttributedModel/6.0.0) +- License: [MICROSOFT .NET LIBRARY License](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -12883,16 +11949,15 @@ SOFTWARE.
-System.ComponentModel.Annotations 5.0.0 +System.Composition.Convention 6.0.0 -## System.ComponentModel.Annotations +## System.Composition.Convention -- Version: 5.0.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/runtime -- Source: [NuGet](https://www.nuget.org/packages/System.ComponentModel.Annotations/5.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Composition.Convention/6.0.0) +- License: [MICROSOFT .NET LIBRARY License](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` @@ -12925,219 +11990,231 @@ SOFTWARE.
-System.ComponentModel.Primitives 4.3.0 +System.Composition.Hosting 6.0.0 -## System.ComponentModel.Primitives +## System.Composition.Hosting -- Version: 4.3.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.ComponentModel.Primitives/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Composition.Hosting/6.0.0) +- License: [MICROSOFT .NET LIBRARY License](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +The MIT License (MIT) -MICROSOFT .NET -LIBRARY +Copyright (c) .NET Foundation and Contributors -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +All rights reserved. -If -you comply with these license terms, you have the rights below. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Composition.Runtime 6.0.0 + +## System.Composition.Runtime + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Composition.Runtime/6.0.0) +- License: [MICROSOFT .NET LIBRARY License](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Composition.TypedParts 6.0.0 + +## System.Composition.TypedParts + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Composition.TypedParts/6.0.0) +- License: [MICROSOFT .NET LIBRARY License](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Configuration.ConfigurationManager 4.4.0 + +## System.Configuration.ConfigurationManager + +- Version: 4.4.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.4.0) +- License: [MIT]( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Configuration.ConfigurationManager 4.5.0 + +## System.Configuration.ConfigurationManager + +- Version: 4.5.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.5.0) +- License: [MIT]( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-System.ComponentModel.TypeConverter 4.3.0 +System.Console 4.3.0 -## System.ComponentModel.TypeConverter +## System.Console - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.ComponentModel.TypeConverter/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Console/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -13153,7 +12230,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -13167,36 +12244,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -13205,11 +12282,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -13228,22 +12305,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -13252,10 +12329,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -13263,7 +12340,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -13284,10 +12361,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -13298,11 +12375,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -13325,119 +12402,40 @@ consequential or other damages.
-System.Configuration.ConfigurationManager 4.4.0 +System.Diagnostics.Debug 4.3.0 -## System.Configuration.ConfigurationManager +## System.Diagnostics.Debug -- Version: 4.4.0 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.4.0) -- License: [MIT]( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.Debug/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` -The MIT License (MIT) +.NET Library License Terms | .NET -Copyright (c) .NET Foundation and Contributors -All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +MICROSOFT SOFTWARE LICENSE +TERMS -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` +MICROSOFT .NET +LIBRARY -
+These +license terms are an agreement between you and Microsoft Corporation (or based +on where you live, one of its affiliates). They apply to the software named +above. The terms also apply to any Microsoft services or updates for the +software, except to the extent those have different terms. +If +you comply with these license terms, you have the rights below. -
-System.Configuration.ConfigurationManager 4.5.0 - -## System.Configuration.ConfigurationManager - -- Version: 4.5.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Configuration.ConfigurationManager/4.5.0) -- License: [MIT]( https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Console 4.3.0 - -## System.Console - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Console/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -13451,36 +12449,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -13489,11 +12487,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -13512,22 +12510,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -13536,10 +12534,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -13547,7 +12545,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -13568,10 +12566,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -13582,11 +12580,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -13609,19 +12607,189 @@ consequential or other damages.
-System.Diagnostics.Debug 4.3.0 +System.Diagnostics.DiagnosticSource 4.3.0 -## System.Diagnostics.Debug +## System.Diagnostics.DiagnosticSource - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.Debug/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/4.3.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Diagnostics.DiagnosticSource 6.0.0 + +## System.Diagnostics.DiagnosticSource + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Diagnostics.DiagnosticSource 8.0.0 + +## System.Diagnostics.DiagnosticSource + +- Version: 8.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Diagnostics.EventLog 6.0.0 + +## System.Diagnostics.EventLog + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.EventLog/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Diagnostics.Tools 4.3.0 + +## System.Diagnostics.Tools + +- Version: 4.3.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.Tools/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -13637,7 +12805,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -13651,36 +12819,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -13689,11 +12857,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -13712,22 +12880,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -13736,10 +12904,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -13747,7 +12915,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -13768,10 +12936,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -13782,11 +12950,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -13809,19 +12977,24 @@ consequential or other damages.
-System.Diagnostics.DiagnosticSource 4.3.0 +System.Diagnostics.Tracing 4.3.0 -## System.Diagnostics.DiagnosticSource +## System.Diagnostics.Tracing - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.Tracing/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -13837,7 +13010,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -13851,36 +13024,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -13889,11 +13062,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -13912,22 +13085,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -13936,10 +13109,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -13947,7 +13120,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -13968,10 +13141,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -13982,11 +13155,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -14009,101 +13182,24 @@ consequential or other damages.
-System.Diagnostics.DiagnosticSource 6.0.0 +System.Globalization 4.3.0 -## System.Diagnostics.DiagnosticSource - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.DiagnosticSource/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Diagnostics.EventLog 6.0.0 - -## System.Diagnostics.EventLog +## System.Globalization -- Version: 6.0.0 +- Version: 4.3.0 - Authors: Microsoft +- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.EventLog/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- Source: [NuGet](https://www.nuget.org/packages/System.Globalization/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` +.NET Library License Terms | .NET -
- - -
-System.Diagnostics.Tools 4.3.0 - -## System.Diagnostics.Tools -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.Tools/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` MICROSOFT SOFTWARE LICENSE TERMS @@ -14119,7 +13215,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -14133,36 +13229,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -14171,11 +13267,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -14194,22 +13290,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -14218,10 +13314,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -14229,7 +13325,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -14250,10 +13346,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -14264,11 +13360,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -14291,19 +13387,24 @@ consequential or other damages.
-System.Diagnostics.Tracing 4.3.0 +System.Globalization.Calendars 4.3.0 -## System.Diagnostics.Tracing +## System.Globalization.Calendars - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Diagnostics.Tracing/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Globalization.Calendars/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -14319,7 +13420,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -14333,36 +13434,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -14371,11 +13472,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -14394,22 +13495,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -14418,10 +13519,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -14429,7 +13530,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -14450,10 +13551,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -14464,11 +13565,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -14491,61 +13592,24 @@ consequential or other damages.
-System.Drawing.Common 4.5.0 +System.Globalization.Extensions 4.3.0 -## System.Drawing.Common +## System.Globalization.Extensions -- Version: 4.5.0 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Drawing.Common/4.5.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- Source: [NuGet](https://www.nuget.org/packages/System.Globalization.Extensions/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` +.NET Library License Terms | .NET -
- - -
-System.Dynamic.Runtime 4.0.11 -## System.Dynamic.Runtime - -- Version: 4.0.11 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Dynamic.Runtime/4.0.11) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` MICROSOFT SOFTWARE LICENSE TERMS @@ -14561,7 +13625,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -14575,36 +13639,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -14613,11 +13677,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -14636,22 +13700,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -14660,10 +13724,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -14671,7 +13735,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -14692,10 +13756,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -14706,11 +13770,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -14733,19 +13797,24 @@ consequential or other damages.
-System.Dynamic.Runtime 4.3.0 +System.IO 4.3.0 -## System.Dynamic.Runtime +## System.IO - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Dynamic.Runtime/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.IO/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -14761,7 +13830,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -14775,36 +13844,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -14813,11 +13882,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -14836,22 +13905,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -14860,10 +13929,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -14871,7 +13940,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -14892,10 +13961,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -14906,11 +13975,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -14933,19 +14002,106 @@ consequential or other damages.
-System.Globalization 4.3.0 +System.IO.Abstractions 20.0.4 -## System.Globalization +## System.IO.Abstractions + +- Version: 20.0.4 +- Authors: Tatham Oddie & friends +- Project URL: https://github.com/TestableIO/System.IO.Abstractions +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions/20.0.4) +- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) Tatham Oddie and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.IO.Abstractions.TestingHelpers 20.0.4 + +## System.IO.Abstractions.TestingHelpers + +- Version: 20.0.4 +- Authors: Tatham Oddie & friends +- Project URL: https://github.com/TestableIO/System.IO.Abstractions +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions.TestingHelpers/20.0.4) +- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) Tatham Oddie and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.IO.Compression 4.3.0 + +## System.IO.Compression - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Globalization/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Compression/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -14961,7 +14117,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -14975,36 +14131,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -15013,11 +14169,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -15036,22 +14192,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -15060,10 +14216,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -15071,7 +14227,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -15092,10 +14248,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -15106,11 +14262,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -15133,19 +14289,24 @@ consequential or other damages.
-System.Globalization.Calendars 4.3.0 +System.IO.Compression.ZipFile 4.3.0 -## System.Globalization.Calendars +## System.IO.Compression.ZipFile - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Globalization.Calendars/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Compression.ZipFile/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -15161,7 +14322,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -15175,36 +14336,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -15213,11 +14374,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -15236,22 +14397,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -15260,10 +14421,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -15271,7 +14432,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -15292,10 +14453,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -15306,11 +14467,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -15333,19 +14494,24 @@ consequential or other damages.
-System.Globalization.Extensions 4.3.0 +System.IO.FileSystem 4.3.0 -## System.Globalization.Extensions +## System.IO.FileSystem - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Globalization.Extensions/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.FileSystem/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -15361,7 +14527,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -15375,36 +14541,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -15413,11 +14579,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -15436,22 +14602,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -15460,10 +14626,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -15471,7 +14637,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -15492,10 +14658,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -15506,11 +14672,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -15533,19 +14699,24 @@ consequential or other damages.
-System.IO 4.3.0 +System.IO.FileSystem.Primitives 4.3.0 -## System.IO +## System.IO.FileSystem.Primitives - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.IO/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.FileSystem.Primitives/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -15561,7 +14732,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -15575,36 +14746,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -15613,11 +14784,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -15636,22 +14807,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -15660,10 +14831,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -15671,7 +14842,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -15692,10 +14863,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -15706,11 +14877,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -15733,21 +14904,21 @@ consequential or other damages.
-System.IO.Abstractions 17.2.3 +System.IO.Hashing 7.0.0 -## System.IO.Abstractions +## System.IO.Hashing -- Version: 17.2.3 -- Authors: Tatham Oddie & friends -- Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions/17.2.3) -- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) +- Version: 7.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Hashing/7.0.0) +- License: [MIT](https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) ``` The MIT License (MIT) -Copyright (c) Tatham Oddie and Contributors +Copyright (c) .NET Foundation and Contributors All rights reserved. @@ -15774,21 +14945,21 @@ SOFTWARE.
-System.IO.Abstractions.TestingHelpers 17.2.3 +System.IO.Pipelines 6.0.3 -## System.IO.Abstractions.TestingHelpers +## System.IO.Pipelines -- Version: 17.2.3 -- Authors: Tatham Oddie & friends -- Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions.TestingHelpers/17.2.3) -- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) +- Version: 6.0.3 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Pipelines/6.0.3) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` The MIT License (MIT) -Copyright (c) Tatham Oddie and Contributors +Copyright (c) .NET Foundation and Contributors All rights reserved. @@ -15815,19 +14986,104 @@ SOFTWARE.
-System.IO.Compression 4.3.0 +System.IO.Pipelines 8.0.0 -## System.IO.Compression +## System.IO.Pipelines + +- Version: 8.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Pipelines/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.IdentityModel.Tokens.Jwt 7.0.3 + +## System.IdentityModel.Tokens.Jwt + +- Version: 7.0.3 +- Authors: Microsoft +- Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet +- Source: [NuGet](https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/7.0.3) +- License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) + + +``` +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Linq 4.3.0 + +## System.Linq - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Compression/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Linq/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -15843,7 +15099,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -15857,36 +15113,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -15895,11 +15151,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -15918,22 +15174,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -15942,10 +15198,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -15953,7 +15209,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -15974,10 +15230,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -15988,11 +15244,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -16015,19 +15271,65 @@ consequential or other damages.
-System.IO.Compression.ZipFile 4.3.0 +System.Linq.Async 6.0.1 -## System.IO.Compression.ZipFile +## System.Linq.Async + +- Version: 6.0.1 +- Authors: .NET Foundation and Contributors +- Project URL: https://github.com/dotnet/reactive +- Source: [NuGet](https://www.nuget.org/packages/System.Linq.Async/6.0.1) +- License: [MIT](https://github.com/dotnet/reactive/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Linq.Expressions 4.3.0 + +## System.Linq.Expressions - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Compression.ZipFile/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Linq.Expressions/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -16043,7 +15345,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -16057,36 +15359,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -16095,11 +15397,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -16118,22 +15420,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -16142,10 +15444,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -16153,7 +15455,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -16174,10 +15476,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -16188,11 +15490,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -16215,19 +15517,66 @@ consequential or other damages.
-System.IO.FileSystem 4.3.0 +System.Memory 4.5.5 -## System.IO.FileSystem +## System.Memory + +- Version: 4.5.5 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Memory/4.5.5) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Net.Http 4.3.0 + +## System.Net.Http - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.IO.FileSystem/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Net.Http/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -16243,7 +15592,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -16257,36 +15606,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -16295,11 +15644,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -16318,22 +15667,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -16342,10 +15691,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -16353,7 +15702,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -16374,10 +15723,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -16388,11 +15737,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -16415,19 +15764,24 @@ consequential or other damages.
-System.IO.FileSystem.Primitives 4.3.0 +System.Net.Http 4.3.4 -## System.IO.FileSystem.Primitives +## System.Net.Http -- Version: 4.3.0 +- Version: 4.3.4 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.IO.FileSystem.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Net.Http/4.3.4) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -16443,7 +15797,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -16457,36 +15811,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -16495,11 +15849,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -16518,22 +15872,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -16542,10 +15896,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -16553,7 +15907,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -16574,10 +15928,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -16588,11 +15942,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -16615,63 +15969,29 @@ consequential or other damages.
-System.IdentityModel.Tokens.Jwt 6.10.0 +System.Net.Primitives 4.3.0 -## System.IdentityModel.Tokens.Jwt +## System.Net.Primitives -- Version: 6.10.0 +- Version: 4.3.0 - Authors: Microsoft -- Project URL: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet -- Source: [NuGet](https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/6.10.0) -- License: [MIT](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/raw/dev/LICENSE.txt) +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Net.Primitives/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` -The MIT License (MIT) - -Copyright (c) Microsoft Corporation +.NET Library License Terms | .NET -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` -
+MICROSOFT SOFTWARE LICENSE +TERMS - -
-System.Linq 4.3.0 - -## System.Linq - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Linq/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY +MICROSOFT .NET +LIBRARY These license terms are an agreement between you and Microsoft Corporation (or based @@ -16682,7 +16002,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -16696,36 +16016,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -16734,11 +16054,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -16757,22 +16077,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -16781,10 +16101,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -16792,7 +16112,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -16813,10 +16133,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -16827,11 +16147,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -16854,60 +16174,24 @@ consequential or other damages.
-System.Linq.Async 6.0.1 - -## System.Linq.Async - -- Version: 6.0.1 -- Authors: .NET Foundation and Contributors -- Project URL: https://github.com/dotnet/reactive -- Source: [NuGet](https://www.nuget.org/packages/System.Linq.Async/6.0.1) -- License: [MIT](https://github.com/dotnet/reactive/raw/main/LICENSE) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Linq.Expressions 4.3.0 +System.Net.Sockets 4.3.0 -## System.Linq.Expressions +## System.Net.Sockets - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Linq.Expressions/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Net.Sockets/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -16923,7 +16207,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -16937,36 +16221,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -16975,11 +16259,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -16998,22 +16282,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -17022,10 +16306,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -17033,7 +16317,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -17054,10 +16338,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -17068,11 +16352,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -17095,103 +16379,24 @@ consequential or other damages.
-System.Memory 4.5.1 - -## System.Memory - -- Version: 4.5.1 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Memory/4.5.1) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Memory 4.5.5 +System.ObjectModel 4.3.0 -## System.Memory +## System.ObjectModel -- Version: 4.5.5 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Memory/4.5.5) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- Source: [NuGet](https://www.nuget.org/packages/System.ObjectModel/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` +.NET Library License Terms | .NET -
- - -
-System.Net.Http 4.3.0 - -## System.Net.Http -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Net.Http/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` MICROSOFT SOFTWARE LICENSE TERMS @@ -17207,7 +16412,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -17221,36 +16426,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -17259,11 +16464,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -17282,22 +16487,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -17306,10 +16511,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -17317,7 +16522,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -17338,10 +16543,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -17352,11 +16557,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -17379,19 +16584,65 @@ consequential or other damages.
-System.Net.Http 4.3.4 +System.Reactive 6.0.0 -## System.Net.Http +## System.Reactive -- Version: 4.3.4 +- Version: 6.0.0 +- Authors: .NET Foundation and Contributors +- Project URL: https://github.com/dotnet/reactive +- Source: [NuGet](https://www.nuget.org/packages/System.Reactive/6.0.0) +- License: [MIT](https://github.com/dotnet/reactive/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Reflection 4.3.0 + +## System.Reflection + +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Net.Http/4.3.4) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -17407,7 +16658,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -17421,36 +16672,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -17459,11 +16710,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -17482,22 +16733,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -17506,10 +16757,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -17517,7 +16768,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -17538,10 +16789,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -17552,11 +16803,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -17579,19 +16830,24 @@ consequential or other damages.
-System.Net.NameResolution 4.3.0 +System.Reflection.Emit 4.3.0 -## System.Net.NameResolution +## System.Reflection.Emit - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Net.NameResolution/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Emit/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -17607,7 +16863,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -17621,36 +16877,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -17659,11 +16915,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -17682,22 +16938,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -17706,10 +16962,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -17717,7 +16973,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -17738,10 +16994,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -17752,11 +17008,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -17779,19 +17035,24 @@ consequential or other damages.
-System.Net.Primitives 4.3.0 +System.Reflection.Emit.ILGeneration 4.3.0 -## System.Net.Primitives +## System.Reflection.Emit.ILGeneration - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Net.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Emit.ILGeneration/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -17807,7 +17068,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -17821,36 +17082,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -17859,11 +17120,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -17882,22 +17143,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -17906,10 +17167,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -17917,7 +17178,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -17938,10 +17199,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -17952,11 +17213,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -17979,19 +17240,24 @@ consequential or other damages.
-System.Net.Primitives 4.3.1 +System.Reflection.Emit.Lightweight 4.3.0 -## System.Net.Primitives +## System.Reflection.Emit.Lightweight -- Version: 4.3.1 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Net.Primitives/4.3.1) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Emit.Lightweight/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -18007,7 +17273,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -18021,36 +17287,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -18059,11 +17325,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -18082,22 +17348,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -18106,10 +17372,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -18117,7 +17383,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -18138,10 +17404,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -18152,11 +17418,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -18179,19 +17445,24 @@ consequential or other damages.
-System.Net.Sockets 4.3.0 +System.Reflection.Extensions 4.3.0 -## System.Net.Sockets +## System.Reflection.Extensions - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Net.Sockets/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Extensions/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -18207,7 +17478,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -18221,36 +17492,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -18259,11 +17530,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -18282,22 +17553,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -18306,10 +17577,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -18317,7 +17588,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -18338,10 +17609,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -18352,11 +17623,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -18379,19 +17650,107 @@ consequential or other damages.
-System.ObjectModel 4.3.0 +System.Reflection.Metadata 1.6.0 -## System.ObjectModel +## System.Reflection.Metadata -- Version: 4.3.0 +- Version: 1.6.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.ObjectModel/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Metadata/1.6.0) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) ``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Reflection.Metadata 6.0.1 + +## System.Reflection.Metadata + +- Version: 6.0.1 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Metadata/6.0.1) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Reflection.Primitives 4.3.0 + +## System.Reflection.Primitives + +- Version: 4.3.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Primitives/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) + + +``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -18407,7 +17766,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -18421,36 +17780,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -18459,11 +17818,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -18482,22 +17841,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -18506,10 +17865,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -18517,7 +17876,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -18538,10 +17897,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -18552,11 +17911,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -18579,19 +17938,24 @@ consequential or other damages.
-System.Private.Uri 4.3.0 +System.Reflection.TypeExtensions 4.3.0 -## System.Private.Uri +## System.Reflection.TypeExtensions - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Private.Uri/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.TypeExtensions/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -18607,7 +17971,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -18621,36 +17985,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -18659,11 +18023,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -18682,22 +18046,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -18706,10 +18070,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -18717,7 +18081,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -18738,10 +18102,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -18752,11 +18116,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -18779,101 +18143,24 @@ consequential or other damages.
-System.Reactive 5.0.0 - -## System.Reactive - -- Version: 5.0.0 -- Authors: .NET Foundation and Contributors -- Project URL: https://github.com/dotnet/reactive -- Source: [NuGet](https://www.nuget.org/packages/System.Reactive/5.0.0) -- License: [MIT](https://github.com/dotnet/reactive/raw/main/LICENSE) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Reactive.Linq 5.0.0 - -## System.Reactive.Linq - -- Version: 5.0.0 -- Authors: .NET Foundation and Contributors -- Project URL: https://github.com/dotnet/reactive -- Source: [NuGet](https://www.nuget.org/packages/System.Reactive.Linq/5.0.0) -- License: [MIT](https://github.com/dotnet/reactive/raw/main/LICENSE) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Reflection 4.3.0 +System.Resources.ResourceManager 4.3.0 -## System.Reflection +## System.Resources.ResourceManager - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Resources.ResourceManager/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -18889,7 +18176,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -18903,36 +18190,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -18941,11 +18228,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -18964,22 +18251,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -18988,10 +18275,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -18999,7 +18286,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -19020,10 +18307,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -19034,11 +18321,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -19061,19 +18348,24 @@ consequential or other damages.
-System.Reflection.Emit 4.3.0 +System.Runtime 4.3.0 -## System.Reflection.Emit +## System.Runtime - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Emit/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -19089,7 +18381,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -19103,36 +18395,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -19141,11 +18433,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -19164,22 +18456,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -19188,10 +18480,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -19199,7 +18491,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -19220,10 +18512,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -19234,11 +18526,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -19261,19 +18553,65 @@ consequential or other damages.
-System.Reflection.Emit.ILGeneration 4.3.0 +System.Runtime.CompilerServices.Unsafe 6.0.0 -## System.Reflection.Emit.ILGeneration +## System.Runtime.CompilerServices.Unsafe + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Runtime.Extensions 4.3.0 + +## System.Runtime.Extensions - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Emit.ILGeneration/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Extensions/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -19289,7 +18627,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -19303,36 +18641,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -19341,11 +18679,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -19364,22 +18702,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -19388,10 +18726,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -19399,7 +18737,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -19420,10 +18758,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -19434,11 +18772,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -19461,19 +18799,24 @@ consequential or other damages.
-System.Reflection.Emit.Lightweight 4.3.0 +System.Runtime.Handles 4.3.0 -## System.Reflection.Emit.Lightweight +## System.Runtime.Handles - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Emit.Lightweight/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Handles/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -19489,7 +18832,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -19503,36 +18846,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -19541,11 +18884,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -19564,22 +18907,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -19588,10 +18931,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -19599,7 +18942,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -19620,10 +18963,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -19634,11 +18977,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -19661,19 +19004,24 @@ consequential or other damages.
-System.Reflection.Extensions 4.3.0 +System.Runtime.InteropServices 4.3.0 -## System.Reflection.Extensions +## System.Runtime.InteropServices - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Extensions/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.InteropServices/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -19689,7 +19037,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -19703,36 +19051,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -19741,11 +19089,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -19764,22 +19112,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -19788,10 +19136,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -19799,7 +19147,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -19820,10 +19168,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -19834,11 +19182,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -19861,61 +19209,24 @@ consequential or other damages.
-System.Reflection.Metadata 1.6.0 +System.Runtime.InteropServices.RuntimeInformation 4.3.0 -## System.Reflection.Metadata +## System.Runtime.InteropServices.RuntimeInformation -- Version: 1.6.0 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Metadata/1.6.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.InteropServices.RuntimeInformation/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` - -
+.NET Library License Terms | .NET -
-System.Reflection.Primitives 4.3.0 - -## System.Reflection.Primitives - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.Primitives/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` MICROSOFT SOFTWARE LICENSE TERMS @@ -19931,7 +19242,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -19945,36 +19256,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -19983,11 +19294,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -20006,22 +19317,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -20030,10 +19341,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -20041,7 +19352,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -20062,10 +19373,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -20076,11 +19387,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -20103,19 +19414,24 @@ consequential or other damages.
-System.Reflection.TypeExtensions 4.3.0 +System.Runtime.Loader 4.3.0 -## System.Reflection.TypeExtensions +## System.Runtime.Loader - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Reflection.TypeExtensions/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Loader/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -20131,7 +19447,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -20145,36 +19461,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -20183,11 +19499,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -20206,22 +19522,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -20230,10 +19546,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -20241,7 +19557,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -20262,10 +19578,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -20276,11 +19592,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -20303,19 +19619,24 @@ consequential or other damages.
-System.Resources.ResourceManager 4.3.0 +System.Runtime.Numerics 4.3.0 -## System.Resources.ResourceManager +## System.Runtime.Numerics - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Resources.ResourceManager/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Numerics/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -20331,7 +19652,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -20345,36 +19666,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -20383,11 +19704,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -20406,22 +19727,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -20430,10 +19751,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -20441,7 +19762,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -20462,10 +19783,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -20476,11 +19797,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -20503,19 +19824,66 @@ consequential or other damages.
-System.Runtime 4.3.0 +System.Security.AccessControl 5.0.0 -## System.Runtime +## System.Security.AccessControl + +- Version: 5.0.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://github.com/dotnet/runtime +- Source: [NuGet](https://www.nuget.org/packages/System.Security.AccessControl/5.0.0) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Security.Cryptography.Algorithms 4.3.0 + +## System.Security.Cryptography.Algorithms - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Algorithms/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -20531,7 +19899,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -20545,36 +19913,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -20583,11 +19951,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -20606,22 +19974,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -20630,10 +19998,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -20641,7 +20009,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -20662,10 +20030,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -20676,11 +20044,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -20703,19 +20071,24 @@ consequential or other damages.
-System.Runtime 4.3.1 +System.Security.Cryptography.Cng 4.3.0 -## System.Runtime +## System.Security.Cryptography.Cng -- Version: 4.3.1 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime/4.3.1) +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Cng/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -20731,7 +20104,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -20745,36 +20118,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -20783,11 +20156,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -20806,22 +20179,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -20830,10 +20203,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -20841,7 +20214,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -20862,10 +20235,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -20876,11 +20249,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -20903,102 +20276,24 @@ consequential or other damages.
-System.Runtime.CompilerServices.Unsafe 4.5.1 +System.Security.Cryptography.Csp 4.3.0 -## System.Runtime.CompilerServices.Unsafe +## System.Security.Cryptography.Csp -- Version: 4.5.1 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/4.5.1) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Runtime.CompilerServices.Unsafe 6.0.0 - -## System.Runtime.CompilerServices.Unsafe - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Csp/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` - -
+.NET Library License Terms | .NET -
-System.Runtime.Extensions 4.3.0 - -## System.Runtime.Extensions - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Extensions/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` MICROSOFT SOFTWARE LICENSE TERMS @@ -21014,7 +20309,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -21028,36 +20323,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -21066,11 +20361,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -21089,22 +20384,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -21113,10 +20408,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -21124,7 +20419,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -21145,10 +20440,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -21159,11 +20454,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -21186,19 +20481,24 @@ consequential or other damages.
-System.Runtime.Handles 4.3.0 +System.Security.Cryptography.Encoding 4.3.0 -## System.Runtime.Handles +## System.Security.Cryptography.Encoding - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Handles/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Encoding/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -21214,7 +20514,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -21228,36 +20528,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -21266,11 +20566,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -21289,22 +20589,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -21313,10 +20613,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -21324,7 +20624,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -21345,10 +20645,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -21359,11 +20659,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -21386,19 +20686,24 @@ consequential or other damages.
-System.Runtime.InteropServices 4.3.0 +System.Security.Cryptography.OpenSsl 4.3.0 -## System.Runtime.InteropServices +## System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.InteropServices/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -21414,7 +20719,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -21428,36 +20733,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -21466,11 +20771,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -21489,22 +20794,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -21513,10 +20818,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -21524,7 +20829,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -21545,10 +20850,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -21559,11 +20864,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -21586,19 +20891,24 @@ consequential or other damages.
-System.Runtime.InteropServices.RuntimeInformation 4.3.0 +System.Security.Cryptography.Primitives 4.3.0 -## System.Runtime.InteropServices.RuntimeInformation +## System.Security.Cryptography.Primitives - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.InteropServices.RuntimeInformation/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Primitives/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -21614,7 +20924,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -21628,36 +20938,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -21666,11 +20976,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -21689,22 +20999,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -21713,10 +21023,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -21724,7 +21034,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -21745,10 +21055,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -21759,11 +21069,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -21786,19 +21096,108 @@ consequential or other damages.
-System.Runtime.Loader 4.3.0 +System.Security.Cryptography.ProtectedData 4.4.0 -## System.Runtime.Loader +## System.Security.Cryptography.ProtectedData -- Version: 4.3.0 +- Version: 4.4.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Loader/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.ProtectedData/4.4.0) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Security.Cryptography.ProtectedData 4.5.0 + +## System.Security.Cryptography.ProtectedData + +- Version: 4.5.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.ProtectedData/4.5.0) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Security.Cryptography.X509Certificates 4.3.0 + +## System.Security.Cryptography.X509Certificates + +- Version: 4.3.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.X509Certificates/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -21814,7 +21213,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -21828,36 +21227,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -21866,11 +21265,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -21889,22 +21288,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -21913,10 +21312,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -21924,7 +21323,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -21945,10 +21344,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -21959,11 +21358,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -21986,19 +21385,108 @@ consequential or other damages.
-System.Runtime.Numerics 4.3.0 +System.Security.Permissions 4.5.0 -## System.Runtime.Numerics +## System.Security.Permissions + +- Version: 4.5.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Permissions/4.5.0) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Security.Principal.Windows 5.0.0 + +## System.Security.Principal.Windows + +- Version: 5.0.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://github.com/dotnet/runtime +- Source: [NuGet](https://www.nuget.org/packages/System.Security.Principal.Windows/5.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Text.Encoding 4.3.0 + +## System.Text.Encoding - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Numerics/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encoding/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -22014,7 +21502,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -22028,36 +21516,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -22066,11 +21554,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -22089,22 +21577,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -22113,10 +21601,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -22124,7 +21612,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -22145,10 +21633,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -22159,11 +21647,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -22186,19 +21674,65 @@ consequential or other damages.
-System.Runtime.Serialization.Formatters 4.3.0 +System.Text.Encoding.CodePages 6.0.0 + +## System.Text.Encoding.CodePages + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encoding.CodePages/6.0.0) +- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Text.Encoding.Extensions 4.3.0 -## System.Runtime.Serialization.Formatters +## System.Text.Encoding.Extensions - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Serialization.Formatters/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encoding.Extensions/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -22214,7 +21748,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -22228,36 +21762,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -22266,11 +21800,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -22289,22 +21823,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -22313,10 +21847,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -22324,7 +21858,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -22345,10 +21879,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -22359,11 +21893,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -22386,39 +21920,208 @@ consequential or other damages.
-System.Runtime.Serialization.Primitives 4.1.1 +System.Text.Encodings.Web 6.0.0 -## System.Runtime.Serialization.Primitives +## System.Text.Encodings.Web -- Version: 4.1.1 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Serialization.Primitives/4.1.1) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encodings.Web/6.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +The MIT License (MIT) -If -you comply with these license terms, you have the rights below. +Copyright (c) .NET Foundation and Contributors -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +All rights reserved. -2.    +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Text.Encodings.Web 8.0.0 + +## System.Text.Encodings.Web + +- Version: 8.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encodings.Web/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Text.Json 6.0.9 + +## System.Text.Json + +- Version: 6.0.9 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Json/6.0.9) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Text.Json 8.0.0 + +## System.Text.Json + +- Version: 8.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Text.Json/8.0.0) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+System.Text.RegularExpressions 4.3.0 + +## System.Text.RegularExpressions + +- Version: 4.3.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Text.RegularExpressions/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) + + +``` +.NET Library License Terms | .NET + + + + +MICROSOFT SOFTWARE LICENSE +TERMS + +MICROSOFT .NET +LIBRARY + +These +license terms are an agreement between you and Microsoft Corporation (or based +on where you live, one of its affiliates). They apply to the software named +above. The terms also apply to any Microsoft services or updates for the +software, except to the extent those have different terms. + +If +you comply with these license terms, you have the rights below. + +1.    INSTALLATION AND USE RIGHTS. +You may +install and use any number of copies of the software to develop and test your applications.  + +2.    THIRD PARTY COMPONENTS. The software may include third party components with separate legal notices or governed by other agreements, as may be described in the ThirdPartyNotices file(s) accompanying the software. @@ -22428,36 +22131,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -22466,11 +22169,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -22489,22 +22192,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -22513,10 +22216,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -22524,7 +22227,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -22545,10 +22248,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -22559,11 +22262,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -22586,19 +22289,24 @@ consequential or other damages.
-System.Runtime.Serialization.Primitives 4.3.0 +System.Threading 4.3.0 -## System.Runtime.Serialization.Primitives +## System.Threading - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Runtime.Serialization.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -22614,7 +22322,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -22628,36 +22336,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -22666,11 +22374,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -22689,22 +22397,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -22713,10 +22421,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -22724,7 +22432,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -22745,10 +22453,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -22759,11 +22467,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -22786,11256 +22494,1674 @@ consequential or other damages.
-System.Security.AccessControl 5.0.0 +System.Threading.Channels 6.0.0 -## System.Security.AccessControl +## System.Threading.Channels -- Version: 5.0.0 +- Version: 6.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/runtime -- Source: [NuGet](https://www.nuget.org/packages/System.Security.AccessControl/5.0.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/6.0.0) +- License: [MIT]( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) ``` -The MIT License (MIT) +corefx/LICENSE.TXT at master · dotnet/corefx · GitHub + + + + + + + + + + + + + -Copyright (c) .NET Foundation and Contributors -All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` -
-
-System.Security.Claims 4.3.0 -## System.Security.Claims -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Claims/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.Algorithms 4.3.0 - -## System.Security.Cryptography.Algorithms - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Algorithms/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.Cng 4.3.0 - -## System.Security.Cryptography.Cng - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Cng/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.Cng 4.5.0 - -## System.Security.Cryptography.Cng - -- Version: 4.5.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Cng/4.5.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.Csp 4.3.0 - -## System.Security.Cryptography.Csp - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Csp/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.Encoding 4.3.0 - -## System.Security.Cryptography.Encoding - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Encoding/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.OpenSsl 4.3.0 - -## System.Security.Cryptography.OpenSsl - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.OpenSsl/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.Primitives 4.3.0 - -## System.Security.Cryptography.Primitives - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.Primitives/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Cryptography.ProtectedData 4.4.0 - -## System.Security.Cryptography.ProtectedData - -- Version: 4.4.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.ProtectedData/4.4.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Security.Cryptography.ProtectedData 4.5.0 - -## System.Security.Cryptography.ProtectedData - -- Version: 4.5.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.ProtectedData/4.5.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Security.Cryptography.X509Certificates 4.3.0 - -## System.Security.Cryptography.X509Certificates - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Cryptography.X509Certificates/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Permissions 4.5.0 - -## System.Security.Permissions - -- Version: 4.5.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Permissions/4.5.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Security.Principal 4.3.0 - -## System.Security.Principal - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Principal/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Principal.Windows 4.3.0 - -## System.Security.Principal.Windows - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Principal.Windows/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Security.Principal.Windows 5.0.0 - -## System.Security.Principal.Windows - -- Version: 5.0.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/runtime -- Source: [NuGet](https://www.nuget.org/packages/System.Security.Principal.Windows/5.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.Encoding 4.3.0 - -## System.Text.Encoding - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encoding/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Text.Encoding.CodePages 4.6.0 - -## System.Text.Encoding.CodePages - -- Version: 4.6.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encoding.CodePages/4.6.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.Encoding.Extensions 4.3.0 - -## System.Text.Encoding.Extensions - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encoding.Extensions/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Text.Encodings.Web 4.7.2 - -## System.Text.Encodings.Web - -- Version: 4.7.2 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encodings.Web/4.7.2) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.Encodings.Web 6.0.0 - -## System.Text.Encodings.Web - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Encodings.Web/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.Json 4.7.2 - -## System.Text.Json - -- Version: 4.7.2 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Json/4.7.2) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.Json 6.0.0 - -## System.Text.Json - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Json/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.Json 6.0.7 - -## System.Text.Json - -- Version: 6.0.7 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Text.Json/6.0.7) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Text.RegularExpressions 4.3.0 - -## System.Text.RegularExpressions - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Text.RegularExpressions/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Threading 4.3.0 - -## System.Threading - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Threading.Channels 4.7.1 - -## System.Threading.Channels - -- Version: 4.7.1 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/4.7.1) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Threading.Channels 7.0.0 - -## System.Threading.Channels - -- Version: 7.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/7.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Threading.Overlapped 4.3.0 - -## System.Threading.Overlapped - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Overlapped/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Threading.Tasks 4.3.0 - -## System.Threading.Tasks - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Threading.Tasks.Dataflow 6.0.0 - -## System.Threading.Tasks.Dataflow - -- Version: 6.0.0 -- Authors: Microsoft -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks.Dataflow/6.0.0) -- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Threading.Tasks.Extensions 4.3.0 - -## System.Threading.Tasks.Extensions - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Threading.Tasks.Extensions 4.5.4 - -## System.Threading.Tasks.Extensions - -- Version: 4.5.4 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.5.4) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Threading.ThreadPool 4.3.0 - -## System.Threading.ThreadPool - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.ThreadPool/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Threading.Timer 4.3.0 - -## System.Threading.Timer - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Timer/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.ValueTuple 4.4.0 - -## System.ValueTuple - -- Version: 4.4.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.ValueTuple/4.4.0) -- License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) - - -``` -The MIT License (MIT) - -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-System.Xml.ReaderWriter 4.3.0 - -## System.Xml.ReaderWriter - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Xml.ReaderWriter/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Xml.XDocument 4.3.0 - -## System.Xml.XDocument - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Xml.XDocument/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-System.Xml.XmlDocument 4.3.0 - -## System.Xml.XmlDocument - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Xml.XmlDocument/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-Validation 2.4.18 - -## Validation - -- Version: 2.4.18 -- Authors: Andrew Arnott -- Owners: Andrew Arnott -- Project URL: http://github.com/aarnott/Validation -- Source: [NuGet](https://www.nuget.org/packages/Validation/2.4.18) -- License: [Microsoft Public License]( https://raw.githubusercontent.com/AArnott/Validation/69e6a2c4f3/LICENSE.txt) - - -``` -Microsoft Public License (MS-PL) -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. -``` - -
- - -
-Xunit.SkippableFact 1.3.12 - -## Xunit.SkippableFact - -- Version: 1.3.12 -- Authors: Andrew Arnott -- Owners: Andrew Arnott -- Project URL: https://github.com/AArnott/Xunit.SkippableFact -- Source: [NuGet](https://www.nuget.org/packages/Xunit.SkippableFact/1.3.12) -- License: [Microsoft Public License]( https://raw.githubusercontent.com/AArnott/Xunit.SkippableFact/c7f20eaa78/LICENSE.txt) - - -``` -This software is licensed under the Microsoft Public License -http://opensource.org/licenses/ms-pl - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions - The terms "reproduce," "reproduction," "derivative works," and "distribution" have the - same meaning here as under U.S. copyright law. - A "contribution" is the original software, or any additions or changes to the software. - A "contributor" is any person that distributes its contribution under this license. - "Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights - (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. - (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. - -3. Conditions and Limitations - (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. - (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. - (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. - (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. - (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. -``` - -
- - -
-ZstdSharp.Port 0.6.2 - -## ZstdSharp.Port - -- Version: 0.6.2 -- Authors: Oleg Stepanischev -- Project URL: https://github.com/oleg-st/ZstdSharp -- Source: [NuGet](https://www.nuget.org/packages/ZstdSharp.Port/0.6.2) -- License: [MIT](https://github.com/oleg-st/ZstdSharp/raw/master/LICENSE) - - -``` -MIT License - -Copyright (c) 2021 Oleg Stepanischev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-coverlet.collector 3.2.0 - -## coverlet.collector - -- Version: 3.2.0 -- Authors: tonerdo -- Project URL: https://github.com/coverlet-coverage/coverlet -- Source: [NuGet](https://www.nuget.org/packages/coverlet.collector/3.2.0) -- License: [MIT](https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) - - -``` -The MIT License (MIT) - -Copyright (c) 2018 Toni Solarin-Sodara - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-fo-dicom 5.0.3 - -## fo-dicom - -- Version: 5.0.3 -- Authors: fo-dicom contributors -- Project URL: https://github.com/fo-dicom/fo-dicom -- Source: [NuGet](https://www.nuget.org/packages/fo-dicom/5.0.3) -- License: [Microsoft Public License](https://github.com/fo-dicom/fo-dicom/raw/development/License.txt) - - -``` -Fellow Oak DICOM - -Copyright (c) 2012-2021 fo-dicom contributors - -This software is licensed under the Microsoft Public License (MS-PL) - -Microsoft Public License (MS-PL) - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions - and limitations in section 3, each contributor grants you a non-exclusive, worldwide, - royalty-free copyright license to reproduce its contribution, prepare derivative works - of its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions and - limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free - license under its licensed patents to make, have made, use, sell, offer for sale, import, - and/or otherwise dispose of its contribution in the software or derivative works of the - contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' name, - logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are infringed - by the software, your patent license from such contributor to the software ends automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, - and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only under this - license by including a complete copy of this license with your distribution. If you distribute - any portion of the software in compiled or object code form, you may only do so under a license - that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express - warranties, guarantees or conditions. You may have additional consumer rights under your local - laws which this license cannot change. To the extent permitted under your local laws, the - contributors exclude the implied warranties of merchantability, fitness for a particular purpose - and non-infringement. - - - ----- libijg (from DCMTK 3.5.4 COPYRIGHT) ---- - -Unless otherwise specified, the DCMTK software package has the -following copyright: - -/* - * Copyright (C) 1994-2004, OFFIS - * - * This software and supporting documentation were developed by - * - * Kuratorium OFFIS e.V. - * Healthcare Information and Communication Systems - * Escherweg 2 - * D-26121 Oldenburg, Germany - * - * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND OFFIS MAKES NO WARRANTY - * REGARDING THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR - * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR - * ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND - * PERFORMANCE OF THE SOFTWARE IS WITH THE USER. - * - * Copyright of the software and supporting documentation is, unless - * otherwise stated, owned by OFFIS, and free access is hereby granted as - * a license to use this software, copy this software and prepare - * derivative works based upon this software. However, any distribution - * of this software source code or supporting documentation or derivative - * works (source code and supporting documentation) must include the - * three paragraphs of this copyright notice. - * - */ - -The dcmjpeg sub-package includes an adapted version of the Independent JPEG -Group Toolkit Version 6b, which is contained in dcmjpeg/libijg8, -dcmjpeg/libijg12 and dcmjpeg/libijg16. This toolkit is covered by the -following copyright. The original README file for the Independent JPEG -Group Toolkit is located in dcmjpeg/docs/ijg_readme.txt. - -/* - * The authors make NO WARRANTY or representation, either express or implied, - * with respect to this software, its quality, accuracy, merchantability, or - * fitness for a particular purpose. This software is provided "AS IS", and you, - * its user, assume the entire risk as to its quality and accuracy. - * - * This software is copyright (C) 1991-1998, Thomas G. Lane. - * All Rights Reserved except as specified below. - * - * Permission is hereby granted to use, copy, modify, and distribute this - * software (or portions thereof) for any purpose, without fee, subject to these - * conditions: - * (1) If any part of the source code for this software is distributed, then this - * README file must be included, with this copyright and no-warranty notice - * unaltered; and any additions, deletions, or changes to the original files - * must be clearly indicated in accompanying documentation. - * (2) If only executable code is distributed, then the accompanying - * documentation must state that "this software is based in part on the work of - * the Independent JPEG Group". - * (3) Permission for use of this software is granted only if the user accepts - * full responsibility for any undesirable consequences; the authors accept - * NO LIABILITY for damages of any kind. - * - * These conditions apply to any software derived from or based on the IJG code, - * not just to the unmodified library. If you use our work, you ought to - * acknowledge us. - * - * Permission is NOT granted for the use of any IJG author's name or company name - * in advertising or publicity relating to this software or products derived from - * it. This software may be referred to only as "the Independent JPEG Group's - * software". - * - * We specifically permit and encourage the use of this software as the basis of - * commercial products, provided that all warranty or liability claims are - * assumed by the product vendor. - */ - - - ----- OpenJPEG JPEG 2000 codec (from license.txt) ---- - -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - - ----- CharLS JPEG-LS codec (from License.txt) ---- - -Copyright (c) 2007-2009, Jan de Vaan -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of my employer, nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - ----- Unity.IO.Compression (from LICENSE.TXT and PATENTS.TXT) ---- - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -Microsoft Patent Promise for .NET Libraries and Runtime Components - -Microsoft Corporation and its affiliates ("Microsoft") promise not to assert -any .NET Patents against you for making, using, selling, offering for sale, -importing, or distributing Covered Code, as part of either a .NET Runtime or -as part of any application designed to run on a .NET Runtime. - -If you file, maintain, or voluntarily participate in any claim in a lawsuit -alleging direct or contributory patent infringement by any Covered Code, or -inducement of patent infringement by any Covered Code, then your rights under -this promise will automatically terminate. - -This promise is not an assurance that (i) any .NET Patents are valid or -enforceable, or (ii) Covered Code does not infringe patents or other -intellectual property rights of any third party. No rights except those -expressly stated in this promise are granted, waived, or received by -Microsoft, whether by implication, exhaustion, estoppel, or otherwise. -This is a personal promise directly from Microsoft to you, and you agree as a -condition of benefiting from it that no Microsoft rights are received from -suppliers, distributors, or otherwise from any other person in connection with -this promise. - -Definitions: - -"Covered Code" means those Microsoft .NET libraries and runtime components as -made available by Microsoft at https://github.com/Microsoft/referencesource. - -".NET Patents" are those patent claims, both currently owned by Microsoft and -acquired in the future, that are necessarily infringed by Covered Code. .NET -Patents do not include any patent claims that are infringed by any Enabling -Technology, that are infringed only as a consequence of modification of -Covered Code, or that are infringed only by the combination of Covered Code -with third party code. - -".NET Runtime" means any compliant implementation in software of (a) all of -the required parts of the mandatory provisions of Standard ECMA-335 – Common -Language Infrastructure (CLI); and (b) if implemented, any additional -functionality in Microsoft's .NET Framework, as described in Microsoft's API -documentation on its MSDN website. For example, .NET Runtimes include -Microsoft's .NET Framework and those portions of the Mono Project compliant -with (a) and (b). - -"Enabling Technology" means underlying or enabling technology that may be -used, combined, or distributed in connection with Microsoft's .NET Framework -or other .NET Runtimes, such as hardware, operating systems, and applications -that run on .NET Framework or other .NET Runtimes. - - - ----- Nito.AsyncEx (from LICENSE.TXT) ---- - -The MIT License (MIT) - -Copyright (c) 2014 StephenCleary - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-fo-dicom.NLog 5.0.3 - -## fo-dicom.NLog - -- Version: 5.0.3 -- Authors: fo-dicom contributors -- Project URL: https://github.com/fo-dicom/fo-dicom -- Source: [NuGet](https://www.nuget.org/packages/fo-dicom.NLog/5.0.3) -- License: [Microsoft Public License](https://github.com/fo-dicom/fo-dicom/raw/development/License.txt) - - -``` -Fellow Oak DICOM - -Copyright (c) 2012-2021 fo-dicom contributors - -This software is licensed under the Microsoft Public License (MS-PL) - -Microsoft Public License (MS-PL) - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions - and limitations in section 3, each contributor grants you a non-exclusive, worldwide, - royalty-free copyright license to reproduce its contribution, prepare derivative works - of its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions and - limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free - license under its licensed patents to make, have made, use, sell, offer for sale, import, - and/or otherwise dispose of its contribution in the software or derivative works of the - contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' name, - logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are infringed - by the software, your patent license from such contributor to the software ends automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, - and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only under this - license by including a complete copy of this license with your distribution. If you distribute - any portion of the software in compiled or object code form, you may only do so under a license - that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express - warranties, guarantees or conditions. You may have additional consumer rights under your local - laws which this license cannot change. To the extent permitted under your local laws, the - contributors exclude the implied warranties of merchantability, fitness for a particular purpose - and non-infringement. - - - ----- libijg (from DCMTK 3.5.4 COPYRIGHT) ---- - -Unless otherwise specified, the DCMTK software package has the -following copyright: - -/* - * Copyright (C) 1994-2004, OFFIS - * - * This software and supporting documentation were developed by - * - * Kuratorium OFFIS e.V. - * Healthcare Information and Communication Systems - * Escherweg 2 - * D-26121 Oldenburg, Germany - * - * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND OFFIS MAKES NO WARRANTY - * REGARDING THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR - * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR - * ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND - * PERFORMANCE OF THE SOFTWARE IS WITH THE USER. - * - * Copyright of the software and supporting documentation is, unless - * otherwise stated, owned by OFFIS, and free access is hereby granted as - * a license to use this software, copy this software and prepare - * derivative works based upon this software. However, any distribution - * of this software source code or supporting documentation or derivative - * works (source code and supporting documentation) must include the - * three paragraphs of this copyright notice. - * - */ - -The dcmjpeg sub-package includes an adapted version of the Independent JPEG -Group Toolkit Version 6b, which is contained in dcmjpeg/libijg8, -dcmjpeg/libijg12 and dcmjpeg/libijg16. This toolkit is covered by the -following copyright. The original README file for the Independent JPEG -Group Toolkit is located in dcmjpeg/docs/ijg_readme.txt. - -/* - * The authors make NO WARRANTY or representation, either express or implied, - * with respect to this software, its quality, accuracy, merchantability, or - * fitness for a particular purpose. This software is provided "AS IS", and you, - * its user, assume the entire risk as to its quality and accuracy. - * - * This software is copyright (C) 1991-1998, Thomas G. Lane. - * All Rights Reserved except as specified below. - * - * Permission is hereby granted to use, copy, modify, and distribute this - * software (or portions thereof) for any purpose, without fee, subject to these - * conditions: - * (1) If any part of the source code for this software is distributed, then this - * README file must be included, with this copyright and no-warranty notice - * unaltered; and any additions, deletions, or changes to the original files - * must be clearly indicated in accompanying documentation. - * (2) If only executable code is distributed, then the accompanying - * documentation must state that "this software is based in part on the work of - * the Independent JPEG Group". - * (3) Permission for use of this software is granted only if the user accepts - * full responsibility for any undesirable consequences; the authors accept - * NO LIABILITY for damages of any kind. - * - * These conditions apply to any software derived from or based on the IJG code, - * not just to the unmodified library. If you use our work, you ought to - * acknowledge us. - * - * Permission is NOT granted for the use of any IJG author's name or company name - * in advertising or publicity relating to this software or products derived from - * it. This software may be referred to only as "the Independent JPEG Group's - * software". - * - * We specifically permit and encourage the use of this software as the basis of - * commercial products, provided that all warranty or liability claims are - * assumed by the product vendor. - */ - - - ----- OpenJPEG JPEG 2000 codec (from license.txt) ---- - -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - - ----- CharLS JPEG-LS codec (from License.txt) ---- - -Copyright (c) 2007-2009, Jan de Vaan -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of my employer, nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - ----- Unity.IO.Compression (from LICENSE.TXT and PATENTS.TXT) ---- - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -Microsoft Patent Promise for .NET Libraries and Runtime Components - -Microsoft Corporation and its affiliates ("Microsoft") promise not to assert -any .NET Patents against you for making, using, selling, offering for sale, -importing, or distributing Covered Code, as part of either a .NET Runtime or -as part of any application designed to run on a .NET Runtime. - -If you file, maintain, or voluntarily participate in any claim in a lawsuit -alleging direct or contributory patent infringement by any Covered Code, or -inducement of patent infringement by any Covered Code, then your rights under -this promise will automatically terminate. - -This promise is not an assurance that (i) any .NET Patents are valid or -enforceable, or (ii) Covered Code does not infringe patents or other -intellectual property rights of any third party. No rights except those -expressly stated in this promise are granted, waived, or received by -Microsoft, whether by implication, exhaustion, estoppel, or otherwise. -This is a personal promise directly from Microsoft to you, and you agree as a -condition of benefiting from it that no Microsoft rights are received from -suppliers, distributors, or otherwise from any other person in connection with -this promise. - -Definitions: - -"Covered Code" means those Microsoft .NET libraries and runtime components as -made available by Microsoft at https://github.com/Microsoft/referencesource. - -".NET Patents" are those patent claims, both currently owned by Microsoft and -acquired in the future, that are necessarily infringed by Covered Code. .NET -Patents do not include any patent claims that are infringed by any Enabling -Technology, that are infringed only as a consequence of modification of -Covered Code, or that are infringed only by the combination of Covered Code -with third party code. - -".NET Runtime" means any compliant implementation in software of (a) all of -the required parts of the mandatory provisions of Standard ECMA-335 – Common -Language Infrastructure (CLI); and (b) if implemented, any additional -functionality in Microsoft's .NET Framework, as described in Microsoft's API -documentation on its MSDN website. For example, .NET Runtimes include -Microsoft's .NET Framework and those portions of the Mono Project compliant -with (a) and (b). - -"Enabling Technology" means underlying or enabling technology that may be -used, combined, or distributed in connection with Microsoft's .NET Framework -or other .NET Runtimes, such as hardware, operating systems, and applications -that run on .NET Framework or other .NET Runtimes. - - - ----- Nito.AsyncEx (from LICENSE.TXT) ---- - -The MIT License (MIT) - -Copyright (c) 2014 StephenCleary - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-runtime.any.System.Collections 4.3.0 - -## runtime.any.System.Collections - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Collections/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Diagnostics.Tools 4.3.0 - -## runtime.any.System.Diagnostics.Tools - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Diagnostics.Tools/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Diagnostics.Tracing 4.3.0 - -## runtime.any.System.Diagnostics.Tracing - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Diagnostics.Tracing/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Globalization 4.3.0 - -## runtime.any.System.Globalization - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Globalization/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Globalization.Calendars 4.3.0 - -## runtime.any.System.Globalization.Calendars - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Globalization.Calendars/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.IO 4.3.0 - -## runtime.any.System.IO - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.IO/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Reflection 4.3.0 - -## runtime.any.System.Reflection - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Reflection/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Reflection.Extensions 4.3.0 - -## runtime.any.System.Reflection.Extensions - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Reflection.Extensions/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Reflection.Primitives 4.3.0 - -## runtime.any.System.Reflection.Primitives - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Reflection.Primitives/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Resources.ResourceManager 4.3.0 - -## runtime.any.System.Resources.ResourceManager - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Resources.ResourceManager/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Runtime 4.3.0 - -## runtime.any.System.Runtime - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Runtime/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Runtime.Handles 4.3.0 - -## runtime.any.System.Runtime.Handles - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Runtime.Handles/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Runtime.InteropServices 4.3.0 - -## runtime.any.System.Runtime.InteropServices - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Runtime.InteropServices/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` - -
- - -
-runtime.any.System.Text.Encoding 4.3.0 - -## runtime.any.System.Text.Encoding - -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Text.Encoding/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) - - -``` -MICROSOFT SOFTWARE LICENSE -TERMS - -MICROSOFT .NET -LIBRARY - -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. - -If -you comply with these license terms, you have the rights below. - -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  - -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.any.System.Text.Encoding.Extensions 4.3.0 -## runtime.any.System.Text.Encoding.Extensions -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Text.Encoding.Extensions/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.any.System.Threading.Tasks 4.3.0 -## runtime.any.System.Threading.Tasks -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Threading.Tasks/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +Skip to content -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.any.System.Threading.Timer 4.3.0 -## runtime.any.System.Threading.Timer -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.any.System.Threading.Timer/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS +Toggle navigation + + + + + + + + + + + Sign in + + + + + + + + + + + + + + + + + + Product + + + + + + + + + + + + + +Actions + Automate any workflow + + + + + + + + +Packages + Host and manage packages + + + + + + + + +Security + Find and fix vulnerabilities + + + + + + + + +Codespaces + Instant dev environments + + + + + + + + +Copilot + Write better code with AI + + + + + + + + +Code review + Manage code changes + + + + + + + + +Issues + Plan and track work + + + + + + + + +Discussions + Collaborate outside of code + + + + + +Explore + + + + All features + + + + + + Documentation + + + + + -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. + GitHub Skills + + + + + + + + Blog + + + + + + + + + + + + Solutions + + + + + + +For + + + + Enterprise + + + + + + Teams + + + + + + Startups + + + + + + Education + + + + + + + + +By Solution + + + + CI/CD & Automation + + + + + + DevOps + + + + + + + + DevSecOps + + + + + + + + +Resources + + + + Learning Pathways + + + + + + + + White papers, Ebooks, Webinars + + + + + + + + Customer Stories + + + + + + Partners + + + + + + + + + + + + Open Source + + + + + + + + + + +GitHub Sponsors + Fund open source developers + -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +The ReadME Project + GitHub community articles + -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +Repositories -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` + Topics + + + + + + Trending + + + + + + Collections + + + + + + + + +Pricing + + + + + + + + + + + + +Search or jump to... + + + + + + + +Search code, repositories, users, issues, pull requests... + + + + + + + Search + + + + + + + + + + + + + + +Clear + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search syntax tips + + + + + + + + + + + + + + + + Provide feedback + + -
-
-runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.2 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY + +We read every piece of feedback, and take your input very seriously. -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. +Include my email address so I can be contacted -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` + Cancel + + Submit feedback + + + + + + + + + + + Saved searches + +Use saved searches to filter your results more quickly + + + + + + + + + + + + + + + +Name + + + + + + +Query + + + + To see all available qualifiers, see our documentation. + + + + + + + + Cancel + + Create saved search + + + + + + + + + Sign in + + + + Sign up + + + + + + + + + + +You signed in with another tab or window. Reload to refresh your session. +You signed out in another tab or window. Reload to refresh your session. +You switched accounts on another tab or window. Reload to refresh your session. + + + +Dismiss alert + + + + + + + + + + + + + This repository has been archived by the owner on Jan 23, 2023. It is now read-only. + + + + + + + + + + + dotnet + +/ + +corefx + +Public archive + + + + + + + +Notifications + + + + + +Fork + 5.1k + + + + + -
+ Star + 17.8k + -
-runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. + + + + + + +Code + + + + + + + +Pull requests +0 + + + + + + +Security + + + + + + + +Insights + + + + + + + + +Additional navigation options + + + + + + + + + + + + + Code + + + + + + + + + + + Pull requests + + + + + + + + + + + Security + + + + + + + + + + + Insights + + + + + + + + + + + + + + + + + + + + + + +Footer + + + + + + + + + © 2024 GitHub, Inc. + + + +Footer navigation + + +Terms + + +Privacy + + +Security + + +Status + + +Docs + + +Contact + + + + + Manage cookies + + + + + + + Do not share my personal information + + + + + + + + + + + + + + + + + + You can’t perform that action at this time. ```
-runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +System.Threading.Channels 7.0.0 -## runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl +## System.Threading.Channels -- Version: 4.3.2 +- Version: 7.0.0 - Authors: Microsoft -- Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/7.0.0) +- License: [MIT]( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +corefx/LICENSE.TXT at master · dotnet/corefx · GitHub -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.2 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.native.System 4.3.0 -## runtime.native.System -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.native.System.IO.Compression 4.3.0 -## runtime.native.System.IO.Compression -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.IO.Compression/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS +Skip to content + + + + + + + + + + + + + +Toggle navigation + + + + + + + + + + + Sign in + + + + + + + + + + + + + + + + + + Product + + + + + + + + + + + + + +Actions + Automate any workflow + + + + + + + + +Packages + Host and manage packages + + + + + + + + +Security + Find and fix vulnerabilities + + + + + + + + +Codespaces + Instant dev environments + + + + + + + + +Copilot + Write better code with AI + + + + + + + + +Code review + Manage code changes + + + + + + + + +Issues + Plan and track work + + + + + + + + +Discussions + Collaborate outside of code + + + + + +Explore + + + + All features + + + + + + Documentation + + + + + + + + GitHub Skills + + + + + + + + Blog + + + + + + + + + + + + Solutions + + + + + + +For + + + + Enterprise + + + + + + Teams + + + + + + Startups + + + + + + Education + + + + + + + + +By Solution + + + + CI/CD & Automation + + + + + + DevOps + + + + + + + + DevSecOps + + + + + + + + +Resources + + + + Learning Pathways + + + + + + + + White papers, Ebooks, Webinars + + + + + + + + Customer Stories + + + + + + Partners + + + + + + + + + + + + Open Source + + + + + + + + + + +GitHub Sponsors + Fund open source developers + + + + + + + + + +The ReadME Project + GitHub community articles + + + + + +Repositories + + + + Topics + + + + + + Trending + + + + + + Collections + + + + + + + + +Pricing + + + + + + + + + + + + +Search or jump to... + + + + + + + +Search code, repositories, users, issues, pull requests... + + + + + + + Search + + + + + + + + + + + + + + +Clear + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search syntax tips + + + + + + + + + + + + + + + + Provide feedback + + + + + + + + + + + +We read every piece of feedback, and take your input very seriously. + + +Include my email address so I can be contacted + + + Cancel + + Submit feedback + + + + + + + + + + + Saved searches + +Use saved searches to filter your results more quickly + + + + + + + + + + + + + + + +Name + + + + + + +Query + + + + To see all available qualifiers, see our documentation. + + + + + + + + Cancel + + Create saved search + + + + + + + + + Sign in + + + + Sign up + + + + + + + + + + +You signed in with another tab or window. Reload to refresh your session. +You signed out in another tab or window. Reload to refresh your session. +You switched accounts on another tab or window. Reload to refresh your session. + + + +Dismiss alert + + + + + + + + + + + + + This repository has been archived by the owner on Jan 23, 2023. It is now read-only. + + + + + + + + + + + dotnet + +/ + +corefx + +Public archive + + + + + + + +Notifications + + + + + +Fork + 5.1k + + + + + + + + Star + 17.8k + + + + + + + + -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. -``` -
-
-runtime.native.System.Net.Http 4.3.0 -## runtime.native.System.Net.Http +Code -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Net.Http/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) -``` -MICROSOFT SOFTWARE LICENSE -TERMS -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +Pull requests +0 -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. + + + + + +Security + + + + + + + +Insights + + + + + + + + +Additional navigation options + + + + + + + + + + + + + Code + + + + + + + + + + + Pull requests + + + + + + + + + + + Security + + + + + + + + + + + Insights + + + + + + + + + + + + + + + + + + + + + + +Footer + + + + + + + + + © 2024 GitHub, Inc. + + + +Footer navigation + + +Terms + + +Privacy + + +Security + + +Status + + +Docs + + +Contact + + + + + Manage cookies + + + + + + + Do not share my personal information + + + + + + + + + + + + + + + + + + You can’t perform that action at this time. ```
-runtime.native.System.Security.Cryptography.Apple 4.3.0 +System.Threading.Tasks 4.3.0 -## runtime.native.System.Security.Cryptography.Apple +## System.Threading.Tasks - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Security.Cryptography.Apple/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -34051,7 +24177,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -34065,36 +24191,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -34103,11 +24229,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -34126,22 +24252,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -34150,10 +24276,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -34161,7 +24287,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -34182,10 +24308,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -34196,11 +24322,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -34223,19 +24349,24 @@ consequential or other damages.
-runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +System.Threading.Tasks.Extensions 4.3.0 -## runtime.native.System.Security.Cryptography.OpenSsl +## System.Threading.Tasks.Extensions - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.3.0) +- License: [MIT](https://dotnet.microsoft.com/en-us/dotnet_library_license.htm) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -34251,7 +24382,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -34265,36 +24396,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -34303,11 +24434,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -34326,22 +24457,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -34350,10 +24481,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -34361,7 +24492,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -34382,10 +24513,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -34396,11 +24527,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -34423,19 +24554,24 @@ consequential or other damages.
-runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +System.Threading.Tasks.Extensions 4.5.4 -## runtime.native.System.Security.Cryptography.OpenSsl +## System.Threading.Tasks.Extensions -- Version: 4.3.2 +- Version: 4.5.4 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/4.5.4) +- License: [MIT](https://dotnet.microsoft.com/en-us/dotnet_library_license.htm) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -34451,7 +24587,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -34465,36 +24601,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -34503,11 +24639,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -34526,22 +24662,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -34550,10 +24686,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -34561,7 +24697,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -34582,10 +24718,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -34596,11 +24732,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -34623,19 +24759,24 @@ consequential or other damages.
-runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +System.Threading.Timer 4.3.0 -## runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl +## System.Threading.Timer - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Timer/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -34651,7 +24792,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -34665,36 +24806,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -34703,11 +24844,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -34726,22 +24867,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -34750,10 +24891,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -34761,7 +24902,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -34782,10 +24923,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -34796,11 +24937,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -34823,19 +24964,24 @@ consequential or other damages.
-runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +System.Xml.ReaderWriter 4.3.0 -## runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl +## System.Xml.ReaderWriter -- Version: 4.3.2 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- Source: [NuGet](https://www.nuget.org/packages/System.Xml.ReaderWriter/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -34851,7 +24997,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -34865,36 +25011,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -34903,11 +25049,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -34926,22 +25072,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -34950,10 +25096,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -34961,7 +25107,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -34982,10 +25128,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -34996,11 +25142,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -35023,19 +25169,24 @@ consequential or other damages.
-runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +System.Xml.XDocument 4.3.0 -## runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl +## System.Xml.XDocument - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Xml.XDocument/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -35051,7 +25202,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -35065,36 +25216,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -35103,11 +25254,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -35126,22 +25277,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -35150,10 +25301,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -35161,7 +25312,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -35182,10 +25333,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -35196,11 +25347,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -35223,419 +25374,612 @@ consequential or other damages.
-runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +TestableIO.System.IO.Abstractions 20.0.4 + +## TestableIO.System.IO.Abstractions + +- Version: 20.0.4 +- Authors: Tatham Oddie & friends +- Project URL: https://github.com/TestableIO/System.IO.Abstractions +- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions/20.0.4) +- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) Tatham Oddie and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+TestableIO.System.IO.Abstractions.TestingHelpers 20.0.4 + +## TestableIO.System.IO.Abstractions.TestingHelpers + +- Version: 20.0.4 +- Authors: Tatham Oddie & friends +- Project URL: https://github.com/TestableIO/System.IO.Abstractions +- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions.TestingHelpers/20.0.4) +- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) Tatham Oddie and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+TestableIO.System.IO.Abstractions.Wrappers 20.0.4 + +## TestableIO.System.IO.Abstractions.Wrappers + +- Version: 20.0.4 +- Authors: Tatham Oddie & friends +- Project URL: https://github.com/TestableIO/System.IO.Abstractions +- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions.Wrappers/20.0.4) +- License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) Tatham Oddie and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+Validation 2.4.18 + +## Validation + +- Version: 2.4.18 +- Authors: Andrew Arnott +- Owners: Andrew Arnott +- Project URL: http://github.com/aarnott/Validation +- Source: [NuGet](https://www.nuget.org/packages/Validation/2.4.18) +- License: [Microsoft Public License]( https://raw.githubusercontent.com/AArnott/Validation/69e6a2c4f3/LICENSE.txt) + + +``` +Microsoft Public License (MS-PL) +This license governs use of the accompanying software. If you use the software, you +accept this license. If you do not accept the license, do not use the software. + +1. Definitions +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the +same meaning here as under U.S. copyright law. +A "contribution" is the original software, or any additions or changes to the software. +A "contributor" is any person that distributes its contribution under this license. +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. +``` + +
+ + +
+Xunit.SkippableFact 1.3.12 + +## Xunit.SkippableFact + +- Version: 1.3.12 +- Authors: Andrew Arnott +- Owners: Andrew Arnott +- Project URL: https://github.com/AArnott/Xunit.SkippableFact +- Source: [NuGet](https://www.nuget.org/packages/Xunit.SkippableFact/1.3.12) +- License: [Microsoft Public License](https://raw.githubusercontent.com/AArnott/Xunit.SkippableFact/c7f20eaa78/LICENSE.txt) + + +``` +This software is licensed under the Microsoft Public License +http://opensource.org/licenses/ms-pl + +This license governs use of the accompanying software. If you use the software, you +accept this license. If you do not accept the license, do not use the software. + +1. Definitions + The terms "reproduce," "reproduction," "derivative works," and "distribution" have the + same meaning here as under U.S. copyright law. + A "contribution" is the original software, or any additions or changes to the software. + A "contributor" is any person that distributes its contribution under this license. + "Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. +``` + +
+ + +
+ZstdSharp.Port 0.7.3 -## runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl +## ZstdSharp.Port -- Version: 4.3.2 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +- Version: 0.7.3 +- Authors: Oleg Stepanischev +- Project URL: https://github.com/oleg-st/ZstdSharp +- Source: [NuGet](https://www.nuget.org/packages/ZstdSharp.Port/0.7.3) +- License: [MIT](https://github.com/oleg-st/ZstdSharp/raw/master/LICENSE) ``` -MICROSOFT SOFTWARE LICENSE -TERMS +MIT License -MICROSOFT .NET -LIBRARY +Copyright (c) 2021 Oleg Stepanischev -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -If -you comply with these license terms, you have the rights below. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+coverlet.collector 6.0.0 + +## coverlet.collector + +- Version: 6.0.0 +- Authors: tonerdo +- Project URL: https://github.com/coverlet-coverage/coverlet +- Source: [NuGet](https://www.nuget.org/packages/coverlet.collector/6.0.0) +- License: [MIT](https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) + + +``` +The MIT License (MIT) + +Copyright (c) 2018 Toni Solarin-Sodara + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+fo-dicom 5.1.2 + +## fo-dicom + +- Version: 5.1.2 +- Authors: fo-dicom contributors +- Project URL: https://github.com/fo-dicom/fo-dicom +- Source: [NuGet](https://www.nuget.org/packages/fo-dicom/5.1.2) +- License: [Microsoft Public License](https://github.com/fo-dicom/fo-dicom/raw/development/License.txt) -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. ``` +Fellow Oak DICOM -
+Copyright (c) 2012-2021 fo-dicom contributors +This software is licensed under the Microsoft Public License (MS-PL) -
-runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple 4.3.0 +Microsoft Public License (MS-PL) -## runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple +This license governs use of the accompanying software. If you use the software, you +accept this license. If you do not accept the license, do not use the software. -- Version: 4.3.0 -- Authors: Microsoft -- Owners: microsoft,dotnetframework -- Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0) -- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) +1. Definitions +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the +same meaning here as under U.S. copyright law. +A "contribution" is the original software, or any additions or changes to the software. +A "contributor" is any person that distributes its contribution under this license. +"Licensed patents" are a contributor's patent claims that read directly on its contribution. +2. Grant of Rights +(A) Copyright Grant- Subject to the terms of this license, including the license conditions + and limitations in section 3, each contributor grants you a non-exclusive, worldwide, + royalty-free copyright license to reproduce its contribution, prepare derivative works + of its contribution, and distribute its contribution or any derivative works that you create. +(B) Patent Grant- Subject to the terms of this license, including the license conditions and + limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free + license under its licensed patents to make, have made, use, sell, offer for sale, import, + and/or otherwise dispose of its contribution in the software or derivative works of the + contribution in the software. -``` -MICROSOFT SOFTWARE LICENSE -TERMS +3. Conditions and Limitations +(A) No Trademark License- This license does not grant you rights to use any contributors' name, + logo, or trademarks. +(B) If you bring a patent claim against any contributor over patents that you claim are infringed + by the software, your patent license from such contributor to the software ends automatically. +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, + and attribution notices that are present in the software. +(D) If you distribute any portion of the software in source code form, you may do so only under this + license by including a complete copy of this license with your distribution. If you distribute + any portion of the software in compiled or object code form, you may only do so under a license + that complies with this license. +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express + warranties, guarantees or conditions. You may have additional consumer rights under your local + laws which this license cannot change. To the extent permitted under your local laws, the + contributors exclude the implied warranties of merchantability, fitness for a particular purpose + and non-infringement. -MICROSOFT .NET -LIBRARY -These -license terms are an agreement between you and Microsoft Corporation (or based -on where you live, one of its affiliates). They apply to the software named -above. The terms also apply to any Microsoft services or updates for the -software, except to the extent those have different terms. -If -you comply with these license terms, you have the rights below. +---- libijg (from DCMTK 3.5.4 COPYRIGHT) ---- -1.    INSTALLATION AND USE RIGHTS. -You may -install and use any number of copies of the software to develop and test your applications.  +Unless otherwise specified, the DCMTK software package has the +following copyright: -2.    -THIRD PARTY COMPONENTS. The software may include third party components with -separate legal notices or governed by other agreements, as may be described in -the ThirdPartyNotices file(s) accompanying the software. -3.    -ADDITIONAL LICENSING -REQUIREMENTS AND/OR USE RIGHTS. -a.     -DISTRIBUTABLE -CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are -permitted to distribute in applications you develop if you comply with the -terms below. -i.      Right to Use and Distribute. -�        -You may copy and distribute the object code form of the software. -�        -Third Party Distribution. You may permit distributors of your applications -to copy and distribute the Distributable Code as part of those applications. -ii.     Distribution Requirements. For any -Distributable Code you distribute, you must -�        -use the Distributable Code in your applications and not as a -standalone distribution; -�        -require distributors and external end users to agree to terms that -protect it at least as much as this agreement; and -�        -indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, -except to the extent that any claim is based solely on the unmodified Distributable -Code. -iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way -that suggests your applications come from or are endorsed by Microsoft; or -�        -modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or -distribution of code, that (i) it be disclosed or distributed in source code -form; or (ii) others have the right to modify it. -4.    -DATA. -a.     -Data Collection. The software may collect -information about you and your use of the software, and send that to Microsoft. -Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and -Microsoft to collect data from users of your applications. If you use -these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s -privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and its use from the software documentation and our privacy -statement. Your use of the software operates as your consent to these -practices. -b.    -Processing of Personal Data. To the extent Microsoft is a -processor or subprocessor of personal data in connection with the software, -Microsoft makes the commitments in the European Union General Data Protection -Regulation Terms of the Online Services Terms to all customers effective May -25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. -5.    -Scope of -License. The software is licensed, not sold. This agreement -only gives you some rights to use the software. Microsoft reserves all other -rights. Unless applicable law gives you more rights despite this limitation, -you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that -only allow you to use it in certain ways. You may not -�        -work around any technical -limitations in the software; -�        -reverse engineer, decompile or -disassemble the software, or otherwise attempt to derive the source code for -the software, except and to the extent required by third party licensing terms -governing use of certain open source components that may be included in the -software; -�        -remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        -use the software in any way that -is against the law; or -�        -share, publish, rent or lease the -software, provide the software as a stand-alone offering for others to use, or -transfer the software or this agreement to any third party. -6.    -Export -Restrictions. You must comply with all domestic and international -export laws and regulations that apply to the software, which include -restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � -7.    -SUPPORT -SERVICES. Because this software is �as is,� we may not provide -support services for it. -8.    -Entire -Agreement. This -agreement, and the terms for supplements, updates, Internet-based services and -support services that you use, are the entire agreement for the software and -support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law -applies to interpretation of and claims for breach of this agreement, and the -laws of the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply. -10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You -may have other rights, including consumer rights, under the laws of your state -or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the -software. This agreement does not change those other rights if the laws of your -state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then -the following provisions apply to you: -a)    Australia. You have statutory guarantees under the Australian Consumer -Law and nothing in this agreement is intended to affect those rights. -b)    Canada. If you acquired this software in Canada, you may stop -receiving updates by turning off the automatic update feature, disconnecting -your device from the Internet (if and when you re-connect to the Internet, -however, the software will resume checking for and installing updates), or uninstalling -the software. The product documentation, if any, may also specify how to turn -off updates for your specific device or software. -c)    Germany and Austria. -(i)������� Warranty. The software will perform -substantially as described in any Microsoft materials that accompany it. -However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only -be liable for slight negligence if Microsoft is in breach of such material -contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose -of this agreement and the compliance with which a party may constantly trust in -(so-called "cardinal obligations"). In other cases of slight negligence, -Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. -12. -Limitation -on and Exclusion of Remedies and Damages. YOU -CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. -$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST -PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) -anything related to the software, services, content (including code) on third -party Internet sites, or third party applications; and (b) claims for breach of -contract, breach of warranty, guarantee or condition, strict liability, -negligence, or other tort to the extent permitted by applicable law. -It -also applies even if Microsoft knew or should have known about the possibility -of the damages. The above limitation or exclusion may not apply to you because -your state or country may not allow the exclusion or limitation of incidental, -consequential or other damages. +/* + * Copyright (C) 1994-2004, OFFIS + * + * This software and supporting documentation were developed by + * + * Kuratorium OFFIS e.V. + * Healthcare Information and Communication Systems + * Escherweg 2 + * D-26121 Oldenburg, Germany + * + * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND OFFIS MAKES NO WARRANTY + * REGARDING THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR + * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR + * ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND + * PERFORMANCE OF THE SOFTWARE IS WITH THE USER. + * + * Copyright of the software and supporting documentation is, unless + * otherwise stated, owned by OFFIS, and free access is hereby granted as + * a license to use this software, copy this software and prepare + * derivative works based upon this software. However, any distribution + * of this software source code or supporting documentation or derivative + * works (source code and supporting documentation) must include the + * three paragraphs of this copyright notice. + * + */ + +The dcmjpeg sub-package includes an adapted version of the Independent JPEG +Group Toolkit Version 6b, which is contained in dcmjpeg/libijg8, +dcmjpeg/libijg12 and dcmjpeg/libijg16. This toolkit is covered by the +following copyright. The original README file for the Independent JPEG +Group Toolkit is located in dcmjpeg/docs/ijg_readme.txt. + +/* + * The authors make NO WARRANTY or representation, either express or implied, + * with respect to this software, its quality, accuracy, merchantability, or + * fitness for a particular purpose. This software is provided "AS IS", and you, + * its user, assume the entire risk as to its quality and accuracy. + * + * This software is copyright (C) 1991-1998, Thomas G. Lane. + * All Rights Reserved except as specified below. + * + * Permission is hereby granted to use, copy, modify, and distribute this + * software (or portions thereof) for any purpose, without fee, subject to these + * conditions: + * (1) If any part of the source code for this software is distributed, then this + * README file must be included, with this copyright and no-warranty notice + * unaltered; and any additions, deletions, or changes to the original files + * must be clearly indicated in accompanying documentation. + * (2) If only executable code is distributed, then the accompanying + * documentation must state that "this software is based in part on the work of + * the Independent JPEG Group". + * (3) Permission for use of this software is granted only if the user accepts + * full responsibility for any undesirable consequences; the authors accept + * NO LIABILITY for damages of any kind. + * + * These conditions apply to any software derived from or based on the IJG code, + * not just to the unmodified library. If you use our work, you ought to + * acknowledge us. + * + * Permission is NOT granted for the use of any IJG author's name or company name + * in advertising or publicity relating to this software or products derived from + * it. This software may be referred to only as "the Independent JPEG Group's + * software". + * + * We specifically permit and encourage the use of this software as the basis of + * commercial products, provided that all warranty or liability claims are + * assumed by the product vendor. + */ + + + +---- OpenJPEG JPEG 2000 codec (from license.txt) ---- + +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + + +---- CharLS JPEG-LS codec (from License.txt) ---- + +Copyright (c) 2007-2009, Jan de Vaan +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of my employer, nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +---- Unity.IO.Compression (from LICENSE.TXT and PATENTS.TXT) ---- + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Microsoft Patent Promise for .NET Libraries and Runtime Components + +Microsoft Corporation and its affiliates ("Microsoft") promise not to assert +any .NET Patents against you for making, using, selling, offering for sale, +importing, or distributing Covered Code, as part of either a .NET Runtime or +as part of any application designed to run on a .NET Runtime. + +If you file, maintain, or voluntarily participate in any claim in a lawsuit +alleging direct or contributory patent infringement by any Covered Code, or +inducement of patent infringement by any Covered Code, then your rights under +this promise will automatically terminate. + +This promise is not an assurance that (i) any .NET Patents are valid or +enforceable, or (ii) Covered Code does not infringe patents or other +intellectual property rights of any third party. No rights except those +expressly stated in this promise are granted, waived, or received by +Microsoft, whether by implication, exhaustion, estoppel, or otherwise. +This is a personal promise directly from Microsoft to you, and you agree as a +condition of benefiting from it that no Microsoft rights are received from +suppliers, distributors, or otherwise from any other person in connection with +this promise. + +Definitions: + +"Covered Code" means those Microsoft .NET libraries and runtime components as +made available by Microsoft at https://github.com/Microsoft/referencesource. + +".NET Patents" are those patent claims, both currently owned by Microsoft and +acquired in the future, that are necessarily infringed by Covered Code. .NET +Patents do not include any patent claims that are infringed by any Enabling +Technology, that are infringed only as a consequence of modification of +Covered Code, or that are infringed only by the combination of Covered Code +with third party code. + +".NET Runtime" means any compliant implementation in software of (a) all of +the required parts of the mandatory provisions of Standard ECMA-335 – Common +Language Infrastructure (CLI); and (b) if implemented, any additional +functionality in Microsoft's .NET Framework, as described in Microsoft's API +documentation on its MSDN website. For example, .NET Runtimes include +Microsoft's .NET Framework and those portions of the Mono Project compliant +with (a) and (b). + +"Enabling Technology" means underlying or enabling technology that may be +used, combined, or distributed in connection with Microsoft's .NET Framework +or other .NET Runtimes, such as hardware, operating systems, and applications +that run on .NET Framework or other .NET Runtimes. + + + +---- Nito.AsyncEx (from LICENSE.TXT) ---- + +The MIT License (MIT) + +Copyright (c) 2014 StephenCleary + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -35651,7 +25995,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -35665,36 +26009,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -35703,11 +26047,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -35726,22 +26070,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -35750,10 +26094,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -35761,7 +26105,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -35782,10 +26126,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -35796,11 +26140,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -35823,19 +26167,24 @@ consequential or other damages.
-runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- Source: [NuGet](https://www.nuget.org/packages/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -35851,7 +26200,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -35865,36 +26214,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -35903,11 +26252,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -35926,22 +26275,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -35950,10 +26299,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -35961,7 +26310,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -35982,10 +26331,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -35996,11 +26345,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -36023,19 +26372,24 @@ consequential or other damages.
-runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -36051,7 +26405,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -36065,36 +26419,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -36103,11 +26457,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -36126,22 +26480,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -36150,10 +26504,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -36161,7 +26515,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -36182,10 +26536,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -36196,11 +26550,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -36223,19 +26577,24 @@ consequential or other damages.
-runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -36251,7 +26610,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -36265,36 +26624,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -36303,11 +26662,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -36326,22 +26685,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -36350,10 +26709,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -36361,7 +26720,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -36382,10 +26741,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -36396,11 +26755,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -36423,19 +26782,24 @@ consequential or other damages.
-runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -36451,7 +26815,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -36465,36 +26829,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -36503,11 +26867,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -36526,22 +26890,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -36550,10 +26914,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -36561,7 +26925,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -36582,10 +26946,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -36596,11 +26960,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -36623,19 +26987,24 @@ consequential or other damages.
-runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- Source: [NuGet](https://www.nuget.org/packages/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -36651,7 +27020,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -36665,36 +27034,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -36703,11 +27072,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -36726,22 +27095,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -36750,10 +27119,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -36761,7 +27130,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -36782,10 +27151,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -36796,11 +27165,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -36823,19 +27192,24 @@ consequential or other damages.
-runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +runtime.native.System 4.3.0 -## runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.native.System - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -36851,7 +27225,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -36865,36 +27239,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -36903,11 +27277,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -36926,22 +27300,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -36950,10 +27324,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -36961,7 +27335,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -36982,10 +27356,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -36996,11 +27370,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -37023,19 +27397,24 @@ consequential or other damages.
-runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +runtime.native.System.IO.Compression 4.3.0 -## runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.native.System.IO.Compression -- Version: 4.3.2 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.IO.Compression/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -37051,7 +27430,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -37065,36 +27444,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -37103,11 +27482,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -37126,22 +27505,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -37150,10 +27529,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -37161,7 +27540,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -37182,10 +27561,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -37196,11 +27575,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -37223,19 +27602,24 @@ consequential or other damages.
-runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 +runtime.native.System.IO.Compression 4.3.2 -## runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.native.System.IO.Compression -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.IO.Compression/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -37251,7 +27635,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -37265,36 +27649,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -37303,11 +27687,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -37326,22 +27710,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -37350,10 +27734,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -37361,7 +27745,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -37382,10 +27766,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -37396,11 +27780,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -37423,19 +27807,24 @@ consequential or other damages.
-runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 +runtime.native.System.Net.Http 4.3.0 -## runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl +## runtime.native.System.Net.Http -- Version: 4.3.2 +- Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Net.Http/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -37451,7 +27840,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -37465,36 +27854,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -37503,11 +27892,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -37526,22 +27915,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -37550,10 +27939,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -37561,7 +27950,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -37582,10 +27971,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -37596,11 +27985,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -37623,19 +28012,24 @@ consequential or other damages.
-runtime.unix.Microsoft.Win32.Primitives 4.3.0 +runtime.native.System.Security.Cryptography.Apple 4.3.0 -## runtime.unix.Microsoft.Win32.Primitives +## runtime.native.System.Security.Cryptography.Apple - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.Microsoft.Win32.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Security.Cryptography.Apple/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -37651,7 +28045,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -37665,36 +28059,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -37703,11 +28097,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -37726,22 +28120,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -37750,10 +28144,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -37761,7 +28155,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -37782,10 +28176,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -37796,11 +28190,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -37823,19 +28217,24 @@ consequential or other damages.
-runtime.unix.System.Console 4.3.0 +runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.unix.System.Console +## runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.Console/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -37851,7 +28250,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -37865,36 +28264,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -37903,11 +28302,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -37926,22 +28325,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -37950,10 +28349,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -37961,7 +28360,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -37982,10 +28381,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -37996,11 +28395,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -38023,19 +28422,24 @@ consequential or other damages.
-runtime.unix.System.Diagnostics.Debug 4.3.0 +runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.unix.System.Diagnostics.Debug +## runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.Diagnostics.Debug/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -38051,7 +28455,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -38065,36 +28469,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -38103,11 +28507,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -38126,22 +28530,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -38150,10 +28554,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -38161,7 +28565,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -38182,10 +28586,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -38196,11 +28600,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -38223,19 +28627,24 @@ consequential or other damages.
-runtime.unix.System.IO.FileSystem 4.3.0 +runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.unix.System.IO.FileSystem +## runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.IO.FileSystem/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -38251,7 +28660,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -38265,36 +28674,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -38303,11 +28712,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -38326,22 +28735,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -38350,10 +28759,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -38361,7 +28770,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -38382,10 +28791,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -38396,11 +28805,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -38423,19 +28832,24 @@ consequential or other damages.
-runtime.unix.System.Net.Primitives 4.3.0 +runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.unix.System.Net.Primitives +## runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.Net.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -38451,7 +28865,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -38465,36 +28879,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -38503,11 +28917,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -38526,22 +28940,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -38550,10 +28964,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -38561,7 +28975,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -38582,10 +28996,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -38596,11 +29010,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -38623,19 +29037,24 @@ consequential or other damages.
-runtime.unix.System.Net.Sockets 4.3.0 +runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.unix.System.Net.Sockets +## runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.Net.Sockets/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -38651,7 +29070,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -38665,36 +29084,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -38703,11 +29122,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -38726,22 +29145,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -38750,10 +29169,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -38761,7 +29180,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -38782,10 +29201,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -38796,11 +29215,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -38823,19 +29242,24 @@ consequential or other damages.
-runtime.unix.System.Private.Uri 4.3.0 +runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.unix.System.Private.Uri +## runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.Private.Uri/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -38851,7 +29275,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -38865,36 +29289,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -38903,11 +29327,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -38926,22 +29350,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -38950,10 +29374,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -38961,7 +29385,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -38982,10 +29406,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -38996,11 +29420,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -39023,19 +29447,24 @@ consequential or other damages.
-runtime.unix.System.Runtime.Extensions 4.3.0 +runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple 4.3.0 -## runtime.unix.System.Runtime.Extensions +## runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.unix.System.Runtime.Extensions/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -39051,7 +29480,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -39065,36 +29494,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -39103,11 +29532,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -39126,22 +29555,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -39150,10 +29579,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -39161,7 +29590,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -39182,10 +29611,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -39196,11 +29625,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -39223,19 +29652,24 @@ consequential or other damages.
-runtime.win.Microsoft.Win32.Primitives 4.3.0 +runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.win.Microsoft.Win32.Primitives +## runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.Microsoft.Win32.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -39251,7 +29685,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -39265,36 +29699,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -39303,11 +29737,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -39326,22 +29760,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -39350,10 +29784,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -39361,7 +29795,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -39382,10 +29816,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -39396,11 +29830,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -39423,19 +29857,24 @@ consequential or other damages.
-runtime.win.System.Console 4.3.0 +runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.win.System.Console +## runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.System.Console/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -39451,7 +29890,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -39465,36 +29904,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -39503,11 +29942,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -39526,22 +29965,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -39550,10 +29989,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -39561,7 +30000,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -39582,10 +30021,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -39596,11 +30035,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -39623,19 +30062,24 @@ consequential or other damages.
-runtime.win.System.Diagnostics.Debug 4.3.0 +runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.win.System.Diagnostics.Debug +## runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.System.Diagnostics.Debug/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -39651,7 +30095,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -39665,36 +30109,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -39703,11 +30147,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -39726,22 +30170,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -39750,10 +30194,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -39761,7 +30205,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -39782,10 +30226,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -39796,11 +30240,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -39823,19 +30267,24 @@ consequential or other damages.
-runtime.win.System.IO.FileSystem 4.3.0 +runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.win.System.IO.FileSystem +## runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.System.IO.FileSystem/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -39851,7 +30300,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -39865,36 +30314,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -39903,11 +30352,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -39926,22 +30375,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -39950,10 +30399,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -39961,7 +30410,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -39982,10 +30431,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -39996,11 +30445,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -40023,19 +30472,24 @@ consequential or other damages.
-runtime.win.System.Net.Primitives 4.3.0 +runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.win.System.Net.Primitives +## runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.System.Net.Primitives/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -40051,7 +30505,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -40065,36 +30519,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -40103,11 +30557,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -40126,22 +30580,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -40150,10 +30604,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -40161,7 +30615,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -40182,10 +30636,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -40196,11 +30650,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -40223,19 +30677,24 @@ consequential or other damages.
-runtime.win.System.Net.Sockets 4.3.0 +runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## runtime.win.System.Net.Sockets +## runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 4.3.0 +- Version: 4.3.2 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.System.Net.Sockets/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -40251,7 +30710,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -40265,36 +30724,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -40303,11 +30762,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -40326,22 +30785,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -40350,10 +30809,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -40361,7 +30820,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -40382,10 +30841,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -40396,11 +30855,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -40423,19 +30882,24 @@ consequential or other damages.
-runtime.win.System.Runtime.Extensions 4.3.0 +runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## runtime.win.System.Runtime.Extensions +## runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl - Version: 4.3.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/runtime.win.System.Runtime.Extensions/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) - License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` +.NET Library License Terms | .NET + + + + MICROSOFT SOFTWARE LICENSE TERMS @@ -40451,7 +30915,7 @@ software, except to the extent those have different terms. If you comply with these license terms, you have the rights below. -1.    INSTALLATION AND USE RIGHTS. +1.    INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications.  @@ -40465,36 +30929,36 @@ REQUIREMENTS AND/OR USE RIGHTS. a.     DISTRIBUTABLE CODE.  The software is -comprised of Distributable Code. �Distributable Code� is code that you are +comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in applications you develop if you comply with the terms below. -i.      Right to Use and Distribute. -�        +i.      Right to Use and Distribute. +·        You may copy and distribute the object code form of the software. -�        +·        Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. ii.     Distribution Requirements. For any Distributable Code you distribute, you must -�        +·        use the Distributable Code in your applications and not as a standalone distribution; -�        +·        require distributors and external end users to agree to terms that protect it at least as much as this agreement; and -�        +·        indemnify, defend, and hold harmless Microsoft from any claims, -including attorneys� fees, related to the distribution or use of your applications, +including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified Distributable Code. iii.   Distribution Restrictions. You may not -�        -use Microsoft�s trademarks in your applications� names or in a way +·        +use Microsoft’s trademarks in your applications’ names or in a way that suggests your applications come from or are endorsed by Microsoft; or -�        +·        modify or distribute the source code of any Distributable Code so -that any part of it becomes subject to an Excluded License. An �Excluded -License� is one that requires, as a condition of use, modification or +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or distribution of code, that (i) it be disclosed or distributed in source code form; or (ii) others have the right to modify it. 4.    @@ -40503,11 +30967,11 @@ a.     Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products -and services.� You may opt-out of many of these scenarios, but not all, as -described in the software documentation.� There are also some features in the software that may enable you and +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing -appropriate notices to users of your applications together with Microsoft�s +appropriate notices to users of your applications together with Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and its use from the software documentation and our privacy statement. Your use of the software operates as your consent to these @@ -40526,22 +30990,22 @@ rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not -�        +·        work around any technical limitations in the software; -�        +·        reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; -�        +·        remove, minimize, block or modify -any notices of Microsoft or its suppliers in the software; -�        +any notices of Microsoft or its suppliers in the software; +·        use the software in any way that is against the law; or -�        +·        share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. @@ -40550,10 +31014,10 @@ Export Restrictions. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information -on export restrictions, visit www.microsoft.com/exporting. � +on export restrictions, visit www.microsoft.com/exporting. 7.    SUPPORT -SERVICES. Because this software is �as is,� we may not provide +SERVICES. Because this software is “as is,” we may not provide support services for it. 8.    Entire @@ -40561,7 +31025,7 @@ Agreement. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. -9.    Applicable Law.� If you acquired the software in the United States, Washington law +9.    Applicable Law.  If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. @@ -40582,10 +31046,10 @@ however, the software will resume checking for and installing updates), or unins the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c)    Germany and Austria. -(i)������� Warranty. The software will perform +(i)        Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. -(ii)������ Limitation of Liability. In case of +(ii)       Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. @@ -40596,11 +31060,11 @@ performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence -11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED �AS-IS.� YOU BEAR THE RISK +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. +NON-INFRINGEMENT. 12. Limitation on and Exclusion of Remedies and Damages. YOU @@ -40623,451 +31087,668 @@ consequential or other damages.
-xRetry 1.9.0 - -## xRetry - -- Version: 1.9.0 -- Authors: Josh Keegan -- Owners: Josh Keegan -- Project URL: https://github.com/JoshKeegan/xRetry -- Source: [NuGet](https://www.nuget.org/packages/xRetry/1.9.0) -- License: [MIT](https://github.com/JoshKeegan/xRetry/raw/master/LICENSE) - - -``` -MIT License - -Copyright (c) 2019-2023 Josh Keegan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -
- - -
-xunit 2.4.1 - -## xunit - -- Version: 2.4.1 -- Authors: James Newkirk,Brad Wilson -- Owners: James Newkirk,Brad Wilson -- Project URL: https://github.com/xunit/xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit/2.4.1) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - -``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------ - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel - -Both sets of code are covered by the following license: - - The MIT License (MIT) - - Copyright (c) 2015 .NET Foundation - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -``` - -
- - -
-xunit 2.4.2 - -## xunit - -- Version: 2.4.2 -- Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit/2.4.2) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - -``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------ - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel - -Both sets of code are covered by the following license: - - The MIT License (MIT) - - Copyright (c) 2015 .NET Foundation - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -``` - -
- - -
-xunit.abstractions 2.0.3 +runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## xunit.abstractions +## runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 2.0.3 -- Authors: James Newkirk,Brad Wilson -- Owners: James Newkirk,Brad Wilson -- Project URL: https://github.com/xunit/xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.abstractions/2.0.3) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) +- Version: 4.3.2 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved +.NET Library License Terms | .NET - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------ - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel -Both sets of code are covered by the following license: - The MIT License (MIT) +MICROSOFT SOFTWARE LICENSE +TERMS - Copyright (c) 2015 .NET Foundation +MICROSOFT .NET +LIBRARY - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +These +license terms are an agreement between you and Microsoft Corporation (or based +on where you live, one of its affiliates). They apply to the software named +above. The terms also apply to any Microsoft services or updates for the +software, except to the extent those have different terms. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +If +you comply with these license terms, you have the rights below. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +1.    INSTALLATION AND USE RIGHTS. +You may +install and use any number of copies of the software to develop and test your applications.  + +2.    +THIRD PARTY COMPONENTS. The software may include third party components with +separate legal notices or governed by other agreements, as may be described in +the ThirdPartyNotices file(s) accompanying the software. +3.    +ADDITIONAL LICENSING +REQUIREMENTS AND/OR USE RIGHTS. +a.     +DISTRIBUTABLE +CODE.  The software is +comprised of Distributable Code. “Distributable Code” is code that you are +permitted to distribute in applications you develop if you comply with the +terms below. +i.      Right to Use and Distribute. +·        +You may copy and distribute the object code form of the software. +·        +Third Party Distribution. You may permit distributors of your applications +to copy and distribute the Distributable Code as part of those applications. +ii.     Distribution Requirements. For any +Distributable Code you distribute, you must +·        +use the Distributable Code in your applications and not as a +standalone distribution; +·        +require distributors and external end users to agree to terms that +protect it at least as much as this agreement; and +·        +indemnify, defend, and hold harmless Microsoft from any claims, +including attorneys’ fees, related to the distribution or use of your applications, +except to the extent that any claim is based solely on the unmodified Distributable +Code. +iii.   Distribution Restrictions. You may not +·        +use Microsoft’s trademarks in your applications’ names or in a way +that suggests your applications come from or are endorsed by Microsoft; or +·        +modify or distribute the source code of any Distributable Code so +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or +distribution of code, that (i) it be disclosed or distributed in source code +form; or (ii) others have the right to modify it. +4.    +DATA. +a.     +Data Collection. The software may collect +information about you and your use of the software, and send that to Microsoft. +Microsoft may use this information to provide services and improve our products +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and +Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with Microsoft’s +privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and its use from the software documentation and our privacy +statement. Your use of the software operates as your consent to these +practices. +b.    +Processing of Personal Data. To the extent Microsoft is a +processor or subprocessor of personal data in connection with the software, +Microsoft makes the commitments in the European Union General Data Protection +Regulation Terms of the Online Services Terms to all customers effective May +25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. +5.    +Scope of +License. The software is licensed, not sold. This agreement +only gives you some rights to use the software. Microsoft reserves all other +rights. Unless applicable law gives you more rights despite this limitation, +you may use the software only as expressly permitted in this agreement. In +doing so, you must comply with any technical limitations in the software that +only allow you to use it in certain ways. You may not +·        +work around any technical +limitations in the software; +·        +reverse engineer, decompile or +disassemble the software, or otherwise attempt to derive the source code for +the software, except and to the extent required by third party licensing terms +governing use of certain open source components that may be included in the +software; +·        +remove, minimize, block or modify +any notices of Microsoft or its suppliers in the software; +·        +use the software in any way that +is against the law; or +·        +share, publish, rent or lease the +software, provide the software as a stand-alone offering for others to use, or +transfer the software or this agreement to any third party. +6.    +Export +Restrictions. You must comply with all domestic and international +export laws and regulations that apply to the software, which include +restrictions on destinations, end users, and end use. For further information +on export restrictions, visit www.microsoft.com/exporting. +7.    +SUPPORT +SERVICES. Because this software is “as is,” we may not provide +support services for it. +8.    +Entire +Agreement. This +agreement, and the terms for supplements, updates, Internet-based services and +support services that you use, are the entire agreement for the software and +support services. +9.    Applicable Law.  If you acquired the software in the United States, Washington law +applies to interpretation of and claims for breach of this agreement, and the +laws of the state where you live apply to all other claims. If you acquired the +software in any other country, its laws apply. +10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You +may have other rights, including consumer rights, under the laws of your state +or country. Separate and apart from your relationship with Microsoft, you may +also have rights with respect to the party from which you acquired the +software. This agreement does not change those other rights if the laws of your +state or country do not permit it to do so. For example, if you acquired the +software in one of the below regions, or mandatory country law applies, then +the following provisions apply to you: +a)    Australia. You have statutory guarantees under the Australian Consumer +Law and nothing in this agreement is intended to affect those rights. +b)    Canada. If you acquired this software in Canada, you may stop +receiving updates by turning off the automatic update feature, disconnecting +your device from the Internet (if and when you re-connect to the Internet, +however, the software will resume checking for and installing updates), or uninstalling +the software. The product documentation, if any, may also specify how to turn +off updates for your specific device or software. +c)    Germany and Austria. +(i)        Warranty. The software will perform +substantially as described in any Microsoft materials that accompany it. +However, Microsoft gives no contractual guarantee in relation to the software. +(ii)       Limitation of Liability. In case of +intentional conduct, gross negligence, claims based on the Product Liability +Act, as well as in case of death or personal or physical injury, Microsoft is +liable according to the statutory law. +Subject to the foregoing clause (ii), Microsoft will only +be liable for slight negligence if Microsoft is in breach of such material +contractual obligations, the fulfillment of which facilitate the due +performance of this agreement, the breach of which would endanger the purpose +of this agreement and the compliance with which a party may constantly trust in +(so-called "cardinal obligations"). In other cases of slight negligence, +Microsoft will not be liable for slight negligence +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK +OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. +TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NON-INFRINGEMENT. +12. +Limitation +on and Exclusion of Remedies and Damages. YOU +CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. +$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST +PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) +anything related to the software, services, content (including code) on third +party Internet sites, or third party applications; and (b) claims for breach of +contract, breach of warranty, guarantee or condition, strict liability, +negligence, or other tort to the extent permitted by applicable law. +It +also applies even if Microsoft knew or should have known about the possibility +of the damages. The above limitation or exclusion may not apply to you because +your state or country may not allow the exclusion or limitation of incidental, +consequential or other damages. ```
-xunit.analyzers 0.10.0 +runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.0 -## xunit.analyzers +## runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 0.10.0 -- Authors: Marcin Dobosz -- Owners: Marcin Dobosz -- Project URL: https://github.com/xunit/xunit.analyzers -- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/0.10.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) +- Version: 4.3.0 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +.NET Library License Terms | .NET ------------------------ -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel -Both sets of code are covered by the following license: +MICROSOFT SOFTWARE LICENSE +TERMS - The MIT License (MIT) +MICROSOFT .NET +LIBRARY - Copyright (c) 2015 .NET Foundation +These +license terms are an agreement between you and Microsoft Corporation (or based +on where you live, one of its affiliates). They apply to the software named +above. The terms also apply to any Microsoft services or updates for the +software, except to the extent those have different terms. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +If +you comply with these license terms, you have the rights below. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +1.    INSTALLATION AND USE RIGHTS. +You may +install and use any number of copies of the software to develop and test your applications.  - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +2.    +THIRD PARTY COMPONENTS. The software may include third party components with +separate legal notices or governed by other agreements, as may be described in +the ThirdPartyNotices file(s) accompanying the software. +3.    +ADDITIONAL LICENSING +REQUIREMENTS AND/OR USE RIGHTS. +a.     +DISTRIBUTABLE +CODE.  The software is +comprised of Distributable Code. “Distributable Code” is code that you are +permitted to distribute in applications you develop if you comply with the +terms below. +i.      Right to Use and Distribute. +·        +You may copy and distribute the object code form of the software. +·        +Third Party Distribution. You may permit distributors of your applications +to copy and distribute the Distributable Code as part of those applications. +ii.     Distribution Requirements. For any +Distributable Code you distribute, you must +·        +use the Distributable Code in your applications and not as a +standalone distribution; +·        +require distributors and external end users to agree to terms that +protect it at least as much as this agreement; and +·        +indemnify, defend, and hold harmless Microsoft from any claims, +including attorneys’ fees, related to the distribution or use of your applications, +except to the extent that any claim is based solely on the unmodified Distributable +Code. +iii.   Distribution Restrictions. You may not +·        +use Microsoft’s trademarks in your applications’ names or in a way +that suggests your applications come from or are endorsed by Microsoft; or +·        +modify or distribute the source code of any Distributable Code so +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or +distribution of code, that (i) it be disclosed or distributed in source code +form; or (ii) others have the right to modify it. +4.    +DATA. +a.     +Data Collection. The software may collect +information about you and your use of the software, and send that to Microsoft. +Microsoft may use this information to provide services and improve our products +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and +Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with Microsoft’s +privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and its use from the software documentation and our privacy +statement. Your use of the software operates as your consent to these +practices. +b.    +Processing of Personal Data. To the extent Microsoft is a +processor or subprocessor of personal data in connection with the software, +Microsoft makes the commitments in the European Union General Data Protection +Regulation Terms of the Online Services Terms to all customers effective May +25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. +5.    +Scope of +License. The software is licensed, not sold. This agreement +only gives you some rights to use the software. Microsoft reserves all other +rights. Unless applicable law gives you more rights despite this limitation, +you may use the software only as expressly permitted in this agreement. In +doing so, you must comply with any technical limitations in the software that +only allow you to use it in certain ways. You may not +·        +work around any technical +limitations in the software; +·        +reverse engineer, decompile or +disassemble the software, or otherwise attempt to derive the source code for +the software, except and to the extent required by third party licensing terms +governing use of certain open source components that may be included in the +software; +·        +remove, minimize, block or modify +any notices of Microsoft or its suppliers in the software; +·        +use the software in any way that +is against the law; or +·        +share, publish, rent or lease the +software, provide the software as a stand-alone offering for others to use, or +transfer the software or this agreement to any third party. +6.    +Export +Restrictions. You must comply with all domestic and international +export laws and regulations that apply to the software, which include +restrictions on destinations, end users, and end use. For further information +on export restrictions, visit www.microsoft.com/exporting. +7.    +SUPPORT +SERVICES. Because this software is “as is,” we may not provide +support services for it. +8.    +Entire +Agreement. This +agreement, and the terms for supplements, updates, Internet-based services and +support services that you use, are the entire agreement for the software and +support services. +9.    Applicable Law.  If you acquired the software in the United States, Washington law +applies to interpretation of and claims for breach of this agreement, and the +laws of the state where you live apply to all other claims. If you acquired the +software in any other country, its laws apply. +10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You +may have other rights, including consumer rights, under the laws of your state +or country. Separate and apart from your relationship with Microsoft, you may +also have rights with respect to the party from which you acquired the +software. This agreement does not change those other rights if the laws of your +state or country do not permit it to do so. For example, if you acquired the +software in one of the below regions, or mandatory country law applies, then +the following provisions apply to you: +a)    Australia. You have statutory guarantees under the Australian Consumer +Law and nothing in this agreement is intended to affect those rights. +b)    Canada. If you acquired this software in Canada, you may stop +receiving updates by turning off the automatic update feature, disconnecting +your device from the Internet (if and when you re-connect to the Internet, +however, the software will resume checking for and installing updates), or uninstalling +the software. The product documentation, if any, may also specify how to turn +off updates for your specific device or software. +c)    Germany and Austria. +(i)        Warranty. The software will perform +substantially as described in any Microsoft materials that accompany it. +However, Microsoft gives no contractual guarantee in relation to the software. +(ii)       Limitation of Liability. In case of +intentional conduct, gross negligence, claims based on the Product Liability +Act, as well as in case of death or personal or physical injury, Microsoft is +liable according to the statutory law. +Subject to the foregoing clause (ii), Microsoft will only +be liable for slight negligence if Microsoft is in breach of such material +contractual obligations, the fulfillment of which facilitate the due +performance of this agreement, the breach of which would endanger the purpose +of this agreement and the compliance with which a party may constantly trust in +(so-called "cardinal obligations"). In other cases of slight negligence, +Microsoft will not be liable for slight negligence +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK +OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. +TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NON-INFRINGEMENT. +12. +Limitation +on and Exclusion of Remedies and Damages. YOU +CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. +$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST +PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) +anything related to the software, services, content (including code) on third +party Internet sites, or third party applications; and (b) claims for breach of +contract, breach of warranty, guarantee or condition, strict liability, +negligence, or other tort to the extent permitted by applicable law. +It +also applies even if Microsoft knew or should have known about the possibility +of the damages. The above limitation or exclusion may not apply to you because +your state or country may not allow the exclusion or limitation of incidental, +consequential or other damages. ```
-xunit.analyzers 1.0.0 +runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.2 -## xunit.analyzers +## runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl -- Version: 1.0.0 -- Authors: jnewkirk,bradwilson,marcind -- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/1.0.0) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) +- Version: 4.3.2 +- Authors: Microsoft +- Owners: microsoft,dotnetframework +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.2) +- License: [MICROSOFT .NET LIBRARY License]( http://go.microsoft.com/fwlink/?LinkId=329770) ``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 +.NET Library License Terms | .NET - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------ -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel -Both sets of code are covered by the following license: +MICROSOFT SOFTWARE LICENSE +TERMS - The MIT License (MIT) +MICROSOFT .NET +LIBRARY - Copyright (c) 2015 .NET Foundation +These +license terms are an agreement between you and Microsoft Corporation (or based +on where you live, one of its affiliates). They apply to the software named +above. The terms also apply to any Microsoft services or updates for the +software, except to the extent those have different terms. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +If +you comply with these license terms, you have the rights below. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +1.    INSTALLATION AND USE RIGHTS. +You may +install and use any number of copies of the software to develop and test your applications.  - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +2.    +THIRD PARTY COMPONENTS. The software may include third party components with +separate legal notices or governed by other agreements, as may be described in +the ThirdPartyNotices file(s) accompanying the software. +3.    +ADDITIONAL LICENSING +REQUIREMENTS AND/OR USE RIGHTS. +a.     +DISTRIBUTABLE +CODE.  The software is +comprised of Distributable Code. “Distributable Code” is code that you are +permitted to distribute in applications you develop if you comply with the +terms below. +i.      Right to Use and Distribute. +·        +You may copy and distribute the object code form of the software. +·        +Third Party Distribution. You may permit distributors of your applications +to copy and distribute the Distributable Code as part of those applications. +ii.     Distribution Requirements. For any +Distributable Code you distribute, you must +·        +use the Distributable Code in your applications and not as a +standalone distribution; +·        +require distributors and external end users to agree to terms that +protect it at least as much as this agreement; and +·        +indemnify, defend, and hold harmless Microsoft from any claims, +including attorneys’ fees, related to the distribution or use of your applications, +except to the extent that any claim is based solely on the unmodified Distributable +Code. +iii.   Distribution Restrictions. You may not +·        +use Microsoft’s trademarks in your applications’ names or in a way +that suggests your applications come from or are endorsed by Microsoft; or +·        +modify or distribute the source code of any Distributable Code so +that any part of it becomes subject to an Excluded License. An “Excluded +License” is one that requires, as a condition of use, modification or +distribution of code, that (i) it be disclosed or distributed in source code +form; or (ii) others have the right to modify it. +4.    +DATA. +a.     +Data Collection. The software may collect +information about you and your use of the software, and send that to Microsoft. +Microsoft may use this information to provide services and improve our products +and services.  You may opt-out of many of these scenarios, but not all, as +described in the software documentation.  There are also some features in the software that may enable you and +Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with Microsoft’s +privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and its use from the software documentation and our privacy +statement. Your use of the software operates as your consent to these +practices. +b.    +Processing of Personal Data. To the extent Microsoft is a +processor or subprocessor of personal data in connection with the software, +Microsoft makes the commitments in the European Union General Data Protection +Regulation Terms of the Online Services Terms to all customers effective May +25, 2018, at https://learn.microsoft.com/en-us/legal/gdpr. +5.    +Scope of +License. The software is licensed, not sold. This agreement +only gives you some rights to use the software. Microsoft reserves all other +rights. Unless applicable law gives you more rights despite this limitation, +you may use the software only as expressly permitted in this agreement. In +doing so, you must comply with any technical limitations in the software that +only allow you to use it in certain ways. You may not +·        +work around any technical +limitations in the software; +·        +reverse engineer, decompile or +disassemble the software, or otherwise attempt to derive the source code for +the software, except and to the extent required by third party licensing terms +governing use of certain open source components that may be included in the +software; +·        +remove, minimize, block or modify +any notices of Microsoft or its suppliers in the software; +·        +use the software in any way that +is against the law; or +·        +share, publish, rent or lease the +software, provide the software as a stand-alone offering for others to use, or +transfer the software or this agreement to any third party. +6.    +Export +Restrictions. You must comply with all domestic and international +export laws and regulations that apply to the software, which include +restrictions on destinations, end users, and end use. For further information +on export restrictions, visit www.microsoft.com/exporting. +7.    +SUPPORT +SERVICES. Because this software is “as is,” we may not provide +support services for it. +8.    +Entire +Agreement. This +agreement, and the terms for supplements, updates, Internet-based services and +support services that you use, are the entire agreement for the software and +support services. +9.    Applicable Law.  If you acquired the software in the United States, Washington law +applies to interpretation of and claims for breach of this agreement, and the +laws of the state where you live apply to all other claims. If you acquired the +software in any other country, its laws apply. +10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You +may have other rights, including consumer rights, under the laws of your state +or country. Separate and apart from your relationship with Microsoft, you may +also have rights with respect to the party from which you acquired the +software. This agreement does not change those other rights if the laws of your +state or country do not permit it to do so. For example, if you acquired the +software in one of the below regions, or mandatory country law applies, then +the following provisions apply to you: +a)    Australia. You have statutory guarantees under the Australian Consumer +Law and nothing in this agreement is intended to affect those rights. +b)    Canada. If you acquired this software in Canada, you may stop +receiving updates by turning off the automatic update feature, disconnecting +your device from the Internet (if and when you re-connect to the Internet, +however, the software will resume checking for and installing updates), or uninstalling +the software. The product documentation, if any, may also specify how to turn +off updates for your specific device or software. +c)    Germany and Austria. +(i)        Warranty. The software will perform +substantially as described in any Microsoft materials that accompany it. +However, Microsoft gives no contractual guarantee in relation to the software. +(ii)       Limitation of Liability. In case of +intentional conduct, gross negligence, claims based on the Product Liability +Act, as well as in case of death or personal or physical injury, Microsoft is +liable according to the statutory law. +Subject to the foregoing clause (ii), Microsoft will only +be liable for slight negligence if Microsoft is in breach of such material +contractual obligations, the fulfillment of which facilitate the due +performance of this agreement, the breach of which would endanger the purpose +of this agreement and the compliance with which a party may constantly trust in +(so-called "cardinal obligations"). In other cases of slight negligence, +Microsoft will not be liable for slight negligence +11. Disclaimer of Warranty. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK +OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. +TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NON-INFRINGEMENT. +12. +Limitation +on and Exclusion of Remedies and Damages. YOU +CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. +$5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST +PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) +anything related to the software, services, content (including code) on third +party Internet sites, or third party applications; and (b) claims for breach of +contract, breach of warranty, guarantee or condition, strict liability, +negligence, or other tort to the extent permitted by applicable law. +It +also applies even if Microsoft knew or should have known about the possibility +of the damages. The above limitation or exclusion may not apply to you because +your state or country may not allow the exclusion or limitation of incidental, +consequential or other damages. ```
-xunit.assert 2.4.1 +xRetry 1.9.0 -## xunit.assert +## xRetry -- Version: 2.4.1 -- Authors: James Newkirk,Brad Wilson -- Owners: James Newkirk,Brad Wilson -- Project URL: https://github.com/xunit/xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.4.1) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) +- Version: 1.9.0 +- Authors: Josh Keegan +- Owners: Josh Keegan +- Project URL: https://github.com/JoshKeegan/xRetry +- Source: [NuGet](https://www.nuget.org/packages/xRetry/1.9.0) +- License: [MIT](https://github.com/JoshKeegan/xRetry/raw/master/LICENSE) ``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------ - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel - -Both sets of code are covered by the following license: - - The MIT License (MIT) +MIT License - Copyright (c) 2015 .NET Foundation +Copyright (c) 2019-2023 Josh Keegan - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
-xunit.assert 2.4.2 +xunit 2.6.5 -## xunit.assert +## xunit -- Version: 2.4.2 +- Version: 2.6.5 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit/2.6.5) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -41126,15 +31807,15 @@ Both sets of code are covered by the following license:
-xunit.core 2.4.1 +xunit.abstractions 2.0.3 -## xunit.core +## xunit.abstractions -- Version: 2.4.1 +- Version: 2.0.3 - Authors: James Newkirk,Brad Wilson - Owners: James Newkirk,Brad Wilson - Project URL: https://github.com/xunit/xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.4.1) +- Source: [NuGet](https://www.nuget.org/packages/xunit.abstractions/2.0.3) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -41193,80 +31874,44 @@ Both sets of code are covered by the following license:
-xunit.core 2.4.2 +xunit.analyzers 1.9.0 -## xunit.core +## xunit.analyzers -- Version: 2.4.2 -- Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.4.2) -- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) +- Version: 1.9.0 +- Authors: jnewkirk,bradwilson,marcind +- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/1.9.0) +- License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit.analyzers/master/LICENSE) ``` -Unless otherwise noted, the source code here is covered by the following license: - - Copyright (c) .NET Foundation and Contributors - All Rights Reserved - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------ - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions - -The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: - https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel - -Both sets of code are covered by the following license: - - The MIT License (MIT) - - Copyright (c) 2015 .NET Foundation +Copyright (c) .NET Foundation and Contributors +All Rights Reserved - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ```
-xunit.extensibility.core 2.4.1 +xunit.assert 2.6.5 -## xunit.extensibility.core +## xunit.assert -- Version: 2.4.1 -- Authors: James Newkirk,Brad Wilson -- Owners: James Newkirk,Brad Wilson -- Project URL: https://github.com/xunit/xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.4.1) +- Version: 2.6.5 +- Authors: jnewkirk,bradwilson +- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.6.5) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -41325,13 +31970,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.core 2.4.2 +xunit.core 2.6.5 -## xunit.extensibility.core +## xunit.core -- Version: 2.4.2 +- Version: 2.6.5 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.6.5) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -41390,15 +32035,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.execution 2.4.1 +xunit.extensibility.core 2.6.5 -## xunit.extensibility.execution +## xunit.extensibility.core -- Version: 2.4.1 -- Authors: James Newkirk,Brad Wilson -- Owners: James Newkirk,Brad Wilson -- Project URL: https://github.com/xunit/xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.4.1) +- Version: 2.6.5 +- Authors: jnewkirk,bradwilson +- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.6.5) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -41457,13 +32100,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.execution 2.4.2 +xunit.extensibility.execution 2.6.5 ## xunit.extensibility.execution -- Version: 2.4.2 +- Version: 2.6.5 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.6.5) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -41522,15 +32165,13 @@ Both sets of code are covered by the following license:
-xunit.runner.visualstudio 2.4.3 +xunit.runner.visualstudio 2.5.6 ## xunit.runner.visualstudio -- Version: 2.4.3 -- Authors: .NET Foundation and Contributors -- Owners: .NET Foundation and Contributors -- Project URL: https://github.com/xunit/visualstudio.xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.4.3) +- Version: 2.5.6 +- Authors: jnewkirk,bradwilson +- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.5.6) - License: [MIT]( https://licenses.nuget.org/MIT) @@ -41548,7 +32189,7 @@ MIT License Copyright (c) - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, @@ -41576,57 +32217,3 @@ Data pulled from spdx/license-list-data on February 9, 2023.
- -
-xunit.runner.visualstudio 2.4.5 - -## xunit.runner.visualstudio - -- Version: 2.4.5 -- Authors: .NET Foundation and Contributors -- Project URL: https://github.com/xunit/visualstudio.xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.4.5) -- License: [MIT]( https://licenses.nuget.org/MIT) - - -``` -'MIT' reference - - - -MIT License -SPDX identifier -MIT -License text - -MIT License - - -Copyright (c) - - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and - associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: -The above copyright notice and this permission notice - (including the next paragraph) - shall be included in all copies or substantial - portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT - LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -SPDX web page - -https://spdx.org/licenses/MIT.html - -Notice -This license content is provided by the SPDX project. For more information about licenses.nuget.org, see our documentation. - -Data pulled from spdx/license-list-data on February 9, 2023. -``` - -
diff --git a/docs/docfx.json b/docs/docfx.json index ae61f080d..37f37732b 100644 --- a/docs/docfx.json +++ b/docs/docfx.json @@ -24,7 +24,7 @@ "dest": "obj/api/dotnet", "filter": "filterConfig.yml", "properties": { - "TargetFramework": "net6.0" + "TargetFramework": "net8.0" } } ], diff --git a/global.json b/global.json index 8b45220dd..391ba3c2a 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "6.0.110", + "version": "8.0.100", "rollForward": "latestFeature" } } diff --git a/src/Api/LoggingDataDictionary.cs b/src/Api/LoggingDataDictionary.cs index 695b37e39..bae9e4f44 100644 --- a/src/Api/LoggingDataDictionary.cs +++ b/src/Api/LoggingDataDictionary.cs @@ -15,25 +15,18 @@ * limitations under the License. */ -using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Api { - [Serializable] public class LoggingDataDictionary : Dictionary where TKey : notnull { public LoggingDataDictionary() { } - protected LoggingDataDictionary(SerializationInfo info, StreamingContext context) : base(info, context) - { - } - public override string ToString() { var pairs = this.Select(x => string.Format(CultureInfo.InvariantCulture, "{0}={1}", x.Key, x.Value)); diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index 181306f97..decb9f648 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -1,4 +1,4 @@ - - Monai.Deploy.InformaticsGateway.Api - net6.0 + net8.0 9.0 Apache-2.0 true @@ -27,7 +26,6 @@ false $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage @@ -36,7 +34,6 @@ - Monai.Deploy.InformaticsGateway.Api 0.4.1 @@ -50,36 +47,30 @@ Apache-2.0 True - - + - - - - + + + + - - - - - - + \ No newline at end of file diff --git a/src/Api/Rest/InferenceRequestException.cs b/src/Api/Rest/InferenceRequestException.cs index 9184afc3d..c3941f904 100644 --- a/src/Api/Rest/InferenceRequestException.cs +++ b/src/Api/Rest/InferenceRequestException.cs @@ -16,14 +16,12 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Api.Rest { /// /// Inference request exception. /// - [Serializable] public class InferenceRequestException : Exception { public InferenceRequestException() @@ -37,9 +35,5 @@ public InferenceRequestException(string message) : base(message) public InferenceRequestException(string message, Exception innerException) : base(message, innerException) { } - - protected InferenceRequestException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/Api/Storage/FileStorageMetadata.cs b/src/Api/Storage/FileStorageMetadata.cs index 62a530f1d..f10db2bce 100755 --- a/src/Api/Storage/FileStorageMetadata.cs +++ b/src/Api/Storage/FileStorageMetadata.cs @@ -104,9 +104,6 @@ public abstract record FileStorageMetadata [JsonPropertyName("payloadId")] public string? PayloadId { get; set; } - // [JsonPropertyName("destinationFolder")] - //public string? DestinationFolderNeil { get; set; } - /// /// DO NOT USE /// This constructor is intended for JSON serializer. diff --git a/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj b/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj index 0a064a532..b4fdbf91a 100644 --- a/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj +++ b/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj @@ -13,42 +13,35 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Api.Test Apache-2.0 false true - - all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + \ No newline at end of file diff --git a/src/Api/Test/Storage/PayloadTest.cs b/src/Api/Test/Storage/PayloadTest.cs index d26768f28..d46ef503c 100644 --- a/src/Api/Test/Storage/PayloadTest.cs +++ b/src/Api/Test/Storage/PayloadTest.cs @@ -30,10 +30,10 @@ public async Task GivenStorageInfoObjects_WhenAddIsCalled_ShouldAddToPayloadAndR { var payload = new Payload("key", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new Messaging.Events.DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 1); payload.Add(new TestStorageInfo(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "file1", ".txt", new Messaging.Events.DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "souce" })); - await Task.Delay(450).ConfigureAwait(false); + await Task.Delay(450).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(payload.HasTimedOut); payload.Add(new TestStorageInfo(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "file2", ".txt", new Messaging.Events.DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "souce" })); - await Task.Delay(450).ConfigureAwait(false); + await Task.Delay(450).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(payload.HasTimedOut); Assert.Equal("key", payload.Key); } @@ -43,7 +43,7 @@ public async Task GivenOneStorageInfoObject_AfterAddIsCalled_ExpectTimerToSet() { var payload = new Payload("key", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new Messaging.Events.DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 1); payload.Add(new TestStorageInfo(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "file1", ".txt", new Messaging.Events.DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "souce" })); - await Task.Delay(1001).ConfigureAwait(false); + await Task.Delay(1001).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(payload.HasTimedOut); } diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 903cc6b49..9cef73554 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,21 +10,21 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "System.IO.Abstractions.TestingHelpers": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Dp6gPoqJ7i8dRGubfxzA219fFCtkam9BgSmuIT+fQcFPKkW6vx9PuLTSELsNq+gRoEAzxGbWjsT/3WslfcmRfg==", "dependencies": { - "System.IO.Abstractions": "17.2.3" + "TestableIO.System.IO.Abstractions.TestingHelpers": "20.0.4" } }, "xRetry": { @@ -38,50 +38,50 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -90,7 +90,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -116,20 +116,20 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -143,41 +143,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -194,25 +206,25 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -226,8 +238,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -235,10 +247,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -254,42 +266,42 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -356,13 +368,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -539,11 +559,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.Tools": { "type": "Transitive", @@ -613,8 +630,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1134,8 +1155,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -1234,6 +1255,28 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "O8YeM+jsunyWt4ch93QnvWmMN/uguU0uX2VvDEvlltOxxHfCOuy0jG9m9p/lys52orlbpRa/Rl6mMXwoK2tdcA==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1241,30 +1284,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1272,11 +1312,11 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.api": { @@ -1284,19 +1324,19 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 1a4adf62a..6fe9b7213 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -1,14 +1,14 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "fo-dicom": { "type": "Direct", - "requested": "[5.1.1, )", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "requested": "[5.1.2, )", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -17,7 +17,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -35,67 +35,73 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[1.0.5, )", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.5, )", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Direct", - "requested": "[0.2.18, )", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "requested": "[1.0.0, )", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -109,10 +115,10 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -126,41 +132,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -177,32 +195,32 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -213,13 +231,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -232,16 +258,17 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.Memory": { "type": "Transitive", @@ -271,8 +298,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -283,11 +310,24 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/CLI/Commands/AetCommand.cs b/src/CLI/Commands/AetCommand.cs index d47094b7c..1cbed275d 100755 --- a/src/CLI/Commands/AetCommand.cs +++ b/src/CLI/Commands/AetCommand.cs @@ -173,7 +173,7 @@ private async Task ListAeTitlehandlerAsync(IHost host, bool verbose, Cancel Guard.Against.Null(client, nameof(client), $"{Strings.ApplicationName} client is unavailable."); Guard.Against.Null(consoleRegion, nameof(consoleRegion), "Console region is unavailable."); - IReadOnlyList items = null; + IReadOnlyList? items = null; try { CheckConfiguration(configService); @@ -390,7 +390,7 @@ private async Task ListPlugInsHandlerAsync(IHost host, bool verbose, Cancel Guard.Against.Null(client, nameof(client), $"{Strings.ApplicationName} client is unavailable."); Guard.Against.Null(consoleRegion, nameof(consoleRegion), "Console region is unavailable."); - IDictionary items = null; + IDictionary? items = null; try { CheckConfiguration(configService); diff --git a/src/CLI/Commands/CommandBase.cs b/src/CLI/Commands/CommandBase.cs index 1bbff414a..3521394da 100644 --- a/src/CLI/Commands/CommandBase.cs +++ b/src/CLI/Commands/CommandBase.cs @@ -31,7 +31,7 @@ public CommandBase(string name, string description) : base(name, description) { } - protected static ILogger CreateLogger(IHost host) + protected static ILogger? CreateLogger(IHost host) { Guard.Against.Null(host, nameof(host)); diff --git a/src/CLI/Commands/ConfigCommand.cs b/src/CLI/Commands/ConfigCommand.cs index 43e805418..f9305ab28 100644 --- a/src/CLI/Commands/ConfigCommand.cs +++ b/src/CLI/Commands/ConfigCommand.cs @@ -94,19 +94,19 @@ private int ShowConfigurationHandler(IHost host, bool verbose, CancellationToken try { CheckConfiguration(configService); - logger.ConfigInformaticsGatewayApiEndpoint(configService.Configurations.InformaticsGatewayServerEndpoint); - logger.ConfigDicomScpPort(configService.Configurations.DicomListeningPort); - logger.ConfigContainerRunner(configService.Configurations.Runner); - logger.ConfigHostInfo(configService.Configurations.HostDatabaseStorageMount, configService.Configurations.HostDataStorageMount, configService.Configurations.HostLogsStorageMount); + logger?.ConfigInformaticsGatewayApiEndpoint(configService.Configurations.InformaticsGatewayServerEndpoint); + logger?.ConfigDicomScpPort(configService.Configurations.DicomListeningPort); + logger?.ConfigContainerRunner(configService.Configurations.Runner); + logger?.ConfigHostInfo(configService.Configurations.HostDatabaseStorageMount, configService.Configurations.HostDataStorageMount, configService.Configurations.HostLogsStorageMount); } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) { - logger.CriticalException(ex.Message); + logger?.CriticalException(ex.Message); return ExitCodes.Config_ErrorShowing; } return ExitCodes.Success; @@ -126,16 +126,16 @@ private static int ConfigUpdateHandler(IHost host, Action { CheckConfiguration(config); updater(config); - logger.ConfigurationUpdated(); + logger?.ConfigurationUpdated(); } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) { - logger.CriticalException(ex.Message); + logger?.CriticalException(ex.Message); return ExitCodes.Config_ErrorSaving; } return ExitCodes.Success; @@ -153,7 +153,7 @@ private async Task InitHandlerAsync(IHost host, bool verbose, bool yes, Can if (!yes && configService.IsConfigExists && !confirmation.ShowConfirmationPrompt($"Existing application configuration file already exists. Do you want to overwrite it?")) { - logger.ActionCancelled(); + logger?.ActionCancelled(); return ExitCodes.Stop_Cancelled; } @@ -163,7 +163,7 @@ private async Task InitHandlerAsync(IHost host, bool verbose, bool yes, Can } catch (Exception ex) { - logger.CriticalException(ex.Message); + logger?.CriticalException(ex.Message); return ExitCodes.Config_ErrorInitializing; } return ExitCodes.Success; diff --git a/src/CLI/Commands/ConfigurationException.cs b/src/CLI/Commands/ConfigurationException.cs index 5ab8c9539..29c177ea1 100644 --- a/src/CLI/Commands/ConfigurationException.cs +++ b/src/CLI/Commands/ConfigurationException.cs @@ -15,11 +15,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.CLI { - [Serializable] public class ConfigurationException : Exception { private ConfigurationException() @@ -33,9 +31,5 @@ public ConfigurationException(string message) : base(message) public ConfigurationException(string message, Exception innerException) : base(message, innerException) { } - - protected ConfigurationException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/CLI/Commands/DestinationCommand.cs b/src/CLI/Commands/DestinationCommand.cs index 819cd18cf..4480cd8a4 100755 --- a/src/CLI/Commands/DestinationCommand.cs +++ b/src/CLI/Commands/DestinationCommand.cs @@ -142,7 +142,7 @@ private async Task ListDestinationHandlerAsync(DestinationApplicationEntity Guard.Against.Null(client, nameof(client), $"{Strings.ApplicationName} client is unavailable."); Guard.Against.Null(consoleRegion, nameof(consoleRegion), "Console region is unavailable."); - IReadOnlyList items = null; + IReadOnlyList? items = null; try { CheckConfiguration(configService); @@ -153,12 +153,12 @@ private async Task ListDestinationHandlerAsync(DestinationApplicationEntity } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) { - logger.ErrorListingDicomDestinations(ex.Message); + logger?.ErrorListingDicomDestinations(ex.Message); return ExitCodes.DestinationAe_ErrorList; } @@ -214,7 +214,7 @@ private async Task CEchoDestinationHandlerAsync(string name, IHost host, bo } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) @@ -250,7 +250,7 @@ private async Task RemoveDestinationHandlerAsync(string name, IHost host, b } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) @@ -288,7 +288,7 @@ private async Task EditDestinationHandlerAsync(DestinationApplicationEntity } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) @@ -325,7 +325,7 @@ private async Task AddDestinationHandlerAsync(DestinationApplicationEntity } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) @@ -354,7 +354,7 @@ private async Task ListPlugInsHandlerAsync(IHost host, bool verbose, Cancel Guard.Against.Null(client, nameof(client), $"{Strings.ApplicationName} client is unavailable."); Guard.Against.Null(consoleRegion, nameof(consoleRegion), "Console region is unavailable."); - IDictionary items = null; + IDictionary? items = null; try { CheckConfiguration(configService); @@ -365,12 +365,12 @@ private async Task ListPlugInsHandlerAsync(IHost host, bool verbose, Cancel } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) { - logger.ErrorListingDataOutputPlugIns(ex.Message); + logger?.ErrorListingDataOutputPlugIns(ex.Message); return ExitCodes.DestinationAe_ErrorPlugIns; } diff --git a/src/CLI/Commands/SourceCommand.cs b/src/CLI/Commands/SourceCommand.cs index 2a2f27dd1..47ae0e68d 100644 --- a/src/CLI/Commands/SourceCommand.cs +++ b/src/CLI/Commands/SourceCommand.cs @@ -115,7 +115,7 @@ private async Task ListSourceHandlerAsync(SourceApplicationEntity entity, I Guard.Against.Null(client, nameof(client), $"{Strings.ApplicationName} client is unavailable."); Guard.Against.Null(consoleRegion, nameof(consoleRegion), "Console region is unavailable."); - IReadOnlyList items = null; + IReadOnlyList? items = null; try { CheckConfiguration(configService); @@ -126,12 +126,12 @@ private async Task ListSourceHandlerAsync(SourceApplicationEntity entity, I } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) { - logger.ErrorListingDicomSources(ex.Message); + logger?.ErrorListingDicomSources(ex.Message); return ExitCodes.SourceAe_ErrorList; } @@ -186,7 +186,7 @@ private async Task RemoveSourceHandlerAsync(string name, IHost host, bool v } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) @@ -223,7 +223,7 @@ private async Task AddSourceHandlerAsync(SourceApplicationEntity entity, IH } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) @@ -260,7 +260,7 @@ private async Task UpdateSourceHandlerAsync(SourceApplicationEntity entity, } catch (ConfigurationException ex) { - logger.ConfigurationException(ex.Message); + logger?.ConfigurationException(ex.Message); return ExitCodes.Config_NotConfigured; } catch (Exception ex) diff --git a/src/CLI/ControlException.cs b/src/CLI/ControlException.cs index 02f27f045..51782bfbe 100644 --- a/src/CLI/ControlException.cs +++ b/src/CLI/ControlException.cs @@ -15,12 +15,9 @@ */ using System; -using System.Runtime.Serialization; -using Ardalis.GuardClauses; namespace Monai.Deploy.InformaticsGateway.CLI { - [Serializable] public class ControlException : Exception { public int ErrorCode { get; } @@ -41,19 +38,5 @@ public ControlException(int errorCode, string message) : base(message) { ErrorCode = errorCode; } - - protected ControlException(SerializationInfo info, StreamingContext context) : base(info, context) - { - ErrorCode = info.GetInt32(nameof(ErrorCode)); - } - - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - Guard.Against.Null(info, nameof(info)); - - info.AddValue(nameof(ErrorCode), ErrorCode); - - base.GetObjectData(info, context); - } } } diff --git a/src/CLI/Logging/ConsoleLogger.cs b/src/CLI/Logging/ConsoleLogger.cs index 0b6c25a9c..96456ecf6 100644 --- a/src/CLI/Logging/ConsoleLogger.cs +++ b/src/CLI/Logging/ConsoleLogger.cs @@ -33,14 +33,14 @@ public ConsoleLogger(string name, ConsoleLoggerConfiguration configuration) _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); } - public IDisposable BeginScope(TState state) + public IDisposable? BeginScope(TState state) where TState : notnull { return null; } public bool IsEnabled(LogLevel logLevel) => _configuration.MinimumLogLevel <= logLevel; - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { if (!IsEnabled(logLevel)) { diff --git a/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj b/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj index e9bf663e0..10ecdfd2d 100644 --- a/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj +++ b/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj @@ -13,12 +13,11 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - Monai.Deploy.InformaticsGateway.CLI Exe - net6.0 + net8.0 true false true @@ -27,38 +26,33 @@ ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset true false + enable - - - - - - - + - + \ No newline at end of file diff --git a/src/CLI/Services/ConfigurationOptionAccessor.cs b/src/CLI/Services/ConfigurationOptionAccessor.cs index a086c6ece..e8adade5c 100755 --- a/src/CLI/Services/ConfigurationOptionAccessor.cs +++ b/src/CLI/Services/ConfigurationOptionAccessor.cs @@ -79,7 +79,7 @@ public interface IConfigurationOptionAccessor /// /// Gets the endpoint of the Informatics Gateway as Uri object. /// - Uri InformaticsGatewayServerUri { get; } + Uri? InformaticsGatewayServerUri { get; } /// /// Gets or set the type of container runner from appsettings.json. @@ -92,6 +92,7 @@ public interface IConfigurationOptionAccessor string TempStoragePath { get; } } +#pragma warning disable CS8602 // Dereference of a possibly null reference. public class ConfigurationOptionAccessor : IConfigurationOptionAccessor { private static readonly Object SyncLock = new(); @@ -151,7 +152,7 @@ public string DockerImagePrefix { get { - return GetValueFromJsonPath("Cli.DockerImagePrefix"); + return GetValueFromJsonPath("Cli.DockerImagePrefix") ?? string.Empty; } } @@ -159,7 +160,7 @@ public string HostDatabaseStorageMount { get { - var path = GetValueFromJsonPath("Cli.HostDatabaseStorageMount"); + var path = GetValueFromJsonPath("Cli.HostDatabaseStorageMount") ?? string.Empty; if (path.StartsWith("~/")) { path = path.Replace("~/", $"{Common.HomeDir}/"); @@ -172,7 +173,7 @@ public string HostDataStorageMount { get { - var path = GetValueFromJsonPath("Cli.HostDataStorageMount"); + var path = GetValueFromJsonPath("Cli.HostDataStorageMount") ?? string.Empty; if (path.StartsWith("~/")) { path = path.Replace("~/", $"{Common.HomeDir}/"); @@ -185,7 +186,7 @@ public string HostPlugInsStorageMount { get { - var path = GetValueFromJsonPath("Cli.HostPlugInsStorageMount"); + var path = GetValueFromJsonPath("Cli.HostPlugInsStorageMount") ?? string.Empty; if (path.StartsWith("~/")) { path = path.Replace("~/", $"{Common.HomeDir}/"); @@ -198,7 +199,7 @@ public string HostLogsStorageMount { get { - var path = GetValueFromJsonPath("Cli.HostLogsStorageMount"); + var path = GetValueFromJsonPath("Cli.HostLogsStorageMount") ?? string.Empty; if (path.StartsWith("~/")) { path = path.Replace("~/", $"{Common.HomeDir}/"); @@ -211,7 +212,7 @@ public string InformaticsGatewayServerEndpoint { get { - return GetValueFromJsonPath("Cli.InformaticsGatewayServerEndpoint"); + return GetValueFromJsonPath("Cli.InformaticsGatewayServerEndpoint") ?? string.Empty; } set { @@ -226,15 +227,20 @@ public int InformaticsGatewayServerPort { get { - return InformaticsGatewayServerUri.Port; + return InformaticsGatewayServerUri?.Port ?? 0; } } - public Uri InformaticsGatewayServerUri + public Uri? InformaticsGatewayServerUri { get { - return new Uri(InformaticsGatewayServerEndpoint); + if (InformaticsGatewayServerEndpoint is not null) + { + return new Uri(InformaticsGatewayServerEndpoint); + } + + return null; } } @@ -243,7 +249,11 @@ public Runner Runner get { var runner = GetValueFromJsonPath("Cli.Runner"); - return (Runner)Enum.Parse(typeof(Runner), runner); + if (runner is not null) + { + return (Runner)Enum.Parse(typeof(Runner), runner); + } + return Runner.Unknown; } set { @@ -257,13 +267,18 @@ public string TempStoragePath { get { - return GetValueFromJsonPath("InformaticsGateway.storage.localTemporaryStoragePath"); + return GetValueFromJsonPath("InformaticsGateway.storage.localTemporaryStoragePath") ?? string.Empty; } } - private T GetValueFromJsonPath(string jsonPath) + private T? GetValueFromJsonPath(string jsonPath) { - return ReadConfigurationFile().SelectToken(jsonPath).Value(); + var token = ReadConfigurationFile().SelectToken(jsonPath); + + if (token is not null) + return token.Value(); + + return default; } private JObject ReadConfigurationFile() @@ -286,3 +301,4 @@ private void SaveConfigurationFile(JObject jObject) } } } +#pragma warning restore CS8602 // Dereference of a possibly null reference. diff --git a/src/CLI/Services/ConfigurationService.cs b/src/CLI/Services/ConfigurationService.cs index c989d9325..b0c183808 100644 --- a/src/CLI/Services/ConfigurationService.cs +++ b/src/CLI/Services/ConfigurationService.cs @@ -82,7 +82,7 @@ public async Task WriteConfigFile(string resourceName, string outputPath, Cancel CreateConfigDirectoryIfNotExist(); _logger.SaveAppSettings(resourceName, outputPath); - using (var fileStream = _fileSystem.FileStream.Create(outputPath, FileMode.Create)) + using (var fileStream = _fileSystem.FileStream.New(outputPath, FileMode.Create)) { await stream.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false); await fileStream.FlushAsync(cancellationToken).ConfigureAwait(false); diff --git a/src/CLI/Services/ControlService.cs b/src/CLI/Services/ControlService.cs index 3ccc2ae22..502e34cfc 100644 --- a/src/CLI/Services/ControlService.cs +++ b/src/CLI/Services/ControlService.cs @@ -80,7 +80,7 @@ public async Task StopService(CancellationToken cancellationToken = default) if (!applicationVersions.IsNullOrEmpty()) { - foreach (var applicationVersion in applicationVersions) + foreach (var applicationVersion in applicationVersions!) { var runnerState = await runner.IsApplicationRunning(applicationVersion, cancellationToken).ConfigureAwait(false); diff --git a/src/CLI/Services/DockerRunner.cs b/src/CLI/Services/DockerRunner.cs index 392545400..f98383e6b 100755 --- a/src/CLI/Services/DockerRunner.cs +++ b/src/CLI/Services/DockerRunner.cs @@ -67,10 +67,10 @@ public async Task IsApplicationRunning(ImageVersion imageVersion, C return new RunnerState { IsRunning = true, Id = matches[0].ID }; } - public async Task GetLatestApplicationVersion(CancellationToken cancellationToken = default) + public async Task GetLatestApplicationVersion(CancellationToken cancellationToken = default) => await GetLatestApplicationVersion(_configurationService.Configurations.DockerImagePrefix, cancellationToken).ConfigureAwait(false); - public async Task GetLatestApplicationVersion(string version, CancellationToken cancellationToken = default) + public async Task GetLatestApplicationVersion(string version, CancellationToken cancellationToken = default) { Guard.Against.NullOrWhiteSpace(version, nameof(version)); @@ -78,10 +78,10 @@ public async Task GetLatestApplicationVersion(string version, Canc return results?.OrderByDescending(p => p.Created).FirstOrDefault(); } - public async Task> GetApplicationVersions(CancellationToken cancellationToken = default) + public async Task?> GetApplicationVersions(CancellationToken cancellationToken = default) => await GetApplicationVersions(_configurationService.Configurations.DockerImagePrefix, cancellationToken).ConfigureAwait(false); - public async Task> GetApplicationVersions(string version, CancellationToken cancellationToken = default) + public async Task?> GetApplicationVersions(string version, CancellationToken cancellationToken = default) { Guard.Against.NullOrWhiteSpace(version, nameof(version)); @@ -98,7 +98,11 @@ public async Task> GetApplicationVersions(string version, Ca }; _logger.RetrievingImagesFromDocker(); var images = await _dockerClient.Images.ListImagesAsync(parameters, cancellationToken).ConfigureAwait(false); - return images?.Select(p => new ImageVersion { Version = p.RepoTags[0], Id = p.ID, Created = p.Created }).ToList(); + if (images is null) + { + return null; + } + return images.Select(p => new ImageVersion { Version = p.RepoTags[0], Id = p.ID, Created = p.Created }).ToList(); } public async Task StartApplication(ImageVersion imageVersion, CancellationToken cancellationToken = default) diff --git a/src/CLI/Services/EmbeddedResource.cs b/src/CLI/Services/EmbeddedResource.cs index d93151475..bc449d6ee 100644 --- a/src/CLI/Services/EmbeddedResource.cs +++ b/src/CLI/Services/EmbeddedResource.cs @@ -21,12 +21,12 @@ namespace Monai.Deploy.InformaticsGateway.CLI.Services { public interface IEmbeddedResource { - Stream GetManifestResourceStream(string name); + Stream? GetManifestResourceStream(string name); } public class EmbeddedResource : IEmbeddedResource { - public Stream GetManifestResourceStream(string name) + public Stream? GetManifestResourceStream(string name) { Guard.Against.NullOrWhiteSpace(name, nameof(name)); diff --git a/src/CLI/Services/IContainerRunner.cs b/src/CLI/Services/IContainerRunner.cs index 358fb8d5e..c533ea713 100644 --- a/src/CLI/Services/IContainerRunner.cs +++ b/src/CLI/Services/IContainerRunner.cs @@ -34,7 +34,7 @@ public class RunnerState /// /// ID of the running application provided by the orchestration engine. /// - public string Id { get; set; } + public string Id { get; set; } = string.Empty; /// /// Shorter version of the ID, with 12 characters. @@ -56,13 +56,13 @@ public class ImageVersion /// /// Version or label of the application/image detected. /// - public string Version { get; set; } + public string Version { get; set; } = string.Empty; /// /// Unique ID provided by the orchestration engine. /// /// - public string Id { get; set; } + public string Id { get; set; } = string.Empty; /// /// Shorter version of the ID, with 12 characters. @@ -86,13 +86,13 @@ public interface IContainerRunner { Task IsApplicationRunning(ImageVersion imageVersion, CancellationToken cancellationToken = default); - Task GetLatestApplicationVersion(CancellationToken cancellationToken = default); + Task GetLatestApplicationVersion(CancellationToken cancellationToken = default); - Task GetLatestApplicationVersion(string version, CancellationToken cancellationToken = default); + Task GetLatestApplicationVersion(string version, CancellationToken cancellationToken = default); - Task> GetApplicationVersions(CancellationToken cancellationToken = default); + Task?> GetApplicationVersions(CancellationToken cancellationToken = default); - Task> GetApplicationVersions(string version, CancellationToken cancellationToken = default); + Task?> GetApplicationVersions(string version, CancellationToken cancellationToken = default); Task StartApplication(ImageVersion imageVersion, CancellationToken cancellationToken = default); diff --git a/src/CLI/Services/NLogConfigurationOptionAccessor.cs b/src/CLI/Services/NLogConfigurationOptionAccessor.cs index 0213bf13b..7ea3ad449 100644 --- a/src/CLI/Services/NLogConfigurationOptionAccessor.cs +++ b/src/CLI/Services/NLogConfigurationOptionAccessor.cs @@ -52,9 +52,9 @@ public string LogStoragePath { get { - var value = _xmlDocument.SelectSingleNode("//ns:variable[@name='logDir']/@value", _namespaceManager).InnerText; - value = value.Replace("${basedir}", Common.ContainerApplicationRootPath); - return value; + var value = _xmlDocument.SelectSingleNode("//ns:variable[@name='logDir']/@value", _namespaceManager)?.InnerText; + value = value?.Replace("${basedir}", Common.ContainerApplicationRootPath); + return value ?? string.Empty; } } } diff --git a/src/CLI/Services/Runner.cs b/src/CLI/Services/Runner.cs index 38fe07c95..704ed5bd5 100644 --- a/src/CLI/Services/Runner.cs +++ b/src/CLI/Services/Runner.cs @@ -18,6 +18,7 @@ namespace Monai.Deploy.InformaticsGateway.CLI.Services { public enum Runner { + Unknown, Docker, Kubernetes, Helm, diff --git a/src/CLI/Test/ConfigurationServiceTest.cs b/src/CLI/Test/ConfigurationServiceTest.cs index 0c295d44e..fe5014a1f 100644 --- a/src/CLI/Test/ConfigurationServiceTest.cs +++ b/src/CLI/Test/ConfigurationServiceTest.cs @@ -130,10 +130,10 @@ public async Task Initialize_CreatesTheConfigFiles() _embeddedResource.Verify(p => p.GetManifestResourceStream(Common.AppSettingsResourceName), Times.Once()); _embeddedResource.Verify(p => p.GetManifestResourceStream(Common.NLogConfigResourceName), Times.Once()); - var bytesWritten = await fileSystem.File.ReadAllBytesAsync(Common.ConfigFilePath).ConfigureAwait(false); + var bytesWritten = await fileSystem.File.ReadAllBytesAsync(Common.ConfigFilePath).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(testString, Encoding.UTF8.GetString(bytesWritten)); - bytesWritten = await fileSystem.File.ReadAllBytesAsync(Common.NLogConfigFilePath).ConfigureAwait(false); + bytesWritten = await fileSystem.File.ReadAllBytesAsync(Common.NLogConfigFilePath).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(testString, Encoding.UTF8.GetString(bytesWritten)); } } diff --git a/src/CLI/Test/ControlExceptionTest.cs b/src/CLI/Test/ControlExceptionTest.cs deleted file mode 100644 index 80e61d001..000000000 --- a/src/CLI/Test/ControlExceptionTest.cs +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.CLI.Test -{ - public class ControlExceptionTest - { - [Fact] - public void TestControlExceptionSerialization() - { - var exception = new ControlException(100, "error"); - - var data = SerializeToBytes(exception); - var result = DeserializeFromBytes(data); - - Assert.Equal(exception.ErrorCode, result.ErrorCode); - Assert.Equal(exception.Message, result.Message); - } - - private static byte[] SerializeToBytes(T e) - { - using var stream = new MemoryStream(); -#pragma warning disable SYSLIB0011 // Type or member is obsolete - new BinaryFormatter().Serialize(stream, e); -#pragma warning restore SYSLIB0011 // Type or member is obsolete - return stream.GetBuffer(); - } - - private static T DeserializeFromBytes(byte[] bytes) - { - using var stream = new MemoryStream(bytes); -#pragma warning disable SYSLIB0011 // Type or member is obsolete - return (T)new BinaryFormatter().Deserialize(stream); -#pragma warning restore SYSLIB0011 // Type or member is obsolete - } - } -} diff --git a/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj b/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj index 0aa26c5cf..8e1f6634c 100644 --- a/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj +++ b/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj @@ -13,45 +13,38 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.CLI.Test Apache-2.0 false true - - all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + \ No newline at end of file diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index dbdd6f20e..f9112e2b8 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,19 +10,19 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } @@ -40,11 +40,11 @@ }, "System.IO.Abstractions.TestingHelpers": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Dp6gPoqJ7i8dRGubfxzA219fFCtkam9BgSmuIT+fQcFPKkW6vx9PuLTSELsNq+gRoEAzxGbWjsT/3WslfcmRfg==", "dependencies": { - "System.IO.Abstractions": "17.2.3" + "TestableIO.System.IO.Abstractions.TestingHelpers": "20.0.4" } }, "xRetry": { @@ -58,37 +58,37 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -101,8 +101,8 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "Crayon": { "type": "Transitive", @@ -121,10 +121,10 @@ }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -133,7 +133,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -159,8 +159,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.CSharp": { "type": "Transitive", @@ -169,32 +169,32 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.CommandLine": { @@ -252,40 +252,59 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { @@ -333,41 +352,46 @@ }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", @@ -435,32 +459,29 @@ }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -474,8 +495,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -483,10 +504,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -502,42 +523,42 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -604,13 +625,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -809,11 +838,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -888,8 +914,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1409,8 +1439,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -1504,6 +1534,28 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "O8YeM+jsunyWt4ch93QnvWmMN/uguU0uX2VvDEvlltOxxHfCOuy0jG9m9p/lys52orlbpRa/Rl6mMXwoK2tdcA==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1511,30 +1563,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1542,11 +1591,11 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "mig-cli": { @@ -1554,7 +1603,7 @@ "dependencies": { "Crayon": "[2.0.69, )", "Docker.DotNet": "[3.125.15, )", - "Microsoft.Extensions.Http": "[6.0.0, )", + "Microsoft.Extensions.Http": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", @@ -1567,12 +1616,12 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client": { @@ -1585,14 +1634,14 @@ "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json old mode 100755 new mode 100644 index 22c1f3e80..bc6481d7b --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Crayon": { "type": "Direct", "requested": "[2.0.69, )", @@ -21,16 +21,24 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + }, "System.CommandLine.Hosting": { "type": "Direct", "requested": "[0.4.0-alpha.22272.1, )", @@ -54,33 +62,33 @@ }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -89,7 +97,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -120,32 +128,32 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.CommandLine": { @@ -203,40 +211,59 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { @@ -284,30 +311,33 @@ }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", @@ -375,71 +405,68 @@ }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -450,13 +477,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -482,11 +517,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -495,8 +527,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.Memory": { "type": "Transitive", @@ -526,8 +562,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -543,17 +579,30 @@ "resolved": "4.5.4", "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client": { @@ -566,14 +615,14 @@ "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj b/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj index fbc413d20..c3997b560 100644 --- a/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj +++ b/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj @@ -13,11 +13,9 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Client.Common Apache-2.0 true @@ -26,23 +24,18 @@ true false - - + - - - - - + \ No newline at end of file diff --git a/src/Client.Common/ProblemDetails.cs b/src/Client.Common/ProblemDetails.cs index 4a37cdea3..c42e54192 100644 --- a/src/Client.Common/ProblemDetails.cs +++ b/src/Client.Common/ProblemDetails.cs @@ -15,11 +15,8 @@ * limitations under the License. */ -using System; - namespace Monai.Deploy.InformaticsGateway.Client.Common { - [Serializable] public class ProblemDetails { public string Title { get; set; } diff --git a/src/Client.Common/ProblemException.cs b/src/Client.Common/ProblemException.cs index c3f1e0b08..6eb9145c1 100644 --- a/src/Client.Common/ProblemException.cs +++ b/src/Client.Common/ProblemException.cs @@ -16,12 +16,10 @@ */ using System; -using System.Runtime.Serialization; using Ardalis.GuardClauses; namespace Monai.Deploy.InformaticsGateway.Client.Common { - [Serializable] public class ProblemException : Exception { public ProblemDetails ProblemDetails { get; private set; } @@ -33,23 +31,6 @@ public ProblemException(ProblemDetails problemDetails) : base(problemDetails?.De ProblemDetails = problemDetails; } - protected ProblemException(SerializationInfo info, StreamingContext context) : base(info, context) - { - ProblemDetails = (ProblemDetails)info.GetValue(nameof(ProblemDetails), typeof(ProblemDetails)); - } - - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw new ArgumentNullException(nameof(info)); - } - - info.AddValue(nameof(ProblemDetails), ProblemDetails, typeof(ProblemDetails)); - - base.GetObjectData(info, context); - } - public override string Message => ToString(); public override string ToString() diff --git a/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj b/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj index ec3b39f41..6c356de41 100644 --- a/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj +++ b/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj @@ -13,36 +13,30 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test Apache-2.0 false true - - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + \ No newline at end of file diff --git a/src/Client.Common/Test/ProblemExceptionTest.cs b/src/Client.Common/Test/ProblemExceptionTest.cs deleted file mode 100644 index ab72e888e..000000000 --- a/src/Client.Common/Test/ProblemExceptionTest.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using Monai.Deploy.InformaticsGateway.Client.Common; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test -{ - public class ProblemExceptionTest - { - [Fact] - public void TestProblemExceptionSerialization() - { - var exception = new ProblemException(new ProblemDetails - { - Detail = "details", - Title = "title", - Status = 100 - }); - - var data = SerializeToBytes(exception); - var result = DeserializeFromBytes(data); - - Assert.Equal(exception.ProblemDetails.Detail, result.ProblemDetails.Detail); - Assert.Equal(exception.ProblemDetails.Title, result.ProblemDetails.Title); - Assert.Equal(exception.ProblemDetails.Status, result.ProblemDetails.Status); - Assert.Equal(exception.Message, result.Message); - } - - private static byte[] SerializeToBytes(T e) - { - using var stream = new MemoryStream(); -#pragma warning disable SYSLIB0011 // Type or member is obsolete - new BinaryFormatter().Serialize(stream, e); -#pragma warning restore SYSLIB0011 // Type or member is obsolete - return stream.GetBuffer(); - } - - private static T DeserializeFromBytes(byte[] bytes) - { - using var stream = new MemoryStream(bytes); -#pragma warning disable SYSLIB0011 // Type or member is obsolete - return (T)new BinaryFormatter().Deserialize(stream); -#pragma warning restore SYSLIB0011 // Type or member is obsolete - } - } -} diff --git a/src/Client.Common/Test/packages.lock.json b/src/Client.Common/Test/packages.lock.json index b602d8c07..7a4607c1e 100755 --- a/src/Client.Common/Test/packages.lock.json +++ b/src/Client.Common/Test/packages.lock.json @@ -1,12 +1,12 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Ardalis.GuardClauses": { "type": "Direct", - "requested": "[4.1.1, )", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "coverlet.collector": { "type": "Direct", @@ -16,19 +16,19 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } @@ -44,20 +44,20 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Castle.Core": { "type": "Transitive", @@ -69,8 +69,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -84,8 +84,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -93,10 +93,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -1015,30 +1015,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1046,17 +1043,17 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } } } diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json index c594120cc..e066f8661 100755 --- a/src/Client.Common/packages.lock.json +++ b/src/Client.Common/packages.lock.json @@ -1,12 +1,18 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Ardalis.GuardClauses": { "type": "Direct", - "requested": "[4.1.1, )", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" } } } diff --git a/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj b/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj index c908c6451..332a8ef69 100644 --- a/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj +++ b/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj @@ -13,34 +13,28 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Client Apache-2.0 ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset true false - - - - - + \ No newline at end of file diff --git a/src/Client/Test/HttpResponseMessageExtensionsTest.cs b/src/Client/Test/HttpResponseMessageExtensionsTest.cs index a4add5758..7fdc06114 100644 --- a/src/Client/Test/HttpResponseMessageExtensionsTest.cs +++ b/src/Client/Test/HttpResponseMessageExtensionsTest.cs @@ -35,7 +35,7 @@ public class HttpResponseMessageExtensionsTest public async Task SuccessStatusCode() { var message = new HttpResponseMessage(HttpStatusCode.OK); - var exception = await Record.ExceptionAsync(async () => await message.EnsureSuccessStatusCodeWithProblemDetails()).ConfigureAwait(false); + var exception = await Record.ExceptionAsync(async () => await message.EnsureSuccessStatusCodeWithProblemDetails()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(exception); } diff --git a/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj b/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj index f88b6068f..89fb35c13 100644 --- a/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj +++ b/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj @@ -13,42 +13,36 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Client.Test Apache-2.0 false true - - all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + - - - + \ No newline at end of file diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json old mode 100755 new mode 100644 index 2bbd6ee7a..caa8320da --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,65 +10,65 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AspNetCore.HealthChecks.MongoDb": { "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "0R3NVbsjMhS5fd2hGijzQNKJ0zQBv/qMC7nkpmnbtgribCj7vfNdAhSqv4lwbibffRWPW5A/7VNJMX4aPej0WQ==", + "resolved": "8.0.0", + "contentHash": "0YjJlCwkwulozPxFCRcJAl2CdjU5e5ekj4/BQsA6GZbzRxwtN3FIg7LJcWUUgMdwqDoe+6SKFBRnSRpfLY4owA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.2", - "MongoDB.Driver": "2.14.1" + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "MongoDB.Driver": "2.22.0" } }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -81,8 +81,8 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -94,27 +94,27 @@ }, "DotNext": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "5Xp6G9U0MhSmfgxKklUUsOFfSg2VqF+/rkd7WyoUs7HqbnVd32bRw2rWW5o+rieHLzUlW/sagctPiaZqmeTA+g==", + "resolved": "4.15.2", + "contentHash": "Q5l6yVmJh9ow2MjDPSMOAj1N9fZpuu1SFRLEEjL5shk5i80GU0PsqoNDKFsAI7ciePoAP6y8mkARpmmDzP4Xqw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "DotNext.Threading": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "G/AogSunqiZZ/0H4y3Qy/YNveIB+6azddStmFxbxLWkruXZ27gXyoRQ9kQ2gpDbq/+YfMINz9nmTY5ZtuCzuyw==", + "resolved": "4.15.2", + "contentHash": "bOOePY7XQTMtOQ+0cui3K9x44Q8CEpH/tXfXFHPBZjwFexa9SBevMGvHO6MINHC1QnKUP9nHZIIMQ3Jfr88aQQ==", "dependencies": { - "DotNext": "4.7.4", - "System.Threading.Channels": "6.0.0" + "DotNext": "4.15.2", + "System.Threading.Channels": "7.0.0" } }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -123,7 +123,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -132,26 +132,22 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" }, - "Microsoft.AspNet.WebApi.Client": { - "type": "Transitive", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "Transitive", - "resolved": "6.0.11", - "contentHash": "ivpWC8L84Y+l9VZOa0uJXPoUE+n3TiSRZpfKxMElRtLMYCeXmz5x3O7CuCJkZ65z1520RWuEZDmHefxiz5TqPg==", + "resolved": "8.0.0", + "contentHash": "rwxaZYHips5M9vqxRkGfJthTx+Ws4O4yCuefn17J371jL3ouC5Ker43h2hXb5yd9BMnImE9rznT75KJHm6bMgg==", "dependencies": { - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.10.0" + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.0.3" } }, "Microsoft.Bcl.AsyncInterfaces": { @@ -164,74 +160,135 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, - "Microsoft.CodeCoverage": { + "Microsoft.CodeAnalysis.Analyzers": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" }, - "Microsoft.CSharp": { + "Microsoft.CodeAnalysis.Common": { "type": "Transitive", "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" + } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Tools": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "zRdaXiiB1gEA0b+AJTd2+drh78gkEA4HyZ1vqNZrKq4xwW8WwavSiQsoeb1UsIMZkocLMBbhQYWClkZzuTKEgQ==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.EntityFrameworkCore.Design": "8.0.0" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -241,258 +298,270 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", + "resolved": "8.0.0", + "contentHash": "rtnltltUHm1nMEupZ9PNbs+b/8VXDZ/9Be8kxsaX3A00wqIQqNanfAG9xavu3CSCpkflF8M72py9oEdwbVaMZA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "cfPUWdjigLIRIJSKz3uaZxShgf86RVDXHC1VEEchj1gnY25akwPYpbrfSoIGDCqA9UmOMdlctq411+2pAViFow==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "0qjS31rN1MQTc46tAYbzmMTSRfdV5ndZxSjYxIGqKSidd4wpNJfNII/pdhU5Fx8olarQoKL9lqqYw4yNOIwT0Q==", + "resolved": "7.0.3", + "contentHash": "vxjHVZbMKD3rVdbvKhzAW+7UiFrYToUVm3AGmYfKSOAwyhdLl/ELX1KZr+FaLyyS5VReIzWRWJfbOuHM9i6ywg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "zbcwV6esnNzhZZ/VP87dji6VrUBLB5rxnZBkDMqNYpyG+nrBnBsbm4PUYLCBMUflHCM9EMLDG0rLnqqT+l0ldA==" + "resolved": "7.0.3", + "contentHash": "b6GbGO+2LOTBEccHhqoJsOsmemG4A/MY+8H0wK/ewRhiG+DCYwEnucog1cSArPIY55zcn+XdZl0YEiUHkpDISQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "7.0.3" + } }, "Microsoft.IdentityModel.Protocols": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "DFyXD0xylP+DknCT3hzJ7q/Q5qRNu0hO/gCU90O0ATdR0twZmlcuY9RNYaaDofXKVbzcShYNCFCGle2G/o8mkg==", + "resolved": "7.0.3", + "contentHash": "BtwR+tctBYhPNygyZmt1Rnw74GFrJteW+1zcdIgyvBCjkek6cNwPPqRfdhzCv61i+lwyNomRi8+iI4QKd4YCKA==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Logging": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "LVvMXAWPbPeEWTylDrxunlHH2wFyE4Mv0L4gZrJHC4HTESbWHquKZb/y/S8jgiQEDycOP0PDQvbG4RR/tr2TVQ==", + "resolved": "7.0.3", + "contentHash": "W97TraHApDNArLwpPcXfD+FZH7njJsfEwZE9y9BoofeXMS8H0LBBobz0VOmYmMK4mLdOKxzN7SFT3Ekg0FWI3Q==", "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.10.0", - "System.IdentityModel.Tokens.Jwt": "6.10.0" + "Microsoft.IdentityModel.Protocols": "7.0.3", + "System.IdentityModel.Tokens.Jwt": "7.0.3" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "qbf1NslutDB4oLrriYTJpy7oB1pbh2ej2lEHd2IPDQH9C74ysOdhU5wAC7KoXblldbo7YsNR2QYFOqQM/b0Rsg==", + "resolved": "7.0.3", + "contentHash": "wB+LlbDjhnJ98DULjmFepqf9eEMh/sDs6S6hFh68iNRHmwollwhxk+nbSSfpA5+j+FbRyNskoaY4JsY1iCOKCg==", "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.10.0", - "System.Security.Cryptography.Cng": "4.5.0" + "Microsoft.IdentityModel.Logging": "7.0.3" } }, "Microsoft.NETCore.Platforms": { @@ -512,8 +581,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -521,10 +590,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -549,83 +618,85 @@ }, "Minio": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "7tZj90WEuuH60RAP4wBYexjMuJOhCnK7I46hCiX3CtZPackHisLZ8aAJmn3KlwbUX22dBDphwemD+h37vet8Qw==", + "resolved": "6.0.1", + "contentHash": "uavo/zTpUzHLqnB0nyAk6E/2THLRPvZ59Md7IkLKXkAFiX//K2knVK2+dSHDNN2uAUqCvLqO+cM+s9VGBWbIKQ==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.1.0", + "CommunityToolkit.HighPerformance": "8.2.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", "System.IO.Hashing": "7.0.0", - "System.Reactive.Linq": "5.0.0" + "System.Reactive": "6.0.0" } }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Security": { "type": "Transitive", - "resolved": "0.1.3", - "contentHash": "9/E/UEK9Foo1cUHRRgNIR8uk+oTLiBbzR2vqBsxIo1EwbduDVuBGFcIh2lpAJZmFFwBNv0KtmTASdD3w5UWd+g==", + "resolved": "1.0.0", + "contentHash": "q0dQiOpOoHX4a3XkueqFRx51WOrQpW1Lwj7e4oqI6aOBeUlA9CPMdZ4+4BlemXc/1A5IClrPugp/owZ1NJ2Wxg==", "dependencies": { - "Ardalis.GuardClauses": "4.0.1", - "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.11", - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.3", - "Microsoft.Extensions.Logging.Configuration": "6.0.0" + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "8.0.0", + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Configuration": "8.0.0" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.MinIO": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "0sHLiT0qU2Fg5O+AF8UDqzsJEYztUAFZeOPh4kOLC4bckhb+wSsuv7VcAXWtR3BOY6TxaMVVUJ+EK/o5mCp3tQ==", + "resolved": "1.0.0", + "contentHash": "o6Lq9rshOJ3sxz4lIfl14Zn7+YXvXXg2Jpndtnnx4Ez1RDSTDu2Zf08lEgFHTmwAML1e4fsVVm16LaXv3h3L3A==", "dependencies": { - "Minio": "5.0.0", - "Monai.Deploy.Storage": "0.2.18", - "Monai.Deploy.Storage.S3Policy": "0.2.18" + "Minio": "6.0.1", + "Monai.Deploy.Storage": "1.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -633,29 +704,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -663,6 +734,14 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "NETStandard.Library": { "type": "Transitive", "resolved": "1.6.1", @@ -719,36 +798,27 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NLog.Extensions.Logging": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "rxUGUqhE3DlcKfKhPJOI0xOt8q2+NX0NkBY9lbRXwZEYQsh8ASFS8X7K+Y7/dcE8v0tpAe7GF8rPD5h4h9Hpsg==", + "resolved": "5.3.8", + "contentHash": "6VD0lyeokWltL6j8lO7mS7v7lbuO/qn0F7kdvhKhEx1JvFyD39nzohOK3JvkVh4Nn3mrcMDCyDxvTvmiW55jQg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "NLog": "5.2.4" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "NLog": "5.2.8" } }, "NLog.Web.AspNetCore": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "80FaN8CKu94E3mZqZ+r46nRyEYgnHMn4i3vPslbaINs8k+TqJClNFYw6uWLhPU4AN7PKi/jHHzpswqn7K8jgGg==", + "resolved": "5.3.8", + "contentHash": "Rt2OCulpAF6rSrZWZzPgHikAI8SDKkq3/52xA/uJ4JtmNjoizULN/IBYtYlZojbPbXiFm3uadOO2rOvvMhjXBQ==", "dependencies": { - "NLog.Extensions.Logging": "5.3.4" + "NLog.Extensions.Logging": "5.3.8" } }, "NuGet.Frameworks": { @@ -758,13 +828,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -889,32 +967,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Swashbuckle.AspNetCore": { @@ -962,6 +1040,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections": { "type": "Transitive", "resolved": "4.3.0", @@ -997,6 +1080,54 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Composition": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, "System.Console": { "type": "Transitive", "resolved": "4.3.0", @@ -1021,11 +1152,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -1088,11 +1216,11 @@ }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "C+Q5ORsFycRkRuvy/Xd0Pv5xVpmWSAvQYZAGs7VQogmkqlLhvfZXTgBIlHqC3cxkstSoLJAYx6xZB7foQ2y5eg==", + "resolved": "7.0.3", + "contentHash": "caEe+OpQNYNiyZb+DJpUVROXoVySWBahko2ooNfUcllxa9ZQUM8CgM/mDjP6AoFn6cQU9xMmG+jivXWub8cbGg==", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.JsonWebTokens": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "System.IO": { @@ -1109,8 +1237,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1178,6 +1310,11 @@ "resolved": "7.0.0", "contentHash": "sDnWM0N3AMCa86LrKTWeF3BZLD2sgWyYUc7HL6z4+xyDZNQRwzmxbo4qP2rX2MqC+Sy1/gOSRDah5ltxY5jPxw==" }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, "System.Linq": { "type": "Transitive", "resolved": "4.3.0", @@ -1190,14 +1327,6 @@ "System.Runtime.Extensions": "4.3.0" } }, - "System.Linq.Async": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, "System.Linq.Expressions": { "type": "Transitive", "resolved": "4.3.0", @@ -1298,17 +1427,8 @@ }, "System.Reactive": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" - }, - "System.Reactive.Linq": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "IB4/qlV4T1WhZvM11RVoFUSZXPow9VWVeQ1uDkSKgz6bAO+gCf65H/vjrYlwyXmojSSxvfHndF9qdH43P/IuAw==", - "dependencies": { - "System.Reactive": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } + "resolved": "6.0.0", + "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" }, "System.Reflection": { "type": "Transitive", @@ -1368,8 +1488,11 @@ }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } }, "System.Reflection.Primitives": { "type": "Transitive", @@ -1506,8 +1629,21 @@ }, "System.Security.Cryptography.Cng": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } }, "System.Security.Cryptography.Csp": { "type": "Transitive", @@ -1650,19 +1786,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Text.RegularExpressions": { @@ -1699,8 +1831,13 @@ }, "System.Threading.Tasks.Extensions": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } }, "System.Threading.Timer": { "type": "Transitive", @@ -1753,6 +1890,19 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1760,30 +1910,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1791,23 +1938,24 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { - "DotNext.Threading": "[4.7.4, )", + "DotNext.Threading": "[4.15.2, )", "HL7-dotnetcore": "[2.36.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -1816,10 +1964,10 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Security": "[0.1.3, )", - "Monai.Deploy.Storage.MinIO": "[0.2.18, )", - "NLog.Web.AspNetCore": "[5.3.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Security": "[1.0.0, )", + "Monai.Deploy.Storage.MinIO": "[1.0.0, )", + "NLog.Web.AspNetCore": "[5.3.8, )", "Swashbuckle.AspNetCore": "[6.5.0, )" } }, @@ -1828,12 +1976,12 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client": { @@ -1846,14 +1994,14 @@ "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -1866,9 +2014,10 @@ "monai.deploy.informaticsgateway.database": { "type": "Project", "dependencies": { - "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "AspNetCore.HealthChecks.MongoDb": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Tools": "[8.0.0, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", @@ -1881,55 +2030,55 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.dicomweb.client": { "type": "Project", "dependencies": { - "Microsoft.AspNet.WebApi.Client": "[5.2.9, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )", - "System.Linq.Async": "[6.0.1, )", - "fo-dicom": "[5.1.1, )" + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration": "[6.0.1, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Relational": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.4, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "NLog": "[5.2.8, )", + "Polly": "[8.2.1, )" } } } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json old mode 100755 new mode 100644 index 2a3e704e0..c63fe30fe --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -1,36 +1,36 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -39,7 +39,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -65,15 +65,15 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -87,41 +87,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -138,64 +150,64 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -206,13 +218,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -225,16 +245,17 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.Memory": { "type": "Transitive", @@ -264,8 +285,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -276,30 +297,43 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj b/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj index e678bb9cc..0936a546a 100644 --- a/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj +++ b/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj @@ -13,13 +13,10 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - Monai.Deploy.InformaticsGateway.Common - net6.0 + net8.0 Apache-2.0 true True @@ -27,24 +24,19 @@ true false - - - + + - - - - - + \ No newline at end of file diff --git a/src/Common/Test/ExtensionMethodsTest.cs b/src/Common/Test/ExtensionMethodsTest.cs index 9158fb2d5..1d211b2b5 100644 --- a/src/Common/Test/ExtensionMethodsTest.cs +++ b/src/Common/Test/ExtensionMethodsTest.cs @@ -90,7 +90,7 @@ public async Task GivenAnActionBlock_WhenPostWIithDelayIsCalled_ExpectADelayBefo }); stopwatch.Start(); - await actionBlock.Post(input, delay).ConfigureAwait(false); + await actionBlock.Post(input, delay).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } } } diff --git a/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj b/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj index 5ed90fe6e..ac3ffc861 100644 --- a/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj +++ b/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj @@ -13,35 +13,30 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Common.Test Apache-2.0 false true - all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/src/Common/Test/packages.lock.json b/src/Common/Test/packages.lock.json index 09e8a6f51..f577a0643 100755 --- a/src/Common/Test/packages.lock.json +++ b/src/Common/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,59 +10,63 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "System.IO.Abstractions": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Abstractions.TestingHelpers": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Dp6gPoqJ7i8dRGubfxzA219fFCtkam9BgSmuIT+fQcFPKkW6vx9PuLTSELsNq+gRoEAzxGbWjsT/3WslfcmRfg==", "dependencies": { - "System.IO.Abstractions": "17.2.3" + "TestableIO.System.IO.Abstractions.TestingHelpers": "20.0.4" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "Castle.Core": { "type": "Transitive", @@ -74,8 +78,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -89,8 +93,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -98,10 +102,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -1013,6 +1017,28 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "O8YeM+jsunyWt4ch93QnvWmMN/uguU0uX2VvDEvlltOxxHfCOuy0jG9m9p/lys52orlbpRa/Rl6mMXwoK2tdcA==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1020,30 +1046,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1051,18 +1074,18 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json index 7b6964bf5..3c3551297 100755 --- a/src/Common/packages.lock.json +++ b/src/Common/packages.lock.json @@ -1,18 +1,41 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Ardalis.GuardClauses": { "type": "Direct", - "requested": "[4.1.1, )", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" }, "System.IO.Abstractions": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } } } } diff --git a/src/Configuration/ConfigurationException.cs b/src/Configuration/ConfigurationException.cs index a40a9a9d8..673dca6f1 100644 --- a/src/Configuration/ConfigurationException.cs +++ b/src/Configuration/ConfigurationException.cs @@ -16,14 +16,13 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Configuration { /// - /// Represnets an exception based upon invalid configuration. + /// Represents an exception based upon invalid configuration. /// - [Serializable] + public class ConfigurationException : Exception { public ConfigurationException() @@ -37,9 +36,5 @@ public ConfigurationException(string message) : base(message) public ConfigurationException(string message, Exception innerException) : base(message, innerException) { } - - protected ConfigurationException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj b/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj index c3a9adbd4..d9b543b51 100644 --- a/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj +++ b/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj @@ -13,35 +13,29 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Configuration - net6.0 + net8.0 Apache-2.0 true ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset true false - - - - - + \ No newline at end of file diff --git a/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj b/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj index 4c623b194..2af1fdd49 100644 --- a/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj +++ b/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj @@ -13,40 +13,33 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Configuration.Test Apache-2.0 false true - - all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 02e67b1eb..6fc0fc65b 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,65 +10,65 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "System.IO.Abstractions.TestingHelpers": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Dp6gPoqJ7i8dRGubfxzA219fFCtkam9BgSmuIT+fQcFPKkW6vx9PuLTSELsNq+gRoEAzxGbWjsT/3WslfcmRfg==", "dependencies": { - "System.IO.Abstractions": "17.2.3" + "TestableIO.System.IO.Abstractions.TestingHelpers": "20.0.4" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -81,15 +81,15 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -98,7 +98,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -124,20 +124,20 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -151,41 +151,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -202,25 +214,25 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -234,8 +246,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -243,10 +255,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -262,42 +274,42 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -364,13 +376,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -547,11 +567,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -626,8 +643,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1147,8 +1168,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -1247,6 +1268,28 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "O8YeM+jsunyWt4ch93QnvWmMN/uguU0uX2VvDEvlltOxxHfCOuy0jG9m9p/lys52orlbpRa/Rl6mMXwoK2tdcA==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1254,30 +1297,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1285,11 +1325,11 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.api": { @@ -1297,19 +1337,19 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json old mode 100755 new mode 100644 index 2b5691080..9aef01cb9 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -1,36 +1,42 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -39,7 +45,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -65,15 +71,15 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -87,41 +93,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -138,64 +156,64 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -206,13 +224,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -225,16 +251,17 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.Memory": { "type": "Transitive", @@ -264,8 +291,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -276,24 +303,37 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } } } diff --git a/src/Database/Api/DatabaseException.cs b/src/Database/Api/DatabaseException.cs index 9191a0768..fd61379ba 100644 --- a/src/Database/Api/DatabaseException.cs +++ b/src/Database/Api/DatabaseException.cs @@ -14,11 +14,8 @@ * limitations under the License. */ -using System.Runtime.Serialization; - namespace Monai.Deploy.InformaticsGateway.Database.Api { - [Serializable] public class DatabaseException : Exception { public DatabaseException() @@ -32,9 +29,5 @@ public DatabaseException(string? message) : base(message) public DatabaseException(string? message, Exception? innerException) : base(message, innerException) { } - - protected DatabaseException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj index 0231a11ef..6738d3dfe 100644 --- a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj +++ b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj @@ -13,35 +13,28 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Database.Api - net6.0 + net8.0 enable enable true false - - - - + - - - + \ No newline at end of file diff --git a/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj b/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj index b06925d48..dcee098c5 100644 --- a/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj +++ b/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj @@ -13,21 +13,18 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 enable enable false true - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -36,10 +33,8 @@ all - - - + \ No newline at end of file diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index 65aff269f..c5dc274b1 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,60 +10,60 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -72,7 +72,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -98,20 +98,20 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -125,41 +125,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -176,25 +188,25 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -208,8 +220,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -217,10 +229,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -236,42 +248,42 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -333,8 +345,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -343,13 +355,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -526,11 +546,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.Tools": { "type": "Transitive", @@ -600,8 +617,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1121,8 +1142,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -1221,6 +1242,19 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1228,30 +1262,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1259,11 +1290,11 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.api": { @@ -1271,19 +1302,19 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -1298,7 +1329,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } } } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json old mode 100755 new mode 100644 index 53e07aa40..b607ea4df --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -1,42 +1,42 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "NLog": { "type": "Direct", - "requested": "[5.2.4, )", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "requested": "[5.2.8, )", + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -45,7 +45,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -71,15 +71,15 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -93,41 +93,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -144,64 +156,64 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, @@ -212,13 +224,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -231,16 +251,17 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.Memory": { "type": "Transitive", @@ -270,8 +291,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -282,24 +303,37 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index cb40c9a0d..e04199c0d 100755 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -47,7 +47,7 @@ public static IHealthChecksBuilder AddDatabaseHealthCheck(this IHealthChecksBuil throw new ConfigurationException("No database connections found in configuration section 'ConnectionStrings'."); } - var databaseType = connectionStringConfigurationSection["Type"].ToLowerInvariant(); + var databaseType = connectionStringConfigurationSection!["Type"]!.ToLowerInvariant(); switch (databaseType) { @@ -56,7 +56,7 @@ public static IHealthChecksBuilder AddDatabaseHealthCheck(this IHealthChecksBuil return healthChecksBuilder; case DbType_MongoDb: - healthChecksBuilder.AddMongoDb(mongodbConnectionString: connectionStringConfigurationSection[SR.DatabaseConnectionStringKey], mongoDatabaseName: connectionStringConfigurationSection[SR.DatabaseNameKey], name: "MongoDB"); + healthChecksBuilder.AddMongoDb(mongodbConnectionString: connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]!, mongoDatabaseName: connectionStringConfigurationSection[SR.DatabaseNameKey]!, name: "MongoDB"); return healthChecksBuilder; default: @@ -75,7 +75,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi throw new ConfigurationException("No database connections found in configuration section 'ConnectionStrings'."); } services.Configure(connectionStringConfigurationSection.GetSection("DatabaseOptions")); - var databaseType = connectionStringConfigurationSection["Type"].ToLowerInvariant(); + var databaseType = connectionStringConfigurationSection["Type"]!.ToLowerInvariant(); switch (databaseType) { case DbType_Sqlite: diff --git a/src/Database/EntityFramework/Migrations/20230824185313_R4_0.4.0.cs b/src/Database/EntityFramework/Migrations/20230824185313_R4_0.4.0.cs index fd7fe88f6..d1fec3502 100644 --- a/src/Database/EntityFramework/Migrations/20230824185313_R4_0.4.0.cs +++ b/src/Database/EntityFramework/Migrations/20230824185313_R4_0.4.0.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable diff --git a/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs index 182e05f68..d46799cd3 100755 --- a/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs +++ b/src/Database/EntityFramework/Migrations/20231120161347_202311201611.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable diff --git a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj index d9ad95499..7f83b1ba8 100755 --- a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj +++ b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj @@ -13,12 +13,10 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Database.EntityFramework - net6.0 + net8.0 Apache-2.0 enable ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset @@ -26,36 +24,28 @@ true false - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - + + + + + + - - + \ No newline at end of file diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs index 0d5d923d6..77ad38dd4 100755 --- a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -65,8 +65,8 @@ public async Task GivenADestinationApplicationEntity_WhenAddingToDatabase_Expect var aet = new DestinationApplicationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -80,15 +80,15 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -97,14 +97,14 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("1.2.3.4", actual!.HostIp); Assert.Equal(114, actual!.Port); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -113,13 +113,13 @@ public async Task GivenADestinationApplicationEntity_WhenRemoveIsCalled_ExpectIt { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -128,8 +128,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } @@ -139,17 +139,17 @@ public async Task GivenADestinationApplicationEntity_WhenUpdatedIsCalled_ExpectI { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; expected!.Port = 1000; expected!.HostIp = "loalhost"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); Assert.Equal(expected.HostIp, dbResult!.HostIp); diff --git a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs index d0acc3330..a8c90d367 100755 --- a/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DicomAssociationInfoRepositoryTest.cs @@ -74,7 +74,7 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenGetAllAsy .Skip(0) .Take(1) .ToList(); - var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(false); + var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected, actual); @@ -93,8 +93,8 @@ public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSa association.Disconnect(); var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(association).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Id.Equals(association.Id)).ConfigureAwait(false); + await store.AddAsync(association).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Id.Equals(association.Id)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(association.DateTimeCreated, actual!.DateTimeCreated); @@ -112,8 +112,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC { var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } diff --git a/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs b/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs index 77d991e3c..b051f17b0 100755 --- a/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/ExternalAppDetailsRepositoryTest.cs @@ -68,7 +68,7 @@ public async Task GivenDestinationExternalAppInTheDatabase_WhenGetAsyncCalled_Ex var expected = _databaseFixture.DatabaseContext.Set() .Where(t => t.StudyInstanceUid == "1"); - var actual = await store.GetAsync("1").ConfigureAwait(false); + var actual = await store.GetAsync("1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected, actual); @@ -84,7 +84,7 @@ public async Task GivenDestinationExternalAppInTheDatabase_WhenGetAsyncCalled_Ex var expected = _databaseFixture.DatabaseContext.Set() .Where(t => t.PatientIdOutBound == "2") .Take(1).First(); - var actual = await store.GetByPatientIdOutboundAsync("2", new CancellationToken()).ConfigureAwait(false); + var actual = await store.GetByPatientIdOutboundAsync("2", new CancellationToken()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected, actual); @@ -103,8 +103,8 @@ public async Task GivenDestinationExternalAppInTheDatabase_WhenAddingToDatabase_ }; var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(association).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.StudyInstanceUid.Equals(association.StudyInstanceUid)).ConfigureAwait(false); + await store.AddAsync(association).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.StudyInstanceUid.Equals(association.StudyInstanceUid)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(association.DateTimeCreated, actual!.DateTimeCreated); diff --git a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs index 1f24a40f8..6a43a14b9 100644 --- a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs @@ -65,8 +65,8 @@ public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSa var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -80,15 +80,15 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -97,14 +97,14 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("1.2.3.4", actual!.HostIp); Assert.Equal(114, actual!.Port); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -113,13 +113,13 @@ public async Task GivenAHL7DestinationEntity_WhenRemoveIsCalled_ExpectItToDelete { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -128,8 +128,8 @@ public async Task GivenHL7DestinationEntitiesInTheDatabase_WhenToListIsCalled_Ex { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } @@ -139,17 +139,17 @@ public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; expected!.Port = 1000; expected!.HostIp = "loalhost"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); Assert.Equal(expected.HostIp, dbResult!.HostIp); diff --git a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs index f87b372d7..154c0b9c4 100755 --- a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs @@ -64,8 +64,8 @@ public async Task GivenAnInferenceRequest_WhenAddingToDatabase_ExpectItToBeSaved var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.InferenceRequestId.Equals(inferenceRequest.InferenceRequestId)).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.InferenceRequestId.Equals(inferenceRequest.InferenceRequestId)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(inferenceRequest.InferenceRequestId, actual!.InferenceRequestId); @@ -85,10 +85,10 @@ public async Task GivenAFailedInferenceRequstThatExceededRetries_WhenUpdateIsCal }; var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(InferenceRequestState.Completed, result!.State); Assert.Equal(InferenceRequestStatus.Fail, result!.Status); @@ -104,10 +104,10 @@ public async Task GivenAFailedInferenceRequst_WhenUpdateIsCalled_ShallRetryLater }; var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(InferenceRequestState.Queued, result!.State); Assert.Equal(InferenceRequestStatus.Unknown, result!.Status); @@ -124,10 +124,10 @@ public async Task GivenASuccessfulInferenceRequest_WhenUpdateIsCalled_ShallMarkA var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Success).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Success).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(InferenceRequestState.Completed, result!.State); Assert.Equal(InferenceRequestStatus.Success, result!.Status); @@ -138,17 +138,17 @@ public async Task GivenAQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnFirs { var set = _databaseFixture.DatabaseContext.Set(); set.RemoveRange(set.ToList()); - await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(false); + await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var inferenceRequestInProcess = CreateInferenceRequest(InferenceRequestState.InProcess); var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); var inferenceRequestQueued = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); - await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); - await store.AddAsync(inferenceRequestQueued).ConfigureAwait(false); + await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequestQueued).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var actual = await store.TakeAsync().ConfigureAwait(false); + var actual = await store.TakeAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(inferenceRequestQueued.InferenceRequestId, actual!.InferenceRequestId); Assert.Equal(InferenceRequestState.InProcess, actual!.State); @@ -167,11 +167,11 @@ public async Task GivenNoQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnNot var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); - await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); + await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); cancellationTokenSource.CancelAfter(500); - await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(false)).ConfigureAwait(false); + await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } [Fact] @@ -182,27 +182,27 @@ public async Task GivenInferenceRequests_WhenGetInferenceRequestIsCalled_ShallRe var inferenceRequest3 = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest1).ConfigureAwait(false); - await store.AddAsync(inferenceRequest2).ConfigureAwait(false); - await store.AddAsync(inferenceRequest3).ConfigureAwait(false); + await store.AddAsync(inferenceRequest1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequest2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequest3).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetInferenceRequestAsync(inferenceRequest1.TransactionId).ConfigureAwait(false); + var result = await store.GetInferenceRequestAsync(inferenceRequest1.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest1.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest2.TransactionId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest2.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest2.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest3.TransactionId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest3.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest3.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest1.InferenceRequestId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest1.InferenceRequestId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest1.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest2.InferenceRequestId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest2.InferenceRequestId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest2.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest3.InferenceRequestId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest3.InferenceRequestId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest3.TransactionId, result!.TransactionId); } @@ -213,12 +213,12 @@ public async Task GivenInferenceRequests_WhenExistsCalled_ShallReturnCorrectValu var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.ExistsAsync(inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await store.ExistsAsync(inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ExistsAsync("random").ConfigureAwait(false); + result = await store.ExistsAsync("random").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -228,9 +228,9 @@ public async Task GivenAMatchingInferenceRequest_WhenGetStatusCalled_ShallReturn var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest.TransactionId, result!.TransactionId); @@ -242,9 +242,9 @@ public async Task GivenNoMatchingInferenceRequest_WhenGetStatusCalled_ShallRetur var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetStatusAsync("bogus").ConfigureAwait(false); + var result = await store.GetStatusAsync("bogus").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(result); } diff --git a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj index abff60683..e4685bff8 100755 --- a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj +++ b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj @@ -13,23 +13,19 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 enable enable false true - - - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -37,10 +33,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + - - - + \ No newline at end of file diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs index 2c6a7558a..02f518a58 100755 --- a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -75,8 +75,8 @@ public async Task GivenAMonaiApplicationEntity_WhenAddingToDatabase_ExpectItToBe }; var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -93,13 +93,13 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -108,12 +108,12 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -122,13 +122,13 @@ public async Task GivenAMonaiApplicationEntity_WhenRemoveIsCalled_ExpectItToDele { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -137,8 +137,8 @@ public async Task GivenMonaiApplicationEntitiesInTheDatabase_WhenToListIsCalled_ { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } @@ -148,15 +148,15 @@ public async Task GivenAMonaiApplicationEntity_WhenUpdatedIsCalled_ExpectItToSav { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); } diff --git a/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs b/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs index 89ac81d42..6fd5013e1 100755 --- a/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/PayloadRepositoryTest.cs @@ -69,8 +69,8 @@ public async Task GivenAPayload_WhenAddingToDatabase_ExpectItToBeSaved() payload.State = Payload.PayloadState.Move; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(payload).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.PayloadId == payload.PayloadId).ConfigureAwait(false); + await store.AddAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.PayloadId == payload.PayloadId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(payload.Key, actual!.Key); @@ -99,12 +99,12 @@ public async Task GivenAPayload_WhenRemoveIsCalled_ExpectItToDeleted() payload.State = Payload.PayloadState.Move; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var added = await store.AddAsync(payload).ConfigureAwait(false); + var added = await store.AddAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var removed = await store.RemoveAsync(added!).ConfigureAwait(false); + var removed = await store.RemoveAsync(added!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(removed, added); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.PayloadId == payload.PayloadId).ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.PayloadId == payload.PayloadId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -113,8 +113,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC { var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } @@ -126,14 +126,14 @@ public async Task GivenAPayload_WhenUpdateIsCalled_ExpectItToSaved() payload.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.DIMSE, "calling", "called")); var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var added = await store.AddAsync(payload).ConfigureAwait(false); + var added = await store.AddAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); added.State = Payload.PayloadState.Notify; added.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.ACR, "calling1", "called1")); - var updated = await store.UpdateAsync(payload).ConfigureAwait(false); + var updated = await store.UpdateAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(updated); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.PayloadId == payload.PayloadId).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.PayloadId == payload.PayloadId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(updated.Key, actual!.Key); @@ -160,7 +160,7 @@ public async Task GivenPayloadsInDifferentStates_WhenRemovePendingPayloadsAsyncI { var set = _databaseFixture.DatabaseContext.Set(); set.RemoveRange(set.ToList()); - await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(false); + await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var payload1 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Created }; var payload2 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Created }; @@ -169,16 +169,16 @@ public async Task GivenPayloadsInDifferentStates_WhenRemovePendingPayloadsAsyncI var payload5 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - _ = await store.AddAsync(payload1).ConfigureAwait(false); - _ = await store.AddAsync(payload2).ConfigureAwait(false); - _ = await store.AddAsync(payload3).ConfigureAwait(false); - _ = await store.AddAsync(payload4).ConfigureAwait(false); - _ = await store.AddAsync(payload5).ConfigureAwait(false); + _ = await store.AddAsync(payload1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload3).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload4).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload5).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.RemovePendingPayloadsAsync().ConfigureAwait(false); + var result = await store.RemovePendingPayloadsAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(2, result); - var actual = await set.ToListAsync().ConfigureAwait(false); + var actual = await set.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(3, actual.Count); foreach (var payload in actual) @@ -192,7 +192,7 @@ public async Task GivenPayloadsInDifferentStates_WhenGetPayloadsInStateAsyncIsCa { var set = _databaseFixture.DatabaseContext.Set(); set.RemoveRange(set.ToList()); - await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(false); + await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var payload1 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Created }; var payload2 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Created }; @@ -201,22 +201,22 @@ public async Task GivenPayloadsInDifferentStates_WhenGetPayloadsInStateAsyncIsCa var payload5 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - _ = await store.AddAsync(payload1).ConfigureAwait(false); - _ = await store.AddAsync(payload2).ConfigureAwait(false); - _ = await store.AddAsync(payload3).ConfigureAwait(false); - _ = await store.AddAsync(payload4).ConfigureAwait(false); - _ = await store.AddAsync(payload5).ConfigureAwait(false); + _ = await store.AddAsync(payload1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload3).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload4).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload5).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Move).ConfigureAwait(false); + var result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Move).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Single(result); - result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Created).ConfigureAwait(false); + result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Created).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(2, result.Count); - result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify).ConfigureAwait(false); + result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(2, result.Count); - result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify, Payload.PayloadState.Created).ConfigureAwait(false); + result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify, Payload.PayloadState.Created).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(4, result.Count); } } diff --git a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs index cf4917eb3..afce0b168 100755 --- a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs @@ -70,8 +70,8 @@ public async Task GivenASourceApplicationEntity_WhenAddingToDatabase_ExpectItToB }; var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -84,13 +84,13 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -99,12 +99,12 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -113,12 +113,12 @@ public async Task GivenAAETitleName_WhenFindByAETAsyncIsCalled_ExpectItToReturnM { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByAETAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByAETAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual.FirstOrDefault()!.AeTitle); Assert.Equal("AET1", actual.FirstOrDefault()!.Name); - actual = await store.FindByAETAsync("AET6").ConfigureAwait(false); + actual = await store.FindByAETAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Empty(actual); } @@ -128,13 +128,13 @@ public async Task GivenASourceApplicationEntity_WhenRemoveIsCalled_ExpectItToDel { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -143,8 +143,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } @@ -154,15 +154,15 @@ public async Task GivenASourceApplicationEntity_WhenUpdatedIsCalled_ExpectItToSa { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); } diff --git a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs index 1974a5824..405c4d7b6 100755 --- a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs @@ -77,8 +77,8 @@ public async Task GivenADicomStorageMetadataObject_WhenAddingToDatabase_ExpectIt var metadata = CreateMetadataObject(); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(metadata).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity.Equals(metadata.Id)).ConfigureAwait(false); + await store.AddAsync(metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity.Equals(metadata.Id)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(metadata.CorrelationId, actual!.CorrelationId); @@ -95,8 +95,8 @@ public async Task GivenANonExistedDicomStorageMetadataObject_WhenSavedToDatabase var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddOrUpdateAsync(metadata1).ConfigureAwait(false); - await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata2).ConfigureAwait(false)).ConfigureAwait(false); + await store.AddOrUpdateAsync(metadata1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } [Fact] @@ -105,13 +105,13 @@ public async Task GivenAnExistingDicomStorageMetadataObject_WhenUpdated_ExpectIt var metadata = CreateMetadataObject(); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(metadata).ConfigureAwait(false); + await store.AddAsync(metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); metadata.SetWorkflows("A", "B", "C"); metadata.File.SetUploaded("bucket"); - await store.AddOrUpdateAsync(metadata).ConfigureAwait(false); + await store.AddOrUpdateAsync(metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity.Equals(metadata.Id)).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity.Equals(metadata.Id)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(metadata.CorrelationId, actual!.CorrelationId); @@ -154,10 +154,10 @@ public async Task GivenACorrelationId_WhenGetFileStorageMetdadataIsCalled_Expect foreach (var item in list) { - await store.AddOrUpdateAsync(item).ConfigureAwait(false); + await store.AddOrUpdateAsync(item).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } - var results = await store.GetFileStorageMetdadataAsync(correlationId.ToString()).ConfigureAwait(false); + var results = await store.GetFileStorageMetdadataAsync(correlationId.ToString()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(3, results.Count); @@ -183,9 +183,9 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenGetFileStorageMetadadataI "called"); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddOrUpdateAsync(expected).ConfigureAwait(false); + await store.AddOrUpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var match = await store.GetFileStorageMetdadataAsync(correlationId, identifier).ConfigureAwait(false); + var match = await store.GetFileStorageMetdadataAsync(correlationId, identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(match); Assert.Equal(expected.Id, match!.Id); @@ -208,11 +208,11 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalled_Expec "called"); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(expected).ConfigureAwait(false); - var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); + await store.AddAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - var stored = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity == identifier).ConfigureAwait(false); + var stored = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity == identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(stored); } @@ -224,12 +224,12 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalledWithou var pending = CreateMetadataObject(); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(pending).ConfigureAwait(false); + await store.AddAsync(pending).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); + var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); - var stored = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity == pending.Id).ConfigureAwait(false); + var stored = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity == pending.Id).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(stored); } @@ -244,12 +244,12 @@ public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_E uploaded.JsonFile.SetUploaded("bucket"); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(pending).ConfigureAwait(false); - await store.AddAsync(uploaded).ConfigureAwait(false); + await store.AddAsync(pending).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(uploaded).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - await store.DeletePendingUploadsAsync().ConfigureAwait(false); + await store.DeletePendingUploadsAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + var result = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Single(result); Assert.Equal(uploaded.Id, result[0].Identity); } diff --git a/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs index 4b5e0bab8..7e2f5f9c7 100755 --- a/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/VirtualApplicationEntityRepositoryTest.cs @@ -71,8 +71,8 @@ public async Task GivenAVirtualApplicationEntity_WhenAddingToDatabase_ExpectItTo }; var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.VirtualAeTitle, actual!.VirtualAeTitle); @@ -86,13 +86,13 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.VirtualAeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.VirtualAeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.VirtualAeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.VirtualAeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -101,12 +101,12 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.VirtualAeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -115,12 +115,12 @@ public async Task GivenAAETitleName_WhenFindByAeTitleAsyncIsCalled_ExpectItToRet { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByAeTitleAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByAeTitleAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.VirtualAeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByAeTitleAsync("AET6").ConfigureAwait(false); + actual = await store.FindByAeTitleAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -129,13 +129,13 @@ public async Task GivenAVirtualApplicationEntity_WhenRemoveIsCalled_ExpectItToDe { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByAeTitleAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByAeTitleAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -144,8 +144,8 @@ public async Task GivenVirtualApplicationEntitiesInTheDatabase_WhenToListIsCalle { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); } @@ -155,15 +155,15 @@ public async Task GivenAVirtualApplicationEntity_WhenUpdatedIsCalled_ExpectItToS { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByAeTitleAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByAeTitleAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.VirtualAeTitle = "AET100"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByAeTitleAsync("AET100").ConfigureAwait(false); + var dbResult = await store.FindByAeTitleAsync("AET100").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.VirtualAeTitle, dbResult!.VirtualAeTitle); } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json old mode 100755 new mode 100644 index 95ac88e42..077ca41d7 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,65 +10,65 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "/pT9FOO0BxGSRscK/ekEb6TdiP3+nnyhPLElE1yuVG/QaZLaBAuM3RoywBHdIxWoFALaOS7ktXlKzuMX3khJ4A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25" + "Microsoft.EntityFrameworkCore": "8.0.0" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -81,15 +81,15 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -98,7 +98,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -107,6 +107,11 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -122,240 +127,304 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" + } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -369,8 +438,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -378,10 +447,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -397,45 +466,53 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "NETStandard.Library": { "type": "Transitive", "resolved": "1.6.1", @@ -494,8 +571,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -504,13 +581,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -625,32 +710,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "System.AppContext": { @@ -666,6 +751,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections": { "type": "Transitive", "resolved": "4.3.0", @@ -701,6 +791,54 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Composition": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, "System.Console": { "type": "Transitive", "resolved": "4.3.0", @@ -725,11 +863,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -804,8 +939,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -868,6 +1007,11 @@ "System.Runtime": "4.3.0" } }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, "System.Linq": { "type": "Transitive", "resolved": "4.3.0", @@ -1036,8 +1180,11 @@ }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } }, "System.Reflection.Primitives": { "type": "Transitive", @@ -1317,19 +1464,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Text.RegularExpressions": { @@ -1425,6 +1568,19 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1432,30 +1588,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1463,11 +1616,11 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.api": { @@ -1475,19 +1628,19 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -1502,20 +1655,21 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Polly": "[8.2.1, )" } } } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 91f7b6eac..11432aa9c 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -1,103 +1,106 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", "dependencies": { - "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -106,7 +109,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -117,8 +120,8 @@ }, "Humanizer.Core": { "type": "Transitive", - "resolved": "2.8.26", - "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, "Macross.Json.Extensions": { "type": "Transitive", @@ -135,230 +138,293 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", @@ -366,13 +432,18 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -380,32 +451,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "System.Buffers": { @@ -413,6 +484,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections.Immutable": { "type": "Transitive", "resolved": "6.0.0", @@ -421,24 +497,86 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Diagnostics.DiagnosticSource": { + "System.Composition": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" } }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" + }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -454,19 +592,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.Channels": { @@ -474,24 +608,37 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -506,7 +653,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } } } diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index bf29f1d77..334a995ec 100755 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -13,19 +13,16 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Database - net6.0 + net8.0 Apache-2.0 ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset true enable false - @@ -33,46 +30,36 @@ - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - + + + + - + \ No newline at end of file diff --git a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs index 522e19023..67ee24c0b 100755 --- a/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DestinationApplicationEntityRepositoryTest.cs @@ -67,10 +67,10 @@ public async Task GivenADestinationApplicationEntity_WhenAddingToDatabase_Expect var aet = new DestinationApplicationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - await store.AddAsync(aet).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(DestinationApplicationEntity)); - var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -84,15 +84,15 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -101,14 +101,14 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("1.2.3.4", actual!.HostIp); Assert.Equal(114, actual!.Port); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -117,14 +117,14 @@ public async Task GivenADestinationApplicationEntity_WhenRemoveIsCalled_ExpectIt { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); var collection = _databaseFixture.Database.GetCollection(nameof(DestinationApplicationEntity)); - var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -134,8 +134,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); var collection = _databaseFixture.Database.GetCollection(nameof(DestinationApplicationEntity)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); } @@ -145,17 +145,17 @@ public async Task GivenADestinationApplicationEntity_WhenUpdatedIsCalled_ExpectI { var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; expected!.Port = 1000; expected!.HostIp = "loalhost"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); Assert.Equal(expected.HostIp, dbResult!.HostIp); diff --git a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs index 919693090..f57d27728 100755 --- a/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/DicomAssociationInfoRepositoryTest.cs @@ -73,10 +73,10 @@ public async Task GivenADicomAssociationInfo_WhenAddingToDatabase_ExpectItToBeSa association.Disconnect(); var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(association).ConfigureAwait(false); + await store.AddAsync(association).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(DicomAssociationInfo)); - var actual = await collection.Find(p => p.Id == association.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Id == association.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(association.FileCount, actual!.FileCount); @@ -101,8 +101,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenGetAllAsy var filter = builder.Empty; filter &= builder.Where(t => t.DateTimeDisconnected >= startTime.ToUniversalTime()); filter &= builder.Where(t => t.DateTimeDisconnected <= endTime.ToUniversalTime()); - var expected = await collection.Find(filter).ToListAsync().ConfigureAwait(false); - var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(false); + var expected = await collection.Find(filter).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.GetAllAsync(0, 1, startTime, endTime, default).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().NotBeNull(); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); @@ -114,8 +114,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC var store = new DicomAssociationInfoRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(DicomAssociationInfo)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); } diff --git a/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs index e2755cfce..5cfb34995 100755 --- a/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/ExternalAppDetailsRepositoryTest.cs @@ -69,8 +69,8 @@ public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetAsyncCalle var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); - var expected = (await collection.FindAsync(e => e.StudyInstanceUid == "2").ConfigureAwait(false)).First(); - var actual = (await store.GetAsync("2", new CancellationToken()).ConfigureAwait(false)).FirstOrDefault(); + var expected = (await collection.FindAsync(e => e.StudyInstanceUid == "2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).First(); + var actual = (await store.GetAsync("2", new CancellationToken()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).FirstOrDefault(); actual.Should().NotBeNull(); Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); @@ -85,10 +85,10 @@ public async Task GivenAExternalAppDetails_WhenAddingToDatabase_ExpectItToBeSave var app = new ExternalAppDetails { StudyInstanceUid = "3", ExportTaskID = "ExportTaskID3", CorrelationId = "CorrelationId3", WorkflowInstanceId = "WorkflowInstanceId3" }; var store = new ExternalAppDetailsRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(app, new CancellationToken()).ConfigureAwait(false); + await store.AddAsync(app, new CancellationToken()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); - var actual = await collection.Find(p => p.Id == app.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Id == app.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(app.StudyInstanceUid, actual!.StudyInstanceUid); @@ -106,8 +106,8 @@ public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetPatientOut var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); - var expected = (await collection.FindAsync(e => e.PatientIdOutBound == "pat1out1").ConfigureAwait(false)).First(); - var actual = (await store.GetByPatientIdOutboundAsync("pat1out1", new CancellationToken()).ConfigureAwait(false)); + var expected = (await collection.FindAsync(e => e.PatientIdOutBound == "pat1out1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).First(); + var actual = (await store.GetByPatientIdOutboundAsync("pat1out1", new CancellationToken()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); actual.Should().NotBeNull(); Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); @@ -123,8 +123,8 @@ public async Task GivenExternalAppDetailsEntitiesInTheDatabase_WhenGetStudyIdOut var collection = _databaseFixture.Database.GetCollection(nameof(ExternalAppDetails)); - var expected = (await collection.FindAsync(e => e.StudyInstanceUidOutBound == "sudIdOut2").ConfigureAwait(false)).First(); - var actual = (await store.GetByStudyIdOutboundAsync("sudIdOut2", new CancellationToken()).ConfigureAwait(false)); + var expected = (await collection.FindAsync(e => e.StudyInstanceUidOutBound == "sudIdOut2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).First(); + var actual = (await store.GetByStudyIdOutboundAsync("sudIdOut2", new CancellationToken()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); actual.Should().NotBeNull(); Assert.Equal(expected.StudyInstanceUid, actual!.StudyInstanceUid); diff --git a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs index dbdb29251..e48e004c4 100644 --- a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs @@ -68,10 +68,10 @@ public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSa var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - await store.AddAsync(aet).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); - var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -85,15 +85,15 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -102,14 +102,14 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("1.2.3.4", actual!.HostIp); Assert.Equal(114, actual!.Port); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -118,14 +118,14 @@ public async Task GivenAHL7DestinationEntity_WhenRemoveIsCalled_ExpectItToDelete { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); - var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -135,8 +135,8 @@ public async Task GivenHL7DestinationEntitiesInTheDatabase_WhenToListIsCalled_Ex var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); var collection = _databaseFixture.Database.GetCollection(nameof(HL7DestinationEntity)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); } @@ -146,17 +146,17 @@ public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; expected!.Port = 1000; expected!.HostIp = "loalhost"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); Assert.Equal(expected.HostIp, dbResult!.HostIp); diff --git a/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs index 98a6fd50e..7c982eef8 100755 --- a/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/InferenceRequestRepositoryTest.cs @@ -66,10 +66,10 @@ public async Task GivenAnInferenceRequest_WhenAddingToDatabase_ExpectItToBeSaved var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(InferenceRequest)); - var actual = await collection.Find(p => p.InferenceRequestId.Equals(inferenceRequest.InferenceRequestId)).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.InferenceRequestId.Equals(inferenceRequest.InferenceRequestId)).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(inferenceRequest.InferenceRequestId, actual!.InferenceRequestId); @@ -89,11 +89,11 @@ public async Task GivenAFailedInferenceRequstThatExceededRetries_WhenUpdateIsCal }; var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(InferenceRequest)); - var result = await collection.Find(p => p.TransactionId == inferenceRequest.TransactionId).FirstOrDefaultAsync().ConfigureAwait(false); + var result = await collection.Find(p => p.TransactionId == inferenceRequest.TransactionId).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(InferenceRequestState.Completed, result!.State); @@ -110,11 +110,11 @@ public async Task GivenAFailedInferenceRequst_WhenUpdateIsCalled_ShallRetryLater }; var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(InferenceRequest)); - var result = await collection.Find(Builders.Filter.Where(p => p.TransactionId == inferenceRequest.TransactionId)).FirstOrDefaultAsync().ConfigureAwait(false); + var result = await collection.Find(Builders.Filter.Where(p => p.TransactionId == inferenceRequest.TransactionId)).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(InferenceRequestState.Queued, result!.State); Assert.Equal(InferenceRequestStatus.Unknown, result!.Status); @@ -131,11 +131,11 @@ public async Task GivenASuccessfulInferenceRequest_WhenUpdateIsCalled_ShallMarkA var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Success).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Success).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(InferenceRequest)); - var result = await collection.Find(Builders.Filter.Where(p => p.TransactionId == inferenceRequest.TransactionId)).FirstOrDefaultAsync().ConfigureAwait(false); + var result = await collection.Find(Builders.Filter.Where(p => p.TransactionId == inferenceRequest.TransactionId)).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(InferenceRequestState.Completed, result!.State); @@ -153,11 +153,11 @@ public async Task GivenAQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnFirs var inferenceRequestQueued = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); - await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); - await store.AddAsync(inferenceRequestQueued).ConfigureAwait(false); + await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequestQueued).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var actual = await store.TakeAsync().ConfigureAwait(false); + var actual = await store.TakeAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(inferenceRequestQueued.InferenceRequestId, actual!.InferenceRequestId); Assert.Equal(InferenceRequestState.InProcess, actual!.State); @@ -177,11 +177,11 @@ public async Task GivenNoQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnNot var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); - await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); + await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); cancellationTokenSource.CancelAfter(500); - await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(false)).ConfigureAwait(false); + await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } [Fact] @@ -192,27 +192,27 @@ public async Task GivenInferenceRequests_WhenGetInferenceRequestIsCalled_ShallRe var inferenceRequest3 = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest1).ConfigureAwait(false); - await store.AddAsync(inferenceRequest2).ConfigureAwait(false); - await store.AddAsync(inferenceRequest3).ConfigureAwait(false); + await store.AddAsync(inferenceRequest1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequest2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(inferenceRequest3).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetInferenceRequestAsync(inferenceRequest1.TransactionId).ConfigureAwait(false); + var result = await store.GetInferenceRequestAsync(inferenceRequest1.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest1.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest2.TransactionId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest2.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest2.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest3.TransactionId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest3.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest3.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest1.InferenceRequestId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest1.InferenceRequestId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest1.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest2.InferenceRequestId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest2.InferenceRequestId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest2.TransactionId, result!.TransactionId); - result = await store.GetInferenceRequestAsync(inferenceRequest3.InferenceRequestId).ConfigureAwait(false); + result = await store.GetInferenceRequestAsync(inferenceRequest3.InferenceRequestId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest3.TransactionId, result!.TransactionId); } @@ -223,12 +223,12 @@ public async Task GivenInferenceRequests_WhenExistsCalled_ShallReturnCorrectValu var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.ExistsAsync(inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await store.ExistsAsync(inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ExistsAsync("random").ConfigureAwait(false); + result = await store.ExistsAsync("random").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -238,9 +238,9 @@ public async Task GivenAMatchingInferenceRequest_WhenGetStatusCalled_ShallReturn var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(false); + var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(result); Assert.Equal(inferenceRequest.TransactionId, result!.TransactionId); @@ -252,9 +252,9 @@ public async Task GivenNoMatchingInferenceRequest_WhenGetStatusCalled_ShallRetur var inferenceRequest = CreateInferenceRequest(); var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.AddAsync(inferenceRequest).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetStatusAsync("bogus").ConfigureAwait(false); + var result = await store.GetStatusAsync("bogus").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(result); } diff --git a/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj b/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj index 5cd670515..07c6b439a 100644 --- a/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj +++ b/src/Database/MongoDB/Integration.Test/Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test.csproj @@ -13,24 +13,21 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Database.MongoDB.Integration.Test - net6.0 + net8.0 enable enable false true - - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -39,9 +36,7 @@ all - - - + \ No newline at end of file diff --git a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs index 5c73132a9..880c11461 100755 --- a/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/MonaiApplicationEntityRepositoryTest.cs @@ -76,10 +76,10 @@ public async Task GivenAMonaiApplicationEntity_WhenAddingToDatabase_ExpectItToBe }; var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(MonaiApplicationEntity)); - var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -96,13 +96,13 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -111,12 +111,12 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -125,14 +125,14 @@ public async Task GivenAMonaiApplicationEntity_WhenRemoveIsCalled_ExpectItToDele { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); var collection = _databaseFixture.Database.GetCollection(nameof(MonaiApplicationEntity)); - var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -142,8 +142,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(MonaiApplicationEntity)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); } @@ -153,15 +153,15 @@ public async Task GivenAMonaiApplicationEntity_WhenUpdatedIsCalled_ExpectItToSav { var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); } diff --git a/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs index bddbb6fd7..a4cc58f51 100755 --- a/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/PayloadRepositoryTest.cs @@ -71,10 +71,10 @@ public async Task GivenAPayload_WhenAddingToDatabase_ExpectItToBeSaved() payload.State = Payload.PayloadState.Move; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(payload).ConfigureAwait(false); + await store.AddAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(Payload)); - var actual = await collection.Find(p => p.PayloadId == payload.PayloadId).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.PayloadId == payload.PayloadId).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(payload.Key, actual!.Key); @@ -104,13 +104,13 @@ public async Task GivenAPayload_WhenRemoveIsCalled_ExpectItToDeleted() payload.State = Payload.PayloadState.Move; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var added = await store.AddAsync(payload).ConfigureAwait(false); + var added = await store.AddAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var removed = await store.RemoveAsync(added!).ConfigureAwait(false); + var removed = await store.RemoveAsync(added!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(removed, added); var collection = _databaseFixture.Database.GetCollection(nameof(Payload)); - var dbResult = await collection.Find(p => p.PayloadId == payload.PayloadId).FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.PayloadId == payload.PayloadId).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -120,8 +120,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(Payload)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated).Excluding(p => p.Elapsed).Excluding(p => p.HasTimedOut)); } @@ -133,15 +133,15 @@ public async Task GivenAPayload_WhenUpdateIsCalled_ExpectItToSaved() payload.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.DIMSE, "source", "dest")); var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var added = await store.AddAsync(payload).ConfigureAwait(false); + var added = await store.AddAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); added.State = Payload.PayloadState.Notify; added.Add(new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DataService.ACR, "calling", "called")); - var updated = await store.UpdateAsync(payload).ConfigureAwait(false); + var updated = await store.UpdateAsync(payload).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(updated); var collection = _databaseFixture.Database.GetCollection(nameof(Payload)); - var actual = await collection.Find(p => p.PayloadId == payload.PayloadId).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.PayloadId == payload.PayloadId).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(updated.Key, actual!.Key); @@ -176,16 +176,16 @@ public async Task GivenPayloadsInDifferentStates_WhenRemovePendingPayloadsAsyncI var payload5 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - _ = await store.AddAsync(payload1).ConfigureAwait(false); - _ = await store.AddAsync(payload2).ConfigureAwait(false); - _ = await store.AddAsync(payload3).ConfigureAwait(false); - _ = await store.AddAsync(payload4).ConfigureAwait(false); - _ = await store.AddAsync(payload5).ConfigureAwait(false); + _ = await store.AddAsync(payload1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload3).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload4).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload5).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.RemovePendingPayloadsAsync().ConfigureAwait(false); + var result = await store.RemovePendingPayloadsAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(2, result); - var actual = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); + var actual = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(3, actual.Count); foreach (var payload in actual) @@ -207,22 +207,22 @@ public async Task GivenPayloadsInDifferentStates_WhenGetPayloadsInStateAsyncIsCa var payload5 = new Payload(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new DataOrigin { DataService = Messaging.Events.DataService.DIMSE, Destination = "dest", Source = "source" }, 5) { State = Payload.PayloadState.Notify }; var store = new PayloadRepository(_serviceScopeFactory.Object, _logger.Object, _options); - _ = await store.AddAsync(payload1).ConfigureAwait(false); - _ = await store.AddAsync(payload2).ConfigureAwait(false); - _ = await store.AddAsync(payload3).ConfigureAwait(false); - _ = await store.AddAsync(payload4).ConfigureAwait(false); - _ = await store.AddAsync(payload5).ConfigureAwait(false); + _ = await store.AddAsync(payload1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload3).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload4).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _ = await store.AddAsync(payload5).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Move).ConfigureAwait(false); + var result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Move).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Single(result); - result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Created).ConfigureAwait(false); + result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Created).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(2, result.Count); - result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify).ConfigureAwait(false); + result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(2, result.Count); - result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify, Payload.PayloadState.Created).ConfigureAwait(false); + result = await store.GetPayloadsInStateAsync(CancellationToken.None, Payload.PayloadState.Notify, Payload.PayloadState.Created).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(4, result.Count); } } diff --git a/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs index 68fdc02c6..feabc8db7 100755 --- a/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/SourceApplicationEntityRepositoryTest.cs @@ -72,10 +72,10 @@ public async Task GivenASourceApplicationEntity_WhenAddingToDatabase_ExpectItToB }; var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(SourceApplicationEntity)); - var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.AeTitle, actual!.AeTitle); @@ -88,13 +88,13 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -103,12 +103,12 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -117,12 +117,12 @@ public async Task GivenAETitle_WhenFindByAETitleAsyncIsCalled_ExpectItToReturnMa { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByAETAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByAETAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual.FirstOrDefault()!.AeTitle); Assert.Equal("AET1", actual.FirstOrDefault()!.Name); - actual = await store.FindByAETAsync("AET6").ConfigureAwait(false); + actual = await store.FindByAETAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Empty(actual); } @@ -132,14 +132,14 @@ public async Task GivenASourceApplicationEntity_WhenRemoveIsCalled_ExpectItToDel { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); var collection = _databaseFixture.Database.GetCollection(nameof(SourceApplicationEntity)); - var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -149,8 +149,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(SourceApplicationEntity)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); } @@ -160,15 +160,15 @@ public async Task GivenASourceApplicationEntity_WhenUpdatedIsCalled_ExpectItToSa { var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.AeTitle = "AET100"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.AeTitle, dbResult!.AeTitle); } diff --git a/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs index 20b1eb101..0f7fdae35 100755 --- a/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/StorageMetadataWrapperRepositoryTest.cs @@ -79,10 +79,10 @@ public async Task GivenADicomStorageMetadataObject_WhenAddingToDatabase_ExpectIt var metadata = CreateMetadataObject(); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(metadata).ConfigureAwait(false); + await store.AddAsync(metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(StorageMetadataWrapper)); - var actual = await collection.Find(p => p.Identity == metadata.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Identity == metadata.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(metadata.CorrelationId, actual!.CorrelationId); @@ -99,8 +99,8 @@ public async Task GivenANonExistedDicomStorageMetadataObject_WhenSavedToDatabase var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddOrUpdateAsync(metadata1).ConfigureAwait(false); - await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata2).ConfigureAwait(false)).ConfigureAwait(false); + await store.AddOrUpdateAsync(metadata1).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata2).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } [Fact] @@ -109,14 +109,14 @@ public async Task GivenAnExistingDicomStorageMetadataObject_WhenUpdated_ExpectIt var metadata = CreateMetadataObject(); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(metadata).ConfigureAwait(false); + await store.AddAsync(metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); metadata.SetWorkflows("A", "B", "C"); metadata.File.SetUploaded("bucket"); - await store.AddOrUpdateAsync(metadata).ConfigureAwait(false); + await store.AddOrUpdateAsync(metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(StorageMetadataWrapper)); - var actual = await collection.Find(p => p.Identity == metadata.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Identity == metadata.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(metadata.CorrelationId, actual!.CorrelationId); @@ -159,10 +159,10 @@ public async Task GivenACorrelationId_WhenGetFileStorageMetdadataIsCalled_Expect foreach (var item in list) { - await store.AddOrUpdateAsync(item).ConfigureAwait(false); + await store.AddOrUpdateAsync(item).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } - var results = await store.GetFileStorageMetdadataAsync(correlationId.ToString()).ConfigureAwait(false); + var results = await store.GetFileStorageMetdadataAsync(correlationId.ToString()).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(3, results.Count); @@ -188,9 +188,9 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenGetFileStorageMetadadataI "called"); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddOrUpdateAsync(expected).ConfigureAwait(false); + await store.AddOrUpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var match = await store.GetFileStorageMetdadataAsync(correlationId, identifier).ConfigureAwait(false); + var match = await store.GetFileStorageMetdadataAsync(correlationId, identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(match); Assert.Equal(expected.Id, match!.Id); @@ -213,12 +213,12 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalled_Expec "called"); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(expected).ConfigureAwait(false); - var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); + await store.AddAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); var collection = _databaseFixture.Database.GetCollection(nameof(StorageMetadataWrapper)); - var stored = await collection.Find(p => p.Identity == identifier).FirstOrDefaultAsync().ConfigureAwait(false); + var stored = await collection.Find(p => p.Identity == identifier).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(stored); } @@ -231,13 +231,13 @@ public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalledWithou var pending = CreateMetadataObject(); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(pending).ConfigureAwait(false); + await store.AddAsync(pending).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); + var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); var collection = _databaseFixture.Database.GetCollection(nameof(StorageMetadataWrapper)); - var stored = await collection.Find(p => p.Identity == pending.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var stored = await collection.Find(p => p.Identity == pending.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(stored); } @@ -254,12 +254,12 @@ public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_E uploaded.JsonFile.SetUploaded("bucket"); var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(pending).ConfigureAwait(false); - await store.AddAsync(uploaded).ConfigureAwait(false); + await store.AddAsync(pending).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + await store.AddAsync(uploaded).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - await store.DeletePendingUploadsAsync().ConfigureAwait(false); + await store.DeletePendingUploadsAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - var result = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); + var result = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Single(result); Assert.Equal(uploaded.Id, result[0].Identity); } diff --git a/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs index bc43fe6dc..4deba451e 100755 --- a/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/VirtualApplicationEntityRepositoryTest.cs @@ -73,10 +73,10 @@ public async Task GivenAVirtualApplicationEntity_WhenAddingToDatabase_ExpectItTo }; var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(aet).ConfigureAwait(false); + await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(VirtualApplicationEntity)); - var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(aet.VirtualAeTitle, actual!.VirtualAeTitle); @@ -90,13 +90,13 @@ public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToRet { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var result = await store.ContainsAsync(p => p.VirtualAeTitle == "AET1").ConfigureAwait(false); + var result = await store.ContainsAsync(p => p.VirtualAeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.VirtualAeTitle.Equals("AET1")).ConfigureAwait(false); + result = await store.ContainsAsync(p => p.VirtualAeTitle.Equals("AET1")).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); - result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.False(result); } @@ -105,12 +105,12 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.VirtualAeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + actual = await store.FindByNameAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -119,12 +119,12 @@ public async Task GivenAAETitleName_WhenFindByVirtualAeTitleAsyncIsCalled_Expect { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var actual = await store.FindByAeTitleAsync("AET1").ConfigureAwait(false); + var actual = await store.FindByAeTitleAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal("AET1", actual!.VirtualAeTitle); Assert.Equal("AET1", actual!.Name); - actual = await store.FindByAeTitleAsync("AET6").ConfigureAwait(false); + actual = await store.FindByAeTitleAsync("AET6").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(actual); } @@ -133,14 +133,14 @@ public async Task GivenAVirtualApplicationEntity_WhenRemoveIsCalled_ExpectItToDe { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByAeTitleAsync("AET5").ConfigureAwait(false); + var expected = await store.FindByAeTitleAsync("AET5").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); var collection = _databaseFixture.Database.GetCollection(nameof(VirtualApplicationEntity)); - var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.Name == "AET5").FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -150,8 +150,8 @@ public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsC var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); var collection = _databaseFixture.Database.GetCollection(nameof(VirtualApplicationEntity)); - var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(false); - var actual = await store.ToListAsync().ConfigureAwait(false); + var expected = await collection.Find(Builders.Filter.Empty).ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await store.ToListAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); actual.Should().BeEquivalentTo(expected, options => options.Excluding(p => p.DateTimeCreated)); } @@ -161,15 +161,15 @@ public async Task GivenAVirtualApplicationEntity_WhenUpdatedIsCalled_ExpectItToS { var store = new VirtualApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - var expected = await store.FindByAeTitleAsync("AET3").ConfigureAwait(false); + var expected = await store.FindByAeTitleAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); expected!.VirtualAeTitle = "AET100"; - var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + var actual = await store.UpdateAsync(expected).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(expected, actual); - var dbResult = await store.FindByAeTitleAsync("AET100").ConfigureAwait(false); + var dbResult = await store.FindByAeTitleAsync("AET100").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); Assert.Equal(expected.VirtualAeTitle, dbResult!.VirtualAeTitle); } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json old mode 100755 new mode 100644 index c0cbcf5cf..d0d9f2827 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,65 +10,65 @@ }, "FluentAssertions": { "type": "Direct", - "requested": "[6.11.0, )", - "resolved": "6.11.0", - "contentHash": "aBaagwdNtVKkug1F3imGXUlmoBd8ZUZX8oQ5niThaJhF79SpESe1Gzq7OFuZkQdKD5Pa4Mone+jrbas873AT4g==", + "requested": "[6.12.0, )", + "resolved": "6.12.0", + "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", "dependencies": { "System.Configuration.ConfigurationManager": "4.4.0" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -81,8 +81,8 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -94,10 +94,10 @@ }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -106,7 +106,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -132,20 +132,20 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -159,41 +159,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -210,25 +222,25 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -242,8 +254,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -251,10 +263,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -279,49 +291,49 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -329,29 +341,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -417,8 +429,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -427,13 +439,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -628,11 +648,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -707,8 +724,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1247,8 +1268,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -1347,6 +1368,19 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1354,30 +1388,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1385,36 +1416,36 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -1429,15 +1460,15 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "Polly": "[8.2.1, )" } } } diff --git a/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj b/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj index 5e44dfed8..a98e4f0ed 100644 --- a/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj +++ b/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj @@ -13,12 +13,10 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Database.MongoDB - net6.0 + net8.0 Apache-2.0 enable ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset @@ -26,27 +24,22 @@ true false - - - - - - + + - - + \ No newline at end of file diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index cd453a7c0..db32e7c3b 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -1,47 +1,50 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "MongoDB.Driver": { "type": "Direct", - "requested": "[2.21.0, )", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "requested": "[2.23.1, )", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -53,10 +56,10 @@ }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -65,7 +68,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -91,15 +94,15 @@ }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { @@ -113,41 +116,53 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" + } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { @@ -164,25 +179,25 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -200,49 +215,49 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -250,18 +265,18 @@ }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -276,13 +291,18 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -305,16 +325,17 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.Memory": { "type": "Transitive", @@ -358,8 +379,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -370,29 +391,42 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -407,7 +441,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } } } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json old mode 100755 new mode 100644 index af4bbeb2a..69b309a28 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -1,72 +1,72 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "AspNetCore.HealthChecks.MongoDb": { "type": "Direct", - "requested": "[6.0.2, )", - "resolved": "6.0.2", - "contentHash": "0R3NVbsjMhS5fd2hGijzQNKJ0zQBv/qMC7nkpmnbtgribCj7vfNdAhSqv4lwbibffRWPW5A/7VNJMX4aPej0WQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0YjJlCwkwulozPxFCRcJAl2CdjU5e5ekj4/BQsA6GZbzRxwtN3FIg7LJcWUUgMdwqDoe+6SKFBRnSRpfLY4owA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.2", - "MongoDB.Driver": "2.14.1" + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "MongoDB.Driver": "2.22.0" } }, "Microsoft.EntityFrameworkCore.Tools": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "2iPMR+DHXh2Xn9qoJ0ejzdHblpns73e1pZ/pyRbYDQi0HPJyq1/pTYDda1owJ5W2lxAGDg8l5Fl1jVp97fTR1g==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "zRdaXiiB1gEA0b+AJTd2+drh78gkEA4HyZ1vqNZrKq4xwW8WwavSiQsoeb1UsIMZkocLMBbhQYWClkZzuTKEgQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Design": "6.0.25" + "Microsoft.EntityFrameworkCore.Design": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "rtnltltUHm1nMEupZ9PNbs+b/8VXDZ/9Be8kxsaX3A00wqIQqNanfAG9xavu3CSCpkflF8M72py9oEdwbVaMZA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -78,10 +78,10 @@ }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -90,7 +90,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -101,8 +101,8 @@ }, "Humanizer.Core": { "type": "Transitive", - "resolved": "2.8.26", - "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, "Macross.Json.Extensions": { "type": "Transitive", @@ -119,252 +119,307 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" }, "Microsoft.EntityFrameworkCore.Design": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", "dependencies": { - "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -382,49 +437,49 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -432,29 +487,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -462,6 +517,14 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", @@ -469,18 +532,26 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -498,32 +569,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "System.Buffers": { @@ -531,6 +602,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections.Immutable": { "type": "Transitive", "resolved": "6.0.0", @@ -539,24 +615,86 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Diagnostics.DiagnosticSource": { + "System.Composition": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" } }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" + }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -586,19 +724,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.Channels": { @@ -606,29 +740,42 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -643,28 +790,29 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "Polly": "[8.2.1, )" } } } diff --git a/src/DicomWebClient/API/DicomWebClientException.cs b/src/DicomWebClient/API/DicomWebClientException.cs index 256b266cc..35607e068 100644 --- a/src/DicomWebClient/API/DicomWebClientException.cs +++ b/src/DicomWebClient/API/DicomWebClientException.cs @@ -17,11 +17,9 @@ using System; using System.Net; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client.API { - [Serializable] public class DicomWebClientException : Exception { public HttpStatusCode? StatusCode { get; } @@ -33,24 +31,5 @@ public DicomWebClientException(HttpStatusCode? statusCode, string responseMessag StatusCode = statusCode; ResponseMessage = responseMessage; } - - protected DicomWebClientException(SerializationInfo info, StreamingContext context) : base(info, context) - { - StatusCode = (HttpStatusCode?)info.GetValue(nameof(StatusCode), typeof(HttpStatusCode?)); - ResponseMessage = info.GetString(nameof(ResponseMessage)); - } - - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw new ArgumentNullException(nameof(info)); - } - - info.AddValue(nameof(StatusCode), StatusCode, typeof(HttpStatusCode?)); - info.AddValue(nameof(ResponseMessage), ResponseMessage); - - base.GetObjectData(info, context); - } } } diff --git a/src/DicomWebClient/API/ResponseDecodeException.cs b/src/DicomWebClient/API/ResponseDecodeException.cs index d90713dda..8e3550f26 100644 --- a/src/DicomWebClient/API/ResponseDecodeException.cs +++ b/src/DicomWebClient/API/ResponseDecodeException.cs @@ -16,19 +16,13 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client.API { - [Serializable] public class ResponseDecodeException : Exception { public ResponseDecodeException(string message) : base(message) { } - - protected ResponseDecodeException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/DicomWebClient/API/UnsupportedReturnTypeException.cs b/src/DicomWebClient/API/UnsupportedReturnTypeException.cs index cbfa36e1c..8a188dc8f 100644 --- a/src/DicomWebClient/API/UnsupportedReturnTypeException.cs +++ b/src/DicomWebClient/API/UnsupportedReturnTypeException.cs @@ -16,19 +16,13 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client.API { - [Serializable] public class UnsupportedReturnTypeException : Exception { public UnsupportedReturnTypeException(string message) : base(message) { } - - protected UnsupportedReturnTypeException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/DicomWebClient/CLI/Monai.Deploy.InformaticsGateway.DicomWeb.Client.CLI.csproj b/src/DicomWebClient/CLI/Monai.Deploy.InformaticsGateway.DicomWeb.Client.CLI.csproj index 59b49ad1a..3986de301 100644 --- a/src/DicomWebClient/CLI/Monai.Deploy.InformaticsGateway.DicomWeb.Client.CLI.csproj +++ b/src/DicomWebClient/CLI/Monai.Deploy.InformaticsGateway.DicomWeb.Client.CLI.csproj @@ -1,4 +1,4 @@ - - - + Exe - net6.0 + net8.0 dicomweb-cli true true @@ -20,25 +19,20 @@ true false - - - - true - - + \ No newline at end of file diff --git a/src/DicomWebClient/CLI/Stow.cs b/src/DicomWebClient/CLI/Stow.cs index 460b5d9e7..509abef66 100644 --- a/src/DicomWebClient/CLI/Stow.cs +++ b/src/DicomWebClient/CLI/Stow.cs @@ -29,7 +29,7 @@ namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client.CLI { [Command("stow", "Use stow to store DICOM instances to a remote DICOMweb server.")] - public class Stow : ConsoleAppBase + public class Stow : ConsoleAppBase, IDisposable { private readonly IDicomWebClient _dicomWebClient; private readonly ILogger _logger; @@ -138,5 +138,10 @@ private void ValidateOptions(string rootUrl, out Uri rootUri) rootUri = new Uri(rootUrl); rootUri = rootUri.EnsureUriEndsWithSlash(); } + + public void Dispose() + { + _cancellationTokeSource.Dispose(); + } } } diff --git a/src/DicomWebClient/CLI/Utils.cs b/src/DicomWebClient/CLI/Utils.cs index a44315fa3..96b83ecc3 100644 --- a/src/DicomWebClient/CLI/Utils.cs +++ b/src/DicomWebClient/CLI/Utils.cs @@ -19,16 +19,18 @@ using System.IO; using System.Net.Http.Headers; using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; using System.Threading.Tasks; using Ardalis.GuardClauses; using FellowOakDicom; using Microsoft.Extensions.Logging; -using Newtonsoft.Json.Linq; namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client.CLI { internal static class Utils { + public static JsonSerializerOptions JsonWriteIndentedOption = new() { WriteIndented = true }; public static void CheckAndConfirmOverwriteOutputFilename(ILogger logger, string filename) { Guard.Against.Null(logger, nameof(logger)); @@ -101,13 +103,15 @@ public static async Task SaveFiles(ILogger logger, DicomFile dicomFile, st await dicomFile.SaveAsync(filename).ConfigureAwait(false); } +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously internal static async Task SaveJson(ILogger logger, string outputDir, string item, DicomTag filenameSourceTag) +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously { Guard.Against.Null(logger, nameof(logger)); Guard.Against.NullOrWhiteSpace(outputDir, nameof(outputDir)); Guard.Against.NullOrWhiteSpace(item, nameof(item)); - var token = JToken.Parse(item); + var token = JsonObject.Parse(item).AsObject(); var value = GetTagValueFromJson(token, filenameSourceTag); string filename; if (!string.IsNullOrWhiteSpace(value)) @@ -120,7 +124,9 @@ internal static async Task SaveJson(ILogger logger, string outputDir, string ite } var path = Path.Combine(outputDir, filename); logger.LogInformation($"Saving JSON {path}"); - await File.WriteAllTextAsync(path, token.ToString(Newtonsoft.Json.Formatting.Indented), Encoding.UTF8).ConfigureAwait(false); + using var fileStream = File.Create(path); + using var fileWriter = new Utf8JsonWriter(fileStream); + token.WriteTo(fileWriter, JsonWriteIndentedOption); } internal static async Task SaveJson(ILogger logger, string outputFilename, string text) @@ -129,21 +135,22 @@ internal static async Task SaveJson(ILogger logger, string outputFilename, strin Guard.Against.NullOrWhiteSpace(outputFilename, nameof(outputFilename)); Guard.Against.NullOrWhiteSpace(text, nameof(text)); - var token = JToken.Parse(text); + var token = JsonNode.Parse(text); logger.LogInformation($"Saving JSON {outputFilename}..."); - await File.WriteAllTextAsync(outputFilename, token.ToString(Newtonsoft.Json.Formatting.Indented), Encoding.UTF8).ConfigureAwait(false); + await File.WriteAllTextAsync(outputFilename, token.ToString(), Encoding.UTF8).ConfigureAwait(false); } - private static string GetTagValueFromJson(JToken token, DicomTag dicomTag, string defaultValue = "unknown") +#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. + private static string GetTagValueFromJson(JsonObject? token, DicomTag dicomTag, string defaultValue = "unknown") +#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. { - Guard.Against.Null(token, nameof(token)); Guard.Against.Null(dicomTag, nameof(dicomTag)); var tag = $"{dicomTag.Group:X4}{dicomTag.Element:X4}"; - if (token.HasValues && token[tag].HasValues) + if (token is not null && token.ContainsKey(tag)) { - return token[tag]?["Value"]?.First.ToString(); + return token[tag].AsValue().GetValue(); } return defaultValue; diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json index a11c4fdb4..052d8cd8f 100755 --- a/src/DicomWebClient/CLI/packages.lock.json +++ b/src/DicomWebClient/CLI/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "ConsoleAppFramework": { "type": "Direct", "requested": "[4.2.4, )", @@ -12,22 +12,28 @@ "System.Text.Json": "6.0.1" } }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -36,19 +42,10 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, - "Microsoft.AspNet.WebApi.Client": { - "type": "Transitive", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", @@ -59,29 +56,6 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Dynamic.Runtime": "4.3.0", - "System.Globalization": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0" - } - }, "Microsoft.Extensions.Configuration": { "type": "Transitive", "resolved": "6.0.0", @@ -345,355 +319,11 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.Win32.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "NETStandard.Library": { - "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "ebWzW9j2nwxQeBo59As2TYn7nYr9BHicqqCwHOD1Vdo+50HBtLPuqdiCYJcLdTRknpYis/DSEOQz5KmZxwrIAg==", - "dependencies": { - "Microsoft.CSharp": "4.3.0", - "System.Collections": "4.3.0", - "System.ComponentModel.TypeConverter": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Dynamic.Runtime": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Runtime.Serialization.Formatters": "4.3.0", - "System.Runtime.Serialization.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0", - "System.Xml.XmlDocument": "4.3.0" - } - }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" - }, - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" - }, - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", - "dependencies": { - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" - } - }, - "runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", - "dependencies": { - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" - }, - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" - }, - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" - }, - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" - }, - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" - }, - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" - }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Collections.Concurrent": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Collections.NonGeneric": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Collections.Specialized": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", - "dependencies": { - "System.Collections.NonGeneric": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.ComponentModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.ComponentModel.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", - "dependencies": { - "System.ComponentModel": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.ComponentModel.TypeConverter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Collections.NonGeneric": "4.3.0", - "System.Collections.Specialized": "4.3.0", - "System.ComponentModel": "4.3.0", - "System.ComponentModel.Primitives": "4.3.0", - "System.Globalization": "4.3.0", - "System.Linq": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Diagnostics.Debug": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "6.0.0", @@ -707,601 +337,11 @@ "resolved": "6.0.0", "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" }, - "System.Diagnostics.Tools": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Diagnostics.Tracing": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Dynamic.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Calendars": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0" - } - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.IO.FileSystem": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.FileSystem.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Linq": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Linq.Async": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Emit.Lightweight": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Net.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Net.Sockets": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.ObjectModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, - "System.Runtime.Numerics": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", - "dependencies": { - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Runtime.Serialization.Formatters": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KT591AkTNFOTbhZlaeMVvfax3RqhH1EJlcwF50Wm7sfnBLuHiOeZRRKrr1ns3NESkM20KPZ5Ol/ueMq5vg4QoQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Serialization.Primitives": "4.3.0" - } - }, - "System.Runtime.Serialization.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", - "dependencies": { - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Security.Cryptography.Algorithms": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.Apple": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Security.Cryptography.Csp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Security.Cryptography.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Linq": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", - "dependencies": { - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Security.Cryptography.X509Certificates": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", "resolved": "6.0.0", @@ -1310,17 +350,6 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Text.Encoding.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, "System.Text.Encodings.Web": { "type": "Transitive", "resolved": "6.0.0", @@ -1331,136 +360,29 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" } }, - "System.Text.RegularExpressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", - "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Threading.Channels": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Xml.ReaderWriter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Extensions": "4.3.0" - } - }, - "System.Xml.XDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" - } - }, - "System.Xml.XmlDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" - } - }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.dicomweb.client": { "type": "Project", "dependencies": { - "Microsoft.AspNet.WebApi.Client": "[5.2.9, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )", - "System.Linq.Async": "[6.0.1, )", - "fo-dicom": "[5.1.1, )" + "fo-dicom": "[5.1.2, )" } } } diff --git a/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj b/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj index 1178427e0..61cf88278 100644 --- a/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj +++ b/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj @@ -13,14 +13,12 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 9.0 Apache-2.0 true @@ -28,35 +26,26 @@ true false - - - - - - - - + - - - + \ No newline at end of file diff --git a/src/DicomWebClient/Services/ServiceBase.cs b/src/DicomWebClient/Services/ServiceBase.cs index cbe1f2154..0e5969f4d 100644 --- a/src/DicomWebClient/Services/ServiceBase.cs +++ b/src/DicomWebClient/Services/ServiceBase.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; using System.Net.Http; +using System.Text.Json.Nodes; using Ardalis.GuardClauses; using FellowOakDicom; using FellowOakDicom.Serialization; @@ -25,8 +26,6 @@ using Microsoft.Net.Http.Headers; using Monai.Deploy.InformaticsGateway.Client.Common; using Monai.Deploy.InformaticsGateway.DicomWeb.Client.API; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; namespace Monai.Deploy.InformaticsGateway.DicomWeb.Client { @@ -79,12 +78,12 @@ protected async IAsyncEnumerable GetMetadata(Uri uri) response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - var jsonArray = JArray.Parse(json); - foreach (var item in jsonArray.Children()) + var jsonArray = JsonNode.Parse(json); + foreach (var item in jsonArray.AsArray()) { if (typeof(T) == typeof(string)) { - yield return (T)(object)item.ToString(Formatting.Indented); + yield return (T)(object)item.ToString(); } else if (typeof(T) == typeof(DicomDataset)) { diff --git a/src/DicomWebClient/Services/WadoService.cs b/src/DicomWebClient/Services/WadoService.cs index 175a36f52..029dc0bcc 100644 --- a/src/DicomWebClient/Services/WadoService.cs +++ b/src/DicomWebClient/Services/WadoService.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Ardalis.GuardClauses; @@ -114,7 +113,10 @@ public async Task Retrieve( try { - return await response.ToDicomAsyncEnumerable().FirstOrDefaultAsync(); + await using (var enumerator = response.ToDicomAsyncEnumerable().GetAsyncEnumerator()) + { + return await enumerator.MoveNextAsync() ? enumerator.Current : null; + } } catch (Exception ex) { @@ -250,7 +252,10 @@ public async Task RetrieveMetadata( try { - return await GetMetadata(instancMetadataUri).FirstOrDefaultAsync(); + await using (var enumerator = GetMetadata(instancMetadataUri).GetAsyncEnumerator()) + { + return await enumerator.MoveNextAsync() ? enumerator.Current : default; + } } catch (Exception ex) when (ex is not UnsupportedReturnTypeException) { diff --git a/src/DicomWebClient/Test/DicomWebClientExceptionTest.cs b/src/DicomWebClient/Test/DicomWebClientExceptionTest.cs deleted file mode 100644 index 05d57a152..000000000 --- a/src/DicomWebClient/Test/DicomWebClientExceptionTest.cs +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using Monai.Deploy.InformaticsGateway.DicomWeb.Client.API; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.DicomWebClient.Test -{ - public class DicomWebClientExceptionTest - { - [Fact] - public void TestControlExceptionSerialization() - { - var exception = new DicomWebClientException(System.Net.HttpStatusCode.OK, "message", new System.Exception("bla")); - - var data = SerializeToBytes(exception); - var result = DeserializeFromBytes(data); - - Assert.Equal(exception.Message, result.Message); - } - - private static byte[] SerializeToBytes(T e) - { - using var stream = new MemoryStream(); -#pragma warning disable SYSLIB0011 // Type or member is obsolete - new BinaryFormatter().Serialize(stream, e); -#pragma warning restore SYSLIB0011 // Type or member is obsolete - return stream.GetBuffer(); - } - - private static T DeserializeFromBytes(byte[] bytes) - { - using var stream = new MemoryStream(bytes); -#pragma warning disable SYSLIB0011 // Type or member is obsolete - return (T)new BinaryFormatter().Deserialize(stream); -#pragma warning restore SYSLIB0011 // Type or member is obsolete - } - } -} diff --git a/src/DicomWebClient/Test/HttpMessageExtensionTest.cs b/src/DicomWebClient/Test/HttpMessageExtensionTest.cs index f68a79232..b28509e31 100644 --- a/src/DicomWebClient/Test/HttpMessageExtensionTest.cs +++ b/src/DicomWebClient/Test/HttpMessageExtensionTest.cs @@ -172,7 +172,7 @@ public async Task ToBinaryData_Ok() AddByteArrayContent(multipartContent); message.Content = multipartContent; - var result = await message.ToBinaryData().ConfigureAwait(false); + var result = await message.ToBinaryData().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(_byteData, result); } diff --git a/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj b/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj index 47200e72a..e4497d272 100644 --- a/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj +++ b/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj @@ -13,36 +13,30 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test Apache-2.0 false true - - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + \ No newline at end of file diff --git a/src/DicomWebClient/Test/packages.lock.json b/src/DicomWebClient/Test/packages.lock.json index 61f3d9a5a..3070cee87 100755 --- a/src/DicomWebClient/Test/packages.lock.json +++ b/src/DicomWebClient/Test/packages.lock.json @@ -1,12 +1,12 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Ardalis.GuardClauses": { "type": "Direct", - "requested": "[4.1.1, )", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "coverlet.collector": { "type": "Direct", @@ -16,19 +16,19 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } @@ -44,20 +44,20 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Castle.Core": { "type": "Transitive", @@ -69,15 +69,15 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -86,19 +86,10 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, - "Microsoft.AspNet.WebApi.Client": { - "type": "Transitive", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", @@ -111,8 +102,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", @@ -174,8 +165,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -183,10 +174,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -256,15 +247,6 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, "NuGet.Frameworks": { "type": "Transitive", "resolved": "6.5.0", @@ -591,14 +573,6 @@ "System.Runtime.Extensions": "4.3.0" } }, - "System.Linq.Async": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, "System.Linq.Expressions": { "type": "Transitive", "resolved": "4.3.0", @@ -1039,8 +1013,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -1146,30 +1120,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1177,26 +1148,24 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.dicomweb.client": { "type": "Project", "dependencies": { - "Microsoft.AspNet.WebApi.Client": "[5.2.9, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )", - "System.Linq.Async": "[6.0.1, )", - "fo-dicom": "[5.1.1, )" + "fo-dicom": "[5.1.2, )" } } } diff --git a/src/DicomWebClient/Third-party/Microsoft/Extensions.cs b/src/DicomWebClient/Third-party/Microsoft/Extensions.cs new file mode 100644 index 000000000..2c269e449 --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/Extensions.cs @@ -0,0 +1,23 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Diagnostics.Contracts; +using System.Net.Http.Headers; + + +namespace System.Net.Http +{ + internal static class Extensions + { + public static void CopyTo(this HttpContentHeaders fromHeaders, HttpContentHeaders toHeaders) + { + Contract.Assert(fromHeaders != null, "fromHeaders cannot be null."); + Contract.Assert(toHeaders != null, "toHeaders cannot be null."); + + foreach (var header in fromHeaders) + { + toHeaders.TryAddWithoutValidation(header.Key, header.Value); + } + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/InternetMessageFormatHeaderParser.cs b/src/DicomWebClient/Third-party/Microsoft/InternetMessageFormatHeaderParser.cs new file mode 100644 index 000000000..e7738ec7e --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/InternetMessageFormatHeaderParser.cs @@ -0,0 +1,372 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.Net.Http.Headers; +using System.Text; +using Ardalis.GuardClauses; + +namespace System.Net.Http.Formatting.Parsers +{ + /// + /// Represents the overall state of various parsers. + /// + internal enum ParserState + { + /// + /// Need more data + /// + NeedMoreData = 0, + + /// + /// Parsing completed (final) + /// + Done, + + /// + /// Bad data format (final) + /// + Invalid, + + /// + /// Data exceeds the allowed size (final) + /// + DataTooBig, + } + + /// + /// Buffer-oriented RFC 5322 style Internet Message Format parser which can be used to pass header + /// fields used in HTTP and MIME message entities. + /// + internal class InternetMessageFormatHeaderParser + { + internal const int MinHeaderSize = 2; + + private int _totalBytesConsumed; + private readonly int _maxHeaderSize; + + private HeaderFieldState _headerState; + private readonly HttpHeaders _headers; + private readonly CurrentHeaderFieldStore _currentHeader; + private readonly bool _ignoreHeaderValidation; + + /// + /// Initializes a new instance of the class. + /// + /// Concrete instance where header fields are added as they are parsed. + /// Maximum length of complete header containing all the individual header fields. + public InternetMessageFormatHeaderParser(HttpHeaders headers, int maxHeaderSize) + : this(headers, maxHeaderSize, ignoreHeaderValidation: false) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Concrete instance where header fields are added as they are parsed. + /// + /// + /// Maximum length of complete header containing all the individual header fields. + /// + /// + /// Will validate content and names of headers if set to false. + /// + public InternetMessageFormatHeaderParser(HttpHeaders headers, int maxHeaderSize, bool ignoreHeaderValidation) + { + // The minimum length which would be an empty header terminated by CRLF + if (maxHeaderSize < InternetMessageFormatHeaderParser.MinHeaderSize) + { + throw new ArgumentException("maxHeaderSize"); + } + + Guard.Against.Null(headers, nameof(headers)); + + _headers = headers; + _maxHeaderSize = maxHeaderSize; + _ignoreHeaderValidation = ignoreHeaderValidation; + _currentHeader = new CurrentHeaderFieldStore(); + } + + private enum HeaderFieldState + { + Name = 0, + Value, + AfterCarriageReturn, + FoldingLine + } + + /// + /// Parse a buffer of RFC 5322 style header fields and add them to the collection. + /// Bytes are parsed in a consuming manner from the beginning of the buffer meaning that the same bytes can not be + /// present in the buffer. + /// + /// Request buffer from where request is read + /// Size of request buffer + /// Offset into request buffer + /// State of the parser. Call this method with new data until it reaches a final state. + [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exception is translated to parse state.")] + public ParserState ParseBuffer( + byte[] buffer, + int bytesReady, + ref int bytesConsumed) + { + Guard.Against.Null(buffer, nameof(buffer)); + + ParserState parseStatus = ParserState.NeedMoreData; + + if (bytesConsumed >= bytesReady) + { + // We already can tell we need more data + return parseStatus; + } + + try + { + parseStatus = InternetMessageFormatHeaderParser.ParseHeaderFields( + buffer, + bytesReady, + ref bytesConsumed, + ref _headerState, + _maxHeaderSize, + ref _totalBytesConsumed, + _currentHeader, + _headers, + _ignoreHeaderValidation); + } + catch (Exception) + { + parseStatus = ParserState.Invalid; + } + + return parseStatus; + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "This is a parser which cannot be split up for performance reasons.")] + private static ParserState ParseHeaderFields( + byte[] buffer, + int bytesReady, + ref int bytesConsumed, + ref HeaderFieldState requestHeaderState, + int maximumHeaderLength, + ref int totalBytesConsumed, + CurrentHeaderFieldStore currentField, + HttpHeaders headers, + bool ignoreHeaderValidation) + { + Contract.Assert((bytesReady - bytesConsumed) >= 0, "ParseHeaderFields()|(inputBufferLength - bytesParsed) < 0"); + Contract.Assert(maximumHeaderLength <= 0 || totalBytesConsumed <= maximumHeaderLength, "ParseHeaderFields()|Headers already read exceeds limit."); + + // Remember where we started. + int initialBytesParsed = bytesConsumed; + int segmentStart; + + // Set up parsing status with what will happen if we exceed the buffer. + ParserState parseStatus = ParserState.DataTooBig; + int effectiveMax = maximumHeaderLength <= 0 ? Int32.MaxValue : maximumHeaderLength - totalBytesConsumed + initialBytesParsed; + if (bytesReady < effectiveMax) + { + parseStatus = ParserState.NeedMoreData; + effectiveMax = bytesReady; + } + + Contract.Assert(bytesConsumed < effectiveMax, "We have already consumed more than the max header length."); + + switch (requestHeaderState) + { + case HeaderFieldState.Name: + segmentStart = bytesConsumed; + while (buffer[bytesConsumed] != ':') + { + if (buffer[bytesConsumed] == '\r') + { + if (!currentField.IsEmpty()) + { + parseStatus = ParserState.Invalid; + goto quit; + } + else + { + // Move past the '\r' + requestHeaderState = HeaderFieldState.AfterCarriageReturn; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case HeaderFieldState.AfterCarriageReturn; + } + } + + if (++bytesConsumed == effectiveMax) + { + string headerFieldName = Encoding.UTF8.GetString(buffer, segmentStart, bytesConsumed - segmentStart); + currentField.Name.Append(headerFieldName); + goto quit; + } + } + + if (bytesConsumed > segmentStart) + { + string headerFieldName = Encoding.UTF8.GetString(buffer, segmentStart, bytesConsumed - segmentStart); + currentField.Name.Append(headerFieldName); + } + + // Move past the ':' + requestHeaderState = HeaderFieldState.Value; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case HeaderFieldState.Value; + + case HeaderFieldState.Value: + segmentStart = bytesConsumed; + while (buffer[bytesConsumed] != '\r') + { + if (++bytesConsumed == effectiveMax) + { + string headerFieldValue = Encoding.UTF8.GetString(buffer, segmentStart, bytesConsumed - segmentStart); + currentField.Value.Append(headerFieldValue); + goto quit; + } + } + + if (bytesConsumed > segmentStart) + { + string headerFieldValue = Encoding.UTF8.GetString(buffer, segmentStart, bytesConsumed - segmentStart); + currentField.Value.Append(headerFieldValue); + } + + // Move past the CR + requestHeaderState = HeaderFieldState.AfterCarriageReturn; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case HeaderFieldState.AfterCarriageReturn; + + case HeaderFieldState.AfterCarriageReturn: + if (buffer[bytesConsumed] != '\n') + { + parseStatus = ParserState.Invalid; + goto quit; + } + + if (currentField.IsEmpty()) + { + parseStatus = ParserState.Done; + bytesConsumed++; + goto quit; + } + + requestHeaderState = HeaderFieldState.FoldingLine; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case HeaderFieldState.FoldingLine; + + case HeaderFieldState.FoldingLine: + if (buffer[bytesConsumed] != ' ' && buffer[bytesConsumed] != '\t') + { + currentField.CopyTo(headers, ignoreHeaderValidation); + requestHeaderState = HeaderFieldState.Name; + if (bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case HeaderFieldState.Name; + } + + // Unfold line by inserting SP instead + currentField.Value.Append(' '); + + // Continue parsing header field value + requestHeaderState = HeaderFieldState.Value; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case HeaderFieldState.Value; + } + + quit: + totalBytesConsumed += bytesConsumed - initialBytesParsed; + return parseStatus; + } + + /// + /// Maintains information about the current header field being parsed. + /// + private class CurrentHeaderFieldStore + { + private const int DefaultFieldNameAllocation = 128; + private const int DefaultFieldValueAllocation = 2 * 1024; + + private static readonly char[] LinearWhiteSpace = new char[] { ' ', '\t' }; + + /// + /// Gets the header field name. + /// + public StringBuilder Name { get; } = new StringBuilder(CurrentHeaderFieldStore.DefaultFieldNameAllocation); + + /// + /// Gets the header field value. + /// + public StringBuilder Value { get; } = new StringBuilder(CurrentHeaderFieldStore.DefaultFieldValueAllocation); + + /// + /// Copies current header field to the provided instance. + /// + /// The headers. + /// Set to false to validate headers + public void CopyTo(HttpHeaders headers, bool ignoreHeaderValidation) + { + var name = Name.ToString(); + var value = Value.ToString().Trim(CurrentHeaderFieldStore.LinearWhiteSpace); + if (string.Equals("expires", name, StringComparison.OrdinalIgnoreCase)) + { + ignoreHeaderValidation = true; + } + + if (ignoreHeaderValidation) + { + headers.TryAddWithoutValidation(name, value); + } + else + { + headers.Add(name, value); + } + + Clear(); + } + + /// + /// Determines whether this instance is empty. + /// + /// + /// true if this instance is empty; otherwise, false. + /// + public bool IsEmpty() + { + return Name.Length == 0 && Value.Length == 0; + } + + /// + /// Clears this instance. + /// + private void Clear() + { + Name.Clear(); + Value.Clear(); + } + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/MimeBodyPart.cs b/src/DicomWebClient/Third-party/Microsoft/MimeBodyPart.cs new file mode 100644 index 000000000..ebdace09b --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/MimeBodyPart.cs @@ -0,0 +1,230 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.IO; +using System.Net.Http.Formatting.Parsers; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http +{ + /// + /// Maintains information about MIME body parts parsed by . + /// + internal class MimeBodyPart : IDisposable + { + private static readonly Type StreamType = typeof(Stream); + private Stream _outputStream; + private readonly MultipartStreamProvider _streamProvider; + private HttpContent _parentContent; + private HttpContent _content; + private readonly HttpContentHeaders _headers; + + /// + /// Initializes a new instance of the class. + /// + /// The stream provider. + /// The max length of the MIME header within each MIME body part. + /// The part's parent content + public MimeBodyPart(MultipartStreamProvider streamProvider, int maxBodyPartHeaderSize, HttpContent parentContent) + { + Contract.Assert(streamProvider != null); + Contract.Assert(parentContent != null); + _streamProvider = streamProvider; + _parentContent = parentContent; + Segments = new List>(2); + _headers = CreateEmptyContentHeaders(); + HeaderParser = new InternetMessageFormatHeaderParser( + _headers, + maxBodyPartHeaderSize, + ignoreHeaderValidation: true); + } + + /// + /// Gets the header parser. + /// + /// + /// The header parser. + /// + public InternetMessageFormatHeaderParser HeaderParser { get; private set; } + + /// + /// Gets the part's content as an HttpContent. + /// + /// + /// The part's content, or null if the part had no content. + /// + public HttpContent GetCompletedHttpContent() + { + Contract.Assert(IsComplete); + + if (_content == null) + { + return null; + } + + _headers.CopyTo(_content.Headers); + return _content; + } + + /// + /// Gets the set of pointing to the read buffer with + /// contents of this body part. + /// + public List> Segments { get; private set; } + + /// + /// Gets or sets a value indicating whether the body part has been completed. + /// + /// + /// true if this instance is complete; otherwise, false. + /// + public bool IsComplete { get; set; } + + /// + /// Gets or sets a value indicating whether this is the final body part. + /// + /// + /// true if this instance is complete; otherwise, false. + /// + public bool IsFinal { get; set; } + + /// + /// Writes the into the part's output stream. + /// + /// The current segment to be written to the part's output stream. + /// The token to monitor for cancellation requests. + public async Task WriteSegment(ArraySegment segment, CancellationToken cancellationToken) + { + var stream = GetOutputStream(); + await stream.WriteAsync(segment.Array, segment.Offset, segment.Count, cancellationToken); + } + + /// + /// Gets the output stream. + /// + /// The output stream to write the body part to. + private Stream GetOutputStream() + { + if (_outputStream == null) + { + try + { + _outputStream = _streamProvider.GetStream(_parentContent, _headers); + } + catch (Exception e) + { + throw new InvalidOperationException($"The stream provider of type '{_streamProvider.GetType().Name}' threw an exception.", e); + } + + if (_outputStream == null) + { + throw new InvalidOperationException($"The stream provider of type '{_streamProvider.GetType().Name}' returned null. It must return a writable '{StreamType.Name}' instance."); + } + + if (!_outputStream.CanWrite) + { + throw new InvalidOperationException($"The stream provider of type '{_streamProvider.GetType().Name}' returned a read-only stream. It must return a writable '{StreamType.Name}' instance."); + } + _content = new StreamContent(_outputStream); + } + + return _outputStream; + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected void Dispose(bool disposing) + { + if (disposing) + { + CleanupOutputStream(); + CleanupHttpContent(); + _parentContent = null; + HeaderParser = null; + Segments.Clear(); + } + } + + /// + /// In the success case, the HttpContent is to be used after this Part has been parsed and disposed of. + /// Only if Dispose has been called on a non-completed part, the parsed HttpContent needs to be disposed of as well. + /// + private void CleanupHttpContent() + { + if (!IsComplete && _content != null) + { + _content.Dispose(); + } + + _content = null; + } + + /// + /// Resets the output stream by either closing it or, in the case of a resetting + /// position to 0 so that it can be read by the caller. + /// + private void CleanupOutputStream() + { + if (_outputStream != null) + { + MemoryStream output = _outputStream as MemoryStream; + if (output != null) + { + output.Position = 0; + } + else + { +#if NETSTANDARD1_3 + _outputStream.Dispose(); +#else + _outputStream.Close(); +#endif + } + + _outputStream = null; + } + } + + /// + /// Creates an empty instance. The only way is to get it from a dummy + /// instance. + /// + /// The created instance. + public static HttpContentHeaders CreateEmptyContentHeaders() + { + HttpContent tempContent = null; + HttpContentHeaders contentHeaders = null; + try + { + tempContent = new StringContent(String.Empty); + contentHeaders = tempContent.Headers; + contentHeaders.Clear(); + } + finally + { + // We can dispose the content without touching the headers + if (tempContent != null) + { + tempContent.Dispose(); + } + } + + return contentHeaders; + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/MimeMultipartBodyPartParser.cs b/src/DicomWebClient/Third-party/Microsoft/MimeMultipartBodyPartParser.cs new file mode 100644 index 000000000..a9a4428e7 --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/MimeMultipartBodyPartParser.cs @@ -0,0 +1,310 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.IO; +using System.Net.Http.Headers; + +namespace System.Net.Http.Formatting.Parsers +{ + /// + /// Complete MIME multipart parser that combines for parsing the MIME message into individual body parts + /// and for parsing each body part into a MIME header and a MIME body. The caller of the parser is returned + /// the resulting MIME bodies which can then be written to some output. + /// + internal class MimeMultipartBodyPartParser : IDisposable + { + internal const long DefaultMaxMessageSize = Int64.MaxValue; + private const int DefaultMaxBodyPartHeaderSize = 4 * 1024; + + // MIME parser + private MimeMultipartParser _mimeParser; + private MimeMultipartParser.State _mimeStatus = MimeMultipartParser.State.NeedMoreData; + private readonly ArraySegment[] _parsedBodyPart = new ArraySegment[2]; + private MimeBodyPart _currentBodyPart; + private bool _isFirst = true; + + // Header field parser + private ParserState _bodyPartHeaderStatus = ParserState.NeedMoreData; + private readonly int _maxBodyPartHeaderSize; + + // Stream provider + private readonly MultipartStreamProvider _streamProvider; + + private readonly HttpContent _content; + + /// + /// Initializes a new instance of the class. + /// + /// An existing instance to use for the object's content. + /// A stream provider providing output streams for where to write body parts as they are parsed. + public MimeMultipartBodyPartParser(HttpContent content, MultipartStreamProvider streamProvider) + : this(content, streamProvider, DefaultMaxMessageSize, DefaultMaxBodyPartHeaderSize) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// An existing instance to use for the object's content. + /// A stream provider providing output streams for where to write body parts as they are parsed. + /// The max length of the entire MIME multipart message. + /// The max length of the MIME header within each MIME body part. + public MimeMultipartBodyPartParser( + HttpContent content, + MultipartStreamProvider streamProvider, + long maxMessageSize, + int maxBodyPartHeaderSize) + { + Contract.Assert(content != null, "content cannot be null."); + Contract.Assert(streamProvider != null, "streamProvider cannot be null."); + + string boundary = ValidateArguments(content, maxMessageSize, true); + + _mimeParser = new MimeMultipartParser(boundary, maxMessageSize); + _currentBodyPart = new MimeBodyPart(streamProvider, maxBodyPartHeaderSize, content); + _content = content; + _maxBodyPartHeaderSize = maxBodyPartHeaderSize; + + _streamProvider = streamProvider; + } + + /// + /// Determines whether the specified content is MIME multipart content. + /// + /// The content. + /// + /// true if the specified content is MIME multipart content; otherwise, false. + /// + [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exception is translated to false return.")] + public static bool IsMimeMultipartContent(HttpContent content) + { + Contract.Assert(content != null, "content cannot be null."); + try + { + string boundary = ValidateArguments(content, DefaultMaxMessageSize, false); + return boundary != null; + } + catch (Exception) + { + return false; + } + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Parses the data provided and generates parsed MIME body part bodies in the form of which are ready to + /// write to the output stream. + /// + /// The data to parse + /// The number of bytes available in the input data + /// Parsed instances. + public IEnumerable ParseBuffer(byte[] data, int bytesRead) + { + int bytesConsumed = 0; + bool isFinal = false; + + // There's a special case here - if we've reached the end of the message and there's no optional + // CRLF, then we're out of bytes to read, but we have finished the message. + // + // If IsWaitingForEndOfMessage is true and we're at the end of the stream, then we're going to + // call into the parser again with an empty array as the buffer to signal the end of the parse. + // Then the final boundary segment will be marked as complete. + if (bytesRead == 0 && !_mimeParser.IsWaitingForEndOfMessage) + { + CleanupCurrentBodyPart(); + throw new IOException("Unexpected end of MIME multipart stream. MIME multipart message is not complete."); + } + + // Make sure we remove an old array segments. + _currentBodyPart.Segments.Clear(); + + while (_mimeParser.CanParseMore(bytesRead, bytesConsumed)) + { + _mimeStatus = _mimeParser.ParseBuffer(data, bytesRead, ref bytesConsumed, out _parsedBodyPart[0], out _parsedBodyPart[1], out isFinal); + if (_mimeStatus != MimeMultipartParser.State.BodyPartCompleted && _mimeStatus != MimeMultipartParser.State.NeedMoreData) + { + CleanupCurrentBodyPart(); + throw new InvalidOperationException($"Error parsing MIME multipart message byte {bytesConsumed} of data segment {data}."); + } + + // First body is empty preamble which we just ignore + if (_isFirst) + { + if (_mimeStatus == MimeMultipartParser.State.BodyPartCompleted) + { + _isFirst = false; + } + + continue; + } + + // Parse the two array segments containing parsed body parts that the MIME parser gave us + foreach (ArraySegment part in _parsedBodyPart) + { + if (part.Count == 0) + { + continue; + } + + if (_bodyPartHeaderStatus != ParserState.Done) + { + int headerConsumed = part.Offset; + _bodyPartHeaderStatus = _currentBodyPart.HeaderParser.ParseBuffer(part.Array, part.Count + part.Offset, ref headerConsumed); + if (_bodyPartHeaderStatus == ParserState.Done) + { + // Add the remainder as body part content + _currentBodyPart.Segments.Add(new ArraySegment(part.Array, headerConsumed, part.Count + part.Offset - headerConsumed)); + } + else if (_bodyPartHeaderStatus != ParserState.NeedMoreData) + { + CleanupCurrentBodyPart(); + throw new InvalidOperationException($"Error parsing MIME multipart body part header byte {headerConsumed} of data segment {part.Array}."); + } + } + else + { + // Add the data as body part content + _currentBodyPart.Segments.Add(part); + } + } + + if (_mimeStatus == MimeMultipartParser.State.BodyPartCompleted) + { + // If body is completed then swap current body part + MimeBodyPart completed = _currentBodyPart; + completed.IsComplete = true; + completed.IsFinal = isFinal; + + _currentBodyPart = new MimeBodyPart(_streamProvider, _maxBodyPartHeaderSize, _content); + + _mimeStatus = MimeMultipartParser.State.NeedMoreData; + _bodyPartHeaderStatus = ParserState.NeedMoreData; + yield return completed; + } + else + { + // Otherwise return what we have + yield return _currentBodyPart; + } + } + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected void Dispose(bool disposing) + { + if (disposing) + { + _mimeParser = null; + CleanupCurrentBodyPart(); + } + } + + private static string ValidateArguments(HttpContent content, long maxMessageSize, bool throwOnError) + { + Contract.Assert(content != null, "content cannot be null."); + if (maxMessageSize < MimeMultipartParser.MinMessageSize) + { + if (throwOnError) + { + throw new ArgumentOutOfRangeException("maxMessageSize", $"Value must be greater than or equal to {MimeMultipartParser.MinMessageSize}."); + } + else + { + return null; + } + } + + MediaTypeHeaderValue contentType = content.Headers.ContentType; + if (contentType == null) + { + if (throwOnError) + { + throw new ArgumentException($"Invalid '{typeof(HttpContent).Name}' instance provided. It does not have a content-type header value. '{typeof(HttpContent).Name}' instances must have a content-type header starting with 'multipart/'.", "content"); + } + else + { + return null; + } + } + + if (!contentType.MediaType.StartsWith("multipart", StringComparison.OrdinalIgnoreCase)) + { + if (throwOnError) + { + throw new ArgumentException($"Invalid '{typeof(HttpContent).Name}' instance provided. It does not have a content type header starting with 'multipart/'.", "content"); + } + else + { + return null; + } + } + + string boundary = null; + foreach (NameValueHeaderValue p in contentType.Parameters) + { + if (p.Name.Equals("boundary", StringComparison.OrdinalIgnoreCase)) + { + boundary = UnquoteToken(p.Value); + break; + } + } + + if (boundary == null) + { + if (throwOnError) + { + throw new ArgumentException($"Invalid '{typeof(HttpContent).Name}' instance provided. It does not have a 'multipart' content-type header with a 'boundary' parameter.", "content"); + } + else + { + return null; + } + } + + return boundary; + } + + private void CleanupCurrentBodyPart() + { + if (_currentBodyPart != null) + { + _currentBodyPart.Dispose(); + _currentBodyPart = null; + } + } + + /// + /// Remove bounding quotes on a token if present + /// + /// Token to unquote. + /// Unquoted token. + public static string UnquoteToken(string token) + { + if (String.IsNullOrWhiteSpace(token)) + { + return token; + } + + if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1) + { + return token.Substring(1, token.Length - 2); + } + + return token; + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/MimeMultipartParser.cs b/src/DicomWebClient/Third-party/Microsoft/MimeMultipartParser.cs new file mode 100644 index 000000000..67d438932 --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/MimeMultipartParser.cs @@ -0,0 +1,790 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; +using Ardalis.GuardClauses; + +namespace System.Net.Http.Formatting.Parsers +{ + /// + /// Buffer-oriented MIME multipart parser. + /// + internal class MimeMultipartParser + { + internal const int MinMessageSize = 10; + + private const int MaxBoundarySize = 256; + + private const byte HTAB = 0x09; + private const byte SP = 0x20; + private const byte CR = 0x0D; + private const byte LF = 0x0A; + private const byte Dash = 0x2D; + private static readonly ArraySegment EmptyBodyPart = new ArraySegment(new byte[0]); + + private long _totalBytesConsumed; + private readonly long _maxMessageSize; + + private BodyPartState _bodyPartState; + private readonly string _boundary; + private readonly CurrentBodyPartStore _currentBoundary; + + /// + /// Initializes a new instance of the class. + /// + /// Message boundary + /// Maximum length of entire MIME multipart message. + public MimeMultipartParser(string boundary, long maxMessageSize) + { + // The minimum length which would be an empty message terminated by CRLF + if (maxMessageSize < MimeMultipartParser.MinMessageSize) + { + throw new ArgumentException("maxMessageSize"); + } + + Guard.Against.NullOrWhiteSpace(boundary, nameof(boundary)); + + if (boundary.Length > MaxBoundarySize - 10) + { + throw new ArgumentException("boundary"); + } + + if (boundary.EndsWith(" ", StringComparison.Ordinal)) + { + throw new ArgumentException("boundary"); + } + + _maxMessageSize = maxMessageSize; + _boundary = boundary; + _currentBoundary = new CurrentBodyPartStore(_boundary); + _bodyPartState = BodyPartState.AfterFirstLineFeed; + } + + public bool IsWaitingForEndOfMessage + { + get + { + return + _bodyPartState == BodyPartState.AfterBoundary && + _currentBoundary != null && + _currentBoundary.IsFinal; + } + } + + private enum BodyPartState + { + BodyPart = 0, + AfterFirstCarriageReturn, + AfterFirstLineFeed, + AfterFirstDash, + Boundary, + AfterBoundary, + AfterSecondDash, + AfterSecondCarriageReturn + } + + private enum MessageState + { + Boundary = 0, // about to parse boundary + BodyPart, // about to parse body-part + CloseDelimiter // about to read close-delimiter + } + + /// + /// Represents the overall state of the . + /// + public enum State + { + /// + /// Need more data + /// + NeedMoreData = 0, + + /// + /// Parsing of a complete body part succeeded. + /// + BodyPartCompleted, + + /// + /// Bad data format + /// + Invalid, + + /// + /// Data exceeds the allowed size + /// + DataTooBig, + } + + public bool CanParseMore(int bytesRead, int bytesConsumed) + { + if (bytesConsumed < bytesRead) + { + // If there's more bytes we haven't parsed, then we can parse more + return true; + } + + if (bytesRead == 0 && IsWaitingForEndOfMessage) + { + // If we're waiting for the end of the message and we've arrived there, we want parse to be called + // again so we can mark the parse as complete. + // + // This can happen when the last boundary segment doesn't have a trailing CRLF. We need to wait until + // the end of the message to complete the parse because we need to consume any trailing whitespace that's + //present. + return true; + } + + return false; + } + + /// + /// Parse a MIME multipart message. Bytes are parsed in a consuming + /// manner from the beginning of the request buffer meaning that the same bytes can not be + /// present in the request buffer. + /// + /// Request buffer from where request is read + /// Size of request buffer + /// Offset into request buffer + /// Any body part that was considered as a potential MIME multipart boundary but which was in fact part of the body. + /// The bulk of the body part. + /// Indicates whether the final body part has been found. + /// In order to get the complete body part, the caller is responsible for concatenating the contents of the + /// and out parameters. + /// State of the parser. + [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exception is translated to parse state.")] + public State ParseBuffer( + byte[] buffer, + int bytesReady, + ref int bytesConsumed, + out ArraySegment remainingBodyPart, + out ArraySegment bodyPart, + out bool isFinalBodyPart) + { + Guard.Against.Null(buffer, nameof(buffer)); + + State parseStatus = State.NeedMoreData; + remainingBodyPart = MimeMultipartParser.EmptyBodyPart; + bodyPart = MimeMultipartParser.EmptyBodyPart; + isFinalBodyPart = false; + + try + { + parseStatus = MimeMultipartParser.ParseBodyPart( + buffer, + bytesReady, + ref bytesConsumed, + ref _bodyPartState, + _maxMessageSize, + ref _totalBytesConsumed, + _currentBoundary); + } + catch (Exception) + { + parseStatus = State.Invalid; + } + + remainingBodyPart = _currentBoundary.GetDiscardedBoundary(); + bodyPart = _currentBoundary.BodyPart; + if (parseStatus == State.BodyPartCompleted) + { + isFinalBodyPart = _currentBoundary.IsFinal; + _currentBoundary.ClearAll(); + } + else + { + _currentBoundary.ClearBodyPart(); + } + + return parseStatus; + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "This is a parser which cannot be split up for performance reasons.")] + private static State ParseBodyPart( + byte[] buffer, + int bytesReady, + ref int bytesConsumed, + ref BodyPartState bodyPartState, + long maximumMessageLength, + ref long totalBytesConsumed, + CurrentBodyPartStore currentBodyPart) + { + Contract.Assert((bytesReady - bytesConsumed) >= 0, "ParseBodyPart()|(bytesReady - bytesConsumed) < 0"); + Contract.Assert(maximumMessageLength <= 0 || totalBytesConsumed <= maximumMessageLength, "ParseBodyPart()|Message already read exceeds limit."); + + // Remember where we started. + int segmentStart; + int initialBytesParsed = bytesConsumed; + + if (bytesReady == 0 && bodyPartState == BodyPartState.AfterBoundary && currentBodyPart.IsFinal) + { + // We've seen the end of the stream - the final body part has no trailing CRLF + return State.BodyPartCompleted; + } + + // Set up parsing status with what will happen if we exceed the buffer. + State parseStatus = State.DataTooBig; + long effectiveMax = maximumMessageLength <= 0 ? Int64.MaxValue : (maximumMessageLength - totalBytesConsumed + bytesConsumed); + if (effectiveMax == 0) + { + // effectiveMax is based on our max message size - if we've arrrived at the max size, then we need + // to stop parsing. + return State.DataTooBig; + } + + if (bytesReady <= effectiveMax) + { + parseStatus = State.NeedMoreData; + effectiveMax = bytesReady; + } + + currentBodyPart.ResetBoundaryOffset(); + + Contract.Assert(bytesConsumed < effectiveMax, "We have already consumed more than the max header length."); + + switch (bodyPartState) + { + case BodyPartState.BodyPart: + while (buffer[bytesConsumed] != MimeMultipartParser.CR) + { + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + } + + // Remember potential boundary + currentBodyPart.AppendBoundary(MimeMultipartParser.CR); + + // Move past the CR + bodyPartState = BodyPartState.AfterFirstCarriageReturn; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.AfterFirstCarriageReturn; + + case BodyPartState.AfterFirstCarriageReturn: + if (buffer[bytesConsumed] != MimeMultipartParser.LF) + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + + // Remember potential boundary + currentBodyPart.AppendBoundary(MimeMultipartParser.LF); + + // Move past the CR + bodyPartState = BodyPartState.AfterFirstLineFeed; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.AfterFirstLineFeed; + + case BodyPartState.AfterFirstLineFeed: + if (buffer[bytesConsumed] == MimeMultipartParser.CR) + { + // Remember potential boundary + currentBodyPart.ResetBoundary(); + currentBodyPart.AppendBoundary(MimeMultipartParser.CR); + + // Move past the CR + bodyPartState = BodyPartState.AfterFirstCarriageReturn; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.AfterFirstCarriageReturn; + } + + if (buffer[bytesConsumed] != MimeMultipartParser.Dash) + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + + // Remember potential boundary + currentBodyPart.AppendBoundary(MimeMultipartParser.Dash); + + // Move past the Dash + bodyPartState = BodyPartState.AfterFirstDash; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.AfterFirstDash; + + case BodyPartState.AfterFirstDash: + if (buffer[bytesConsumed] != MimeMultipartParser.Dash) + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + + // Remember potential boundary + currentBodyPart.AppendBoundary(MimeMultipartParser.Dash); + + // Move past the Dash + bodyPartState = BodyPartState.Boundary; + if (++bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.Boundary; + + case BodyPartState.Boundary: + segmentStart = bytesConsumed; + while (buffer[bytesConsumed] != MimeMultipartParser.CR) + { + if (++bytesConsumed == effectiveMax) + { + if (currentBodyPart.AppendBoundary(buffer, segmentStart, bytesConsumed - segmentStart)) + { + if (currentBodyPart.IsBoundaryComplete()) + { + // At this point we've seen the end of a boundary segment that is aligned at the end + // of the buffer - this might be because we have another segment coming or it might + // truly be the end of the message. + bodyPartState = BodyPartState.AfterBoundary; + } + } + else + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + } + goto quit; + } + } + + if (bytesConsumed > segmentStart) + { + if (!currentBodyPart.AppendBoundary(buffer, segmentStart, bytesConsumed - segmentStart)) + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + } + + goto case BodyPartState.AfterBoundary; + + case BodyPartState.AfterBoundary: + + // This state means that we just saw the end of a boundary. It might by a 'normal' boundary, in which + // case it's followed by optional whitespace and a CRLF. Or it might be the 'final' boundary and will + // be followed by '--', optional whitespace and an optional CRLF. + if (buffer[bytesConsumed] == MimeMultipartParser.Dash && !currentBodyPart.IsFinal) + { + currentBodyPart.AppendBoundary(MimeMultipartParser.Dash); + if (++bytesConsumed == effectiveMax) + { + bodyPartState = BodyPartState.AfterSecondDash; + goto quit; + } + + goto case BodyPartState.AfterSecondDash; + } + + // Capture optional whitespace + segmentStart = bytesConsumed; + while (buffer[bytesConsumed] != MimeMultipartParser.CR) + { + if (++bytesConsumed == effectiveMax) + { + if (!currentBodyPart.AppendBoundary(buffer, segmentStart, bytesConsumed - segmentStart)) + { + // It's an unexpected character + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + } + + goto quit; + } + } + + if (bytesConsumed > segmentStart) + { + if (!currentBodyPart.AppendBoundary(buffer, segmentStart, bytesConsumed - segmentStart)) + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + } + + if (buffer[bytesConsumed] == MimeMultipartParser.CR) + { + currentBodyPart.AppendBoundary(MimeMultipartParser.CR); + if (++bytesConsumed == effectiveMax) + { + bodyPartState = BodyPartState.AfterSecondCarriageReturn; + goto quit; + } + + goto case BodyPartState.AfterSecondCarriageReturn; + } + else + { + // It's an unexpected character + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + + case BodyPartState.AfterSecondDash: + if (buffer[bytesConsumed] == MimeMultipartParser.Dash) + { + currentBodyPart.AppendBoundary(MimeMultipartParser.Dash); + bytesConsumed++; + + if (currentBodyPart.IsBoundaryComplete()) + { + Debug.Assert(currentBodyPart.IsFinal); + + // If we get in here, it means we've see the trailing '--' of the last boundary - in order to consume all of the + // remaining bytes, we don't mark the parse as complete again - wait until this method is called again with the + // empty buffer to do that. + bodyPartState = BodyPartState.AfterBoundary; + parseStatus = State.NeedMoreData; + goto quit; + } + else + { + currentBodyPart.ResetBoundary(); + if (bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.BodyPart; + } + } + else + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + + case BodyPartState.AfterSecondCarriageReturn: + if (buffer[bytesConsumed] != MimeMultipartParser.LF) + { + currentBodyPart.ResetBoundary(); + bodyPartState = BodyPartState.BodyPart; + goto case BodyPartState.BodyPart; + } + + currentBodyPart.AppendBoundary(MimeMultipartParser.LF); + bytesConsumed++; + + bodyPartState = BodyPartState.BodyPart; + if (currentBodyPart.IsBoundaryComplete()) + { + parseStatus = State.BodyPartCompleted; + goto quit; + } + else + { + currentBodyPart.ResetBoundary(); + if (bytesConsumed == effectiveMax) + { + goto quit; + } + + goto case BodyPartState.BodyPart; + } + } + + quit: + if (initialBytesParsed < bytesConsumed) + { + int boundaryLength = currentBodyPart.BoundaryDelta; + if (boundaryLength > 0 && parseStatus != State.BodyPartCompleted) + { + currentBodyPart.HasPotentialBoundaryLeftOver = true; + } + + int bodyPartEnd = bytesConsumed - initialBytesParsed - boundaryLength; + + currentBodyPart.BodyPart = new ArraySegment(buffer, initialBytesParsed, bodyPartEnd); + } + + totalBytesConsumed += bytesConsumed - initialBytesParsed; + return parseStatus; + } + + /// + /// Maintains information about the current body part being parsed. + /// + [DebuggerDisplay("{DebuggerToString()}")] + private class CurrentBodyPartStore + { + private const int InitialOffset = 2; + + private readonly byte[] _boundaryStore = new byte[MaxBoundarySize]; + private int _boundaryStoreLength; + + private readonly byte[] _referenceBoundary = new byte[MaxBoundarySize]; + private readonly int _referenceBoundaryLength; + + private readonly byte[] _boundary = new byte[MaxBoundarySize]; + private int _boundaryLength = 0; + private bool _isFirst = true; + private bool _releaseDiscardedBoundary; + private int _boundaryOffset; + + /// + /// Initializes a new instance of the class. + /// + /// The reference boundary. + public CurrentBodyPartStore(string referenceBoundary) + { + Contract.Assert(referenceBoundary != null); + + _referenceBoundary[0] = MimeMultipartParser.CR; + _referenceBoundary[1] = MimeMultipartParser.LF; + _referenceBoundary[2] = MimeMultipartParser.Dash; + _referenceBoundary[3] = MimeMultipartParser.Dash; + _referenceBoundaryLength = 4 + Encoding.UTF8.GetBytes(referenceBoundary, 0, referenceBoundary.Length, _referenceBoundary, 4); + + _boundary[0] = MimeMultipartParser.CR; + _boundary[1] = MimeMultipartParser.LF; + _boundaryLength = CurrentBodyPartStore.InitialOffset; + } + + /// + /// Gets or sets a value indicating whether this instance has potential boundary left over. + /// + /// + /// true if this instance has potential boundary left over; otherwise, false. + /// + public bool HasPotentialBoundaryLeftOver { get; set; } + + /// + /// Gets the boundary delta. + /// + public int BoundaryDelta + { + get { return (_boundaryLength - _boundaryOffset > 0) ? _boundaryLength - _boundaryOffset : _boundaryLength; } + } + + /// + /// Gets or sets the body part. + /// + /// + /// The body part. + /// + public ArraySegment BodyPart { get; set; } = MimeMultipartParser.EmptyBodyPart; + + /// + /// Gets a value indicating whether this body part instance is final. + /// + /// + /// true if this body part instance is final; otherwise, false. + /// + public bool IsFinal { get; private set; } + + /// + /// Resets the boundary offset. + /// + public void ResetBoundaryOffset() + { + _boundaryOffset = _boundaryLength; + } + + /// + /// Resets the boundary. + /// + public void ResetBoundary() + { + // If we had a potential boundary left over then store it so that we don't loose it + if (HasPotentialBoundaryLeftOver) + { + Buffer.BlockCopy(_boundary, 0, _boundaryStore, 0, _boundaryOffset); + _boundaryStoreLength = _boundaryOffset; + HasPotentialBoundaryLeftOver = false; + _releaseDiscardedBoundary = true; + } + + _boundaryLength = 0; + _boundaryOffset = 0; + } + + /// + /// Appends byte to the current boundary. + /// + /// The data to append to the boundary. + public void AppendBoundary(byte data) + { + _boundary[_boundaryLength++] = data; + } + + /// + /// Appends array of bytes to the current boundary. + /// + /// The data to append to the boundary. + /// The offset into the data. + /// The number of bytes to append. + public bool AppendBoundary(byte[] data, int offset, int count) + { + // Check that potential boundary is not bigger than our reference boundary. + // Allow for 2 extra characters to include the final boundary which ends with + // an additional "--" sequence + plus up to 4 LWS characters (which are allowed). + if (_boundaryLength + count > _referenceBoundaryLength + 6) + { + return false; + } + + int cnt = _boundaryLength; + Buffer.BlockCopy(data, offset, _boundary, _boundaryLength, count); + _boundaryLength += count; + + // Verify that boundary matches so far + int maxCount = Math.Min(_boundaryLength, _referenceBoundaryLength); + for (; cnt < maxCount; cnt++) + { + if (_boundary[cnt] != _referenceBoundary[cnt]) + { + return false; + } + } + + return true; + } + + /// + /// Gets the discarded boundary. + /// + /// An containing the discarded boundary. + public ArraySegment GetDiscardedBoundary() + { + if (_boundaryStoreLength > 0 && _releaseDiscardedBoundary) + { + ArraySegment discarded = new ArraySegment(_boundaryStore, 0, _boundaryStoreLength); + _boundaryStoreLength = 0; + return discarded; + } + + return MimeMultipartParser.EmptyBodyPart; + } + + /// + /// Determines whether current boundary is valid. + /// + /// + /// true if curent boundary is valid; otherwise, false. + /// + public bool IsBoundaryValid() + { + int offset = 0; + if (_isFirst) + { + offset = CurrentBodyPartStore.InitialOffset; + } + + int count = offset; + for (; count < _referenceBoundaryLength; count++) + { + if (_boundary[count] != _referenceBoundary[count]) + { + return false; + } + } + + // Check for final + bool boundaryIsFinal = false; + if (_boundary[count] == MimeMultipartParser.Dash && + _boundary[count + 1] == MimeMultipartParser.Dash) + { + boundaryIsFinal = true; + count += 2; + } + + // Rest of boundary must be ignorable whitespace in order for it to match + for (; count < _boundaryLength - 2; count++) + { + if (_boundary[count] != MimeMultipartParser.SP && _boundary[count] != MimeMultipartParser.HTAB) + { + return false; + } + } + + // We have a valid boundary so whatever we stored in the boundary story is no longer needed + IsFinal = boundaryIsFinal; + _isFirst = false; + + return true; + } + + public bool IsBoundaryComplete() + { + if (!IsBoundaryValid()) + { + return false; + } + + if (_boundaryLength < _referenceBoundaryLength) + { + return false; + } + + if (_boundaryLength == _referenceBoundaryLength + 1 && + _boundary[_referenceBoundaryLength] == MimeMultipartParser.Dash) + { + return false; + } + + return true; + } + + /// + /// Clears the body part. + /// + public void ClearBodyPart() + { + BodyPart = MimeMultipartParser.EmptyBodyPart; + } + + /// + /// Clears all. + /// + public void ClearAll() + { + _releaseDiscardedBoundary = false; + HasPotentialBoundaryLeftOver = false; + _boundaryLength = 0; + _boundaryOffset = 0; + _boundaryStoreLength = 0; + IsFinal = false; + ClearBodyPart(); + } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "Used for Debugger Display.")] + private string DebuggerToString() + { + var referenceBoundary = Encoding.UTF8.GetString(_referenceBoundary, 0, _referenceBoundaryLength); + var boundary = Encoding.UTF8.GetString(_boundary, 0, _boundaryLength); + + return String.Format( + CultureInfo.InvariantCulture, + "Expected: {0} *** Current: {1}", + referenceBoundary, + boundary); + } + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/MultipartExtensions.cs b/src/DicomWebClient/Third-party/Microsoft/MultipartExtensions.cs new file mode 100644 index 000000000..b416e87ed --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/MultipartExtensions.cs @@ -0,0 +1,275 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.IO; +using System.Net.Http.Formatting.Parsers; +using System.Threading; +using System.Threading.Tasks; +using Ardalis.GuardClauses; + +namespace System.Net.Http +{ + /// + /// Extension methods to read MIME multipart entities from instances. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public static class HttpContentMultipartExtensions + { + private const int MinBufferSize = 256; + private const int DefaultBufferSize = 32 * 1024; + + ///// + ///// Determines whether the specified content is MIME multipart content. + ///// + ///// The content. + ///// + ///// true if the specified content is MIME multipart content; otherwise, false. + ///// + //public static bool IsMimeMultipartContent(this HttpContent content) + //{ + // Guard.Against.Null(content, nameof(content)); + + // return MimeMultipartBodyPartParser.IsMimeMultipartContent(content); + //} + + ///// + ///// Determines whether the specified content is MIME multipart content with the + ///// specified subtype. For example, the subtype mixed would match content + ///// with a content type of multipart/mixed. + ///// + ///// The content. + ///// The MIME multipart subtype to match. + ///// + ///// true if the specified content is MIME multipart content with the specified subtype; otherwise, false. + ///// + //public static bool IsMimeMultipartContent(this HttpContent content, string subtype) + //{ + // if (String.IsNullOrWhiteSpace(subtype)) + // { + // throw Error.ArgumentNull("subtype"); + // } + + // if (IsMimeMultipartContent(content)) + // { + // if (content.Headers.ContentType.MediaType.Equals("multipart/" + subtype, StringComparison.OrdinalIgnoreCase)) + // { + // return true; + // } + // } + + // return false; + //} + + /// + /// Reads all body parts within a MIME multipart message into memory using a . + /// + /// An existing instance to use for the object's content. + /// A representing the tasks of getting the result of reading the MIME content. + public static Task ReadAsMultipartAsync(this HttpContent content) + { + return ReadAsMultipartAsync(content, new MultipartMemoryStreamProvider(), DefaultBufferSize); + } + + /// + /// Reads all body parts within a MIME multipart message into memory using a . + /// + /// An existing instance to use for the object's content. + /// The token to monitor for cancellation requests. + /// A representing the tasks of getting the result of reading the MIME content. + public static Task ReadAsMultipartAsync(this HttpContent content, CancellationToken cancellationToken) + { + return ReadAsMultipartAsync(content, new MultipartMemoryStreamProvider(), DefaultBufferSize, cancellationToken); + } + + /// + /// Reads all body parts within a MIME multipart message using the provided instance + /// to determine where the contents of each body part is written. + /// + /// The with which to process the data. + /// An existing instance to use for the object's content. + /// A stream provider providing output streams for where to write body parts as they are parsed. + /// A representing the tasks of getting the result of reading the MIME content. + public static Task ReadAsMultipartAsync(this HttpContent content, T streamProvider) where T : MultipartStreamProvider + { + return ReadAsMultipartAsync(content, streamProvider, DefaultBufferSize); + } + + /// + /// Reads all body parts within a MIME multipart message using the provided instance + /// to determine where the contents of each body part is written. + /// + /// The with which to process the data. + /// An existing instance to use for the object's content. + /// A stream provider providing output streams for where to write body parts as they are parsed. + /// The token to monitor for cancellation requests. + /// A representing the tasks of getting the result of reading the MIME content. + public static Task ReadAsMultipartAsync(this HttpContent content, T streamProvider, CancellationToken cancellationToken) + where T : MultipartStreamProvider + { + return ReadAsMultipartAsync(content, streamProvider, DefaultBufferSize, cancellationToken); + } + + /// + /// Reads all body parts within a MIME multipart message using the provided instance + /// to determine where the contents of each body part is written and as read buffer size. + /// + /// The with which to process the data. + /// An existing instance to use for the object's content. + /// A stream provider providing output streams for where to write body parts as they are parsed. + /// Size of the buffer used to read the contents. + /// A representing the tasks of getting the result of reading the MIME content. + public static Task ReadAsMultipartAsync(this HttpContent content, T streamProvider, int bufferSize) + where T : MultipartStreamProvider + { + return ReadAsMultipartAsync(content, streamProvider, bufferSize, CancellationToken.None); + } + + /// + /// Reads all body parts within a MIME multipart message using the provided instance + /// to determine where the contents of each body part is written and as read buffer size. + /// + /// The with which to process the data. + /// An existing instance to use for the object's content. + /// A stream provider providing output streams for where to write body parts as they are parsed. + /// Size of the buffer used to read the contents. + /// The token to monitor for cancellation requests. + /// A representing the tasks of getting the result of reading the MIME content. + public static async Task ReadAsMultipartAsync(this HttpContent content, T streamProvider, int bufferSize, + CancellationToken cancellationToken) where T : MultipartStreamProvider + { + Guard.Against.Null(content, nameof(content)); + Guard.Against.Null(streamProvider, nameof(streamProvider)); + + if (bufferSize < MinBufferSize) + { + throw new ArgumentOutOfRangeException("bufferSize", $"Value must be greater than or equal to {MinBufferSize}."); + } + + Stream stream; + try + { + stream = await content.ReadAsStreamAsync(); + } + catch (Exception e) + { + throw new IOException("Error reading MIME multipart body part.", e); + } + + using (var parser = new MimeMultipartBodyPartParser(content, streamProvider)) + { + byte[] data = new byte[bufferSize]; + MultipartAsyncContext context = new MultipartAsyncContext(stream, parser, data, streamProvider.Contents); + + // Start async read/write loop + await MultipartReadAsync(context, cancellationToken); + + // Let the stream provider post-process when everything is complete + await streamProvider.ExecutePostProcessingAsync(cancellationToken); + return streamProvider; + } + } + + [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exception is propagated.")] + private static async Task MultipartReadAsync(MultipartAsyncContext context, CancellationToken cancellationToken) + { + Contract.Assert(context != null, "context cannot be null"); + while (true) + { + int bytesRead; + try + { + bytesRead = await context.ContentStream.ReadAsync(context.Data, 0, context.Data.Length, cancellationToken); + } + catch (Exception e) + { + throw new IOException("Error reading MIME multipart body part.", e); + } + + IEnumerable parts = context.MimeParser.ParseBuffer(context.Data, bytesRead); + + foreach (MimeBodyPart part in parts) + { + foreach (ArraySegment segment in part.Segments) + { + try + { + await part.WriteSegment(segment, cancellationToken); + } + catch (Exception e) + { + part.Dispose(); + throw new IOException("Error writing MIME multipart body part to output stream.", e); + } + } + + if (CheckIsFinalPart(part, context.Result)) + { + return; + } + } + } + } + + private static bool CheckIsFinalPart(MimeBodyPart part, ICollection result) + { + Contract.Assert(part != null, "part cannot be null."); + Contract.Assert(result != null, "result cannot be null."); + if (part.IsComplete) + { + HttpContent partContent = part.GetCompletedHttpContent(); + if (partContent != null) + { + result.Add(partContent); + } + + bool isFinal = part.IsFinal; + part.Dispose(); + return isFinal; + } + + return false; + } + + /// + /// Managing state for asynchronous read and write operations + /// + private class MultipartAsyncContext + { + public MultipartAsyncContext(Stream contentStream, MimeMultipartBodyPartParser mimeParser, byte[] data, ICollection result) + { + Contract.Assert(contentStream != null); + Contract.Assert(mimeParser != null); + Contract.Assert(data != null); + + ContentStream = contentStream; + Result = result; + MimeParser = mimeParser; + Data = data; + } + + /// + /// Gets the that we read from. + /// + public Stream ContentStream { get; private set; } + + /// + /// Gets the collection of parsed instances. + /// + public ICollection Result { get; private set; } + + /// + /// The data buffer that we use for reading data from the input stream into before processing. + /// + public byte[] Data { get; private set; } + + /// + /// Gets the MIME parser instance used to parse the data + /// + public MimeMultipartBodyPartParser MimeParser { get; private set; } + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/MultipartMemoryStreamProvider.cs b/src/DicomWebClient/Third-party/Microsoft/MultipartMemoryStreamProvider.cs new file mode 100644 index 000000000..dc4892c5d --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/MultipartMemoryStreamProvider.cs @@ -0,0 +1,28 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Net.Http.Headers; +using Ardalis.GuardClauses; + +namespace System.Net.Http +{ + /// + /// Provides a implementation that returns a instance. + /// This facilitates deserialization or other manipulation of the contents in memory. + /// + public class MultipartMemoryStreamProvider : MultipartStreamProvider + { + /// + /// This implementation returns a instance. + /// This facilitates deserialization or other manipulation of the contents in memory. + /// + public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) + { + Guard.Against.Null(parent, nameof(parent)); + Guard.Against.Null(headers, nameof(headers)); + + return new MemoryStream(); + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/MultipartStreamProvider.cs b/src/DicomWebClient/Third-party/Microsoft/MultipartStreamProvider.cs new file mode 100644 index 000000000..c3ade19f9 --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/MultipartStreamProvider.cs @@ -0,0 +1,77 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.ObjectModel; +using System.IO; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http +{ + + /// + /// An implementation examines the headers provided by the MIME multipart parser + /// as part of the MIME multipart extension methods (see ) and decides + /// what kind of stream to return for the body part to be written to. + /// + public abstract class MultipartStreamProvider + { + /// + /// Used as the T in a "conversion" of a Task into a Task{T} + /// + private struct AsyncVoid + { + } + + /// + /// Initializes a new instance of the class. + /// + protected MultipartStreamProvider() + { + } + + /// + /// Gets the collection of instances where each instance represents a MIME body part. + /// + public Collection Contents { get; } = new(); + + /// + /// When a MIME multipart body part has been parsed this method is called to get a stream for where to write the body part to. + /// + /// The parent MIME multipart instance. + /// The header fields describing the body parts content. Looking for header fields such as + /// Content-Type and Content-Disposition can help provide the appropriate stream. In addition to using the information + /// in the provided header fields, it is also possible to add new header fields or modify existing header fields. This can + /// be useful to get around situations where the Content-type may say application/octet-stream but based on + /// analyzing the Content-Disposition header field it is found that the content in fact is application/json, for example. + /// A stream instance where the contents of a body part will be written to. + public abstract Stream GetStream(HttpContent parent, HttpContentHeaders headers); + + /// + /// Immediately upon reading the last MIME body part but before completing the read task, this method is + /// called to enable the to do any post processing on the + /// instances that have been read. For example, it can be used to copy the data to another location, or perform + /// some other kind of post processing on the data before completing the read operation. + /// + /// A representing the post processing. + public virtual Task ExecutePostProcessingAsync() + { + return Task.FromResult(default(AsyncVoid)); + } + + /// + /// Immediately upon reading the last MIME body part but before completing the read task, this method is + /// called to enable the to do any post processing on the + /// instances that have been read. For example, it can be used to copy the data to another location, or perform + /// some other kind of post processing on the data before completing the read operation. + /// + /// The token to monitor for cancellation requests. + /// A representing the post processing. + public virtual Task ExecutePostProcessingAsync(CancellationToken cancellationToken) + { + // Call the other overload to maintain backward compatibility. + return ExecutePostProcessingAsync(); + } + } +} diff --git a/src/DicomWebClient/Third-party/Microsoft/README.md b/src/DicomWebClient/Third-party/Microsoft/README.md new file mode 100644 index 000000000..1652d6604 --- /dev/null +++ b/src/DicomWebClient/Third-party/Microsoft/README.md @@ -0,0 +1,8 @@ +All files in this directory sourced from https://github.com/aspnet/AspNetWebStack/tree/1231b77d79956152831b75ad7f094f844251b97f and are needed in order to parse multipart/related content. + +All files in this directory are copyrighted and licensed with the following: + +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json index 472d20dbb..47c71c842 100755 --- a/src/DicomWebClient/packages.lock.json +++ b/src/DicomWebClient/packages.lock.json @@ -1,14 +1,14 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "fo-dicom": { "type": "Direct", - "requested": "[5.1.1, )", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "requested": "[5.1.2, )", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -17,38 +17,25 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, - "Microsoft.AspNet.WebApi.Client": { + "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[5.2.9, )", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, - "System.Linq.Async": { - "type": "Direct", - "requested": "[6.0.1, )", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -60,29 +47,6 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Dynamic.Runtime": "4.3.0", - "System.Globalization": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0" - } - }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -131,355 +95,11 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.Win32.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "NETStandard.Library": { - "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "10.0.1", - "contentHash": "ebWzW9j2nwxQeBo59As2TYn7nYr9BHicqqCwHOD1Vdo+50HBtLPuqdiCYJcLdTRknpYis/DSEOQz5KmZxwrIAg==", - "dependencies": { - "Microsoft.CSharp": "4.3.0", - "System.Collections": "4.3.0", - "System.ComponentModel.TypeConverter": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Dynamic.Runtime": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Runtime.Serialization.Formatters": "4.3.0", - "System.Runtime.Serialization.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0", - "System.Xml.XmlDocument": "4.3.0" - } - }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" - }, - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" - }, - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", - "dependencies": { - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" - } - }, - "runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", - "dependencies": { - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" - }, - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" - }, - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" - }, - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" - }, - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" - }, - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" - }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Collections.Concurrent": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Collections.NonGeneric": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Collections.Specialized": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", - "dependencies": { - "System.Collections.NonGeneric": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.ComponentModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.ComponentModel.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", - "dependencies": { - "System.ComponentModel": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.ComponentModel.TypeConverter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Collections.NonGeneric": "4.3.0", - "System.Collections.Specialized": "4.3.0", - "System.ComponentModel": "4.3.0", - "System.ComponentModel.Primitives": "4.3.0", - "System.Globalization": "4.3.0", - "System.Linq": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Diagnostics.Debug": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "6.0.0", @@ -488,593 +108,11 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Diagnostics.Tools": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Diagnostics.Tracing": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Dynamic.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Calendars": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0" - } - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.IO.FileSystem": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.FileSystem.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Linq": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Emit.Lightweight": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Net.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Net.Sockets": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.ObjectModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, - "System.Runtime.Numerics": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", - "dependencies": { - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Runtime.Serialization.Formatters": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KT591AkTNFOTbhZlaeMVvfax3RqhH1EJlcwF50Wm7sfnBLuHiOeZRRKrr1ns3NESkM20KPZ5Ol/ueMq5vg4QoQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Serialization.Primitives": "4.3.0" - } - }, - "System.Runtime.Serialization.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", - "dependencies": { - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Security.Cryptography.Algorithms": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.Apple": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Security.Cryptography.Csp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Security.Cryptography.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Linq": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", - "dependencies": { - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Security.Cryptography.X509Certificates": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", "resolved": "6.0.0", @@ -1083,17 +121,6 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Text.Encoding.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, "System.Text.Encodings.Web": { "type": "Transitive", "resolved": "6.0.0", @@ -1104,127 +131,22 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" } }, - "System.Text.RegularExpressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", - "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Threading.Channels": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Xml.ReaderWriter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Extensions": "4.3.0" - } - }, - "System.Xml.XDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" - } - }, - "System.Xml.XmlDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" - } - }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } } } diff --git a/src/InformaticsGateway/Common/ApplicationEntityNotFoundException.cs b/src/InformaticsGateway/Common/ApplicationEntityNotFoundException.cs index 43331945c..9da3b7621 100644 --- a/src/InformaticsGateway/Common/ApplicationEntityNotFoundException.cs +++ b/src/InformaticsGateway/Common/ApplicationEntityNotFoundException.cs @@ -15,7 +15,6 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { @@ -32,9 +31,5 @@ public ApplicationEntityNotFoundException(string message) : base(message) public ApplicationEntityNotFoundException(string message, Exception innerException) : base(message, innerException) { } - - protected ApplicationEntityNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs b/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs index fcae49e38..4ed6a29e3 100755 --- a/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs +++ b/src/InformaticsGateway/Common/DestinationNotSuppliedException.cs @@ -16,11 +16,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { - public class DestinationNotSuppliedException : Exception { public DestinationNotSuppliedException() @@ -34,10 +32,5 @@ public DestinationNotSuppliedException(string message) : base(message) public DestinationNotSuppliedException(string message, Exception innerException) : base(message, innerException) { } - - protected DestinationNotSuppliedException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } - } } diff --git a/src/InformaticsGateway/Common/DicomExtensions.cs b/src/InformaticsGateway/Common/DicomExtensions.cs index bd9eddb66..df90b7c08 100644 --- a/src/InformaticsGateway/Common/DicomExtensions.cs +++ b/src/InformaticsGateway/Common/DicomExtensions.cs @@ -15,7 +15,6 @@ * limitations under the License. */ -using System; using System.Collections.Generic; using System.Text.Json; using Ardalis.GuardClauses; @@ -35,12 +34,12 @@ public static class DicomExtensions /// /// list of SOP Class UIDs /// Array of DicomTransferSyntax or null if uids is null or empty. - /// Thrown in the specified UID is not a transfer syntax type. + /// Thrown in the specified UID is not a transfer syntax type. public static DicomTransferSyntax[] ToDicomTransferSyntaxArray(this IEnumerable uids) { if (uids.IsNullOrEmpty()) { - return Array.Empty(); + return []; } var dicomTransferSyntaxes = new List(); @@ -49,7 +48,7 @@ public static DicomTransferSyntax[] ToDicomTransferSyntaxArray(this IEnumerable< { dicomTransferSyntaxes.Add(DicomTransferSyntax.Lookup(DicomUID.Parse(uid))); } - return dicomTransferSyntaxes.ToArray(); + return [.. dicomTransferSyntaxes]; } public static string ToJson(this DicomFile dicomFile, DicomJsonOptions dicomJsonOptions, bool validateDicom) diff --git a/src/InformaticsGateway/Common/FileMoveException.cs b/src/InformaticsGateway/Common/FileMoveException.cs index 28011a838..55b777d03 100755 --- a/src/InformaticsGateway/Common/FileMoveException.cs +++ b/src/InformaticsGateway/Common/FileMoveException.cs @@ -15,11 +15,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { - [Serializable] public class FileMoveException : Exception { public FileMoveException() @@ -38,9 +36,5 @@ public FileMoveException(string source, string destination, Exception ex) : this($"Exception moving file from {source} to {destination}.", ex) { } - - protected FileMoveException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/FileUploadException.cs b/src/InformaticsGateway/Common/FileUploadException.cs index 071ae5171..730a52db7 100644 --- a/src/InformaticsGateway/Common/FileUploadException.cs +++ b/src/InformaticsGateway/Common/FileUploadException.cs @@ -16,11 +16,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { - [Serializable] public class FileUploadException : Exception { public FileUploadException() @@ -34,9 +32,5 @@ public FileUploadException(string message) : base(message) public FileUploadException(string message, Exception innerException) : base(message, innerException) { } - - protected FileUploadException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/InsufficientStorageAvailableException.cs b/src/InformaticsGateway/Common/InsufficientStorageAvailableException.cs index 3e68b4707..467a37d44 100755 --- a/src/InformaticsGateway/Common/InsufficientStorageAvailableException.cs +++ b/src/InformaticsGateway/Common/InsufficientStorageAvailableException.cs @@ -30,7 +30,6 @@ namespace Monai.Deploy.InformaticsGateway.Common { - [Serializable] public class InsufficientStorageAvailableException : Exception { public InsufficientStorageAvailableException() @@ -40,13 +39,9 @@ public InsufficientStorageAvailableException() public InsufficientStorageAvailableException(string message) : base(message) { } - public InsufficientStorageAvailableException(string message, Exception innerException) : base(message, innerException) - { - } - protected InsufficientStorageAvailableException(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) + public InsufficientStorageAvailableException(string message, Exception innerException) : base(message, innerException) { - throw new NotImplementedException(); } } } diff --git a/src/InformaticsGateway/Common/ObjectExistsException.cs b/src/InformaticsGateway/Common/ObjectExistsException.cs index f91f7b5ad..4f5db4bfa 100755 --- a/src/InformaticsGateway/Common/ObjectExistsException.cs +++ b/src/InformaticsGateway/Common/ObjectExistsException.cs @@ -16,11 +16,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { - [Serializable] public class ObjectExistsException : Exception { public ObjectExistsException() @@ -34,9 +32,5 @@ public ObjectExistsException(string message) : base(message) public ObjectExistsException(string message, Exception innerException) : base(message, innerException) { } - - protected ObjectExistsException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/PlugInInitializationException.cs b/src/InformaticsGateway/Common/PlugInInitializationException.cs index 955b53e9b..cfd20d5e8 100755 --- a/src/InformaticsGateway/Common/PlugInInitializationException.cs +++ b/src/InformaticsGateway/Common/PlugInInitializationException.cs @@ -15,7 +15,6 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { @@ -28,9 +27,5 @@ public PlugInInitializationException(string message) : base(message) public PlugInInitializationException(string message, Exception innerException) : base(message, innerException) { } - - protected PlugInInitializationException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/PlugInLoadingException.cs b/src/InformaticsGateway/Common/PlugInLoadingException.cs index fd697c6f2..6deac7d93 100644 --- a/src/InformaticsGateway/Common/PlugInLoadingException.cs +++ b/src/InformaticsGateway/Common/PlugInLoadingException.cs @@ -15,7 +15,6 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { @@ -28,9 +27,5 @@ public PlugInLoadingException(string message) : base(message) public PlugInLoadingException(string message, Exception innerException) : base(message, innerException) { } - - protected PlugInLoadingException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/PostPayloadException.cs b/src/InformaticsGateway/Common/PostPayloadException.cs index ab322b3a5..aa59081f2 100755 --- a/src/InformaticsGateway/Common/PostPayloadException.cs +++ b/src/InformaticsGateway/Common/PostPayloadException.cs @@ -15,7 +15,6 @@ */ using System; -using System.Runtime.Serialization; using Monai.Deploy.InformaticsGateway.Api.Storage; namespace Monai.Deploy.InformaticsGateway.Common @@ -42,9 +41,5 @@ public PostPayloadException(string message) : base(message) public PostPayloadException(string message, Exception innerException) : base(message, innerException) { } - - protected PostPayloadException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/ServiceException.cs b/src/InformaticsGateway/Common/ServiceException.cs index ad705a2db..50d392c79 100644 --- a/src/InformaticsGateway/Common/ServiceException.cs +++ b/src/InformaticsGateway/Common/ServiceException.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,11 +15,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { - [Serializable] public class ServiceException : Exception { public ServiceException(string message) : base(message) @@ -33,9 +31,5 @@ public ServiceException(string message, Exception innerException) : base(message public ServiceException() { } - - protected ServiceException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/ServiceNotFoundException.cs b/src/InformaticsGateway/Common/ServiceNotFoundException.cs index 6668aed50..8cc662f0c 100644 --- a/src/InformaticsGateway/Common/ServiceNotFoundException.cs +++ b/src/InformaticsGateway/Common/ServiceNotFoundException.cs @@ -16,11 +16,9 @@ using System; using System.Globalization; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Common { - [Serializable] public class ServiceNotFoundException : Exception { private static readonly string MessageFormat = "Required service '{0}' cannot be found or cannot be initialized."; @@ -38,9 +36,5 @@ public ServiceNotFoundException(string serviceName, Exception innerException) private ServiceNotFoundException() { } - - protected ServiceNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Common/Unsubscriber.cs b/src/InformaticsGateway/Common/Unsubscriber.cs index 45bdc3d6a..650bc7892 100644 --- a/src/InformaticsGateway/Common/Unsubscriber.cs +++ b/src/InformaticsGateway/Common/Unsubscriber.cs @@ -21,7 +21,7 @@ namespace Monai.Deploy.InformaticsGateway.Common { /// - /// Unsubscriber class is used with IObserver for unsubscribing from a notification service. + /// class is used with for unsubscribing from a notification service. /// /// internal class Unsubscriber : IDisposable diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index f1f927dd4..be9a5f7f0 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -13,13 +13,11 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway Exe - net6.0 + net8.0 Apache-2.0 true True @@ -29,46 +27,37 @@ be0fffc8-bebb-4509-a2c0-3c981e5415ab false enable + true - - - + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + - <_Parameter1>$(AssemblyName).Test - - - - @@ -79,13 +68,11 @@ - - @@ -94,7 +81,6 @@ - @@ -103,10 +89,9 @@ - - + \ No newline at end of file diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index be43e4ade..9a3da68e7 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -121,10 +121,10 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddScoped, OutputDataPlugInEngineFactory>(); services.AddScoped, InputHL7DataPlugInEngineFactory>(); - services.AddMonaiDeployStorageService(hostContext.Configuration!.GetSection("InformaticsGateway:storage:serviceAssemblyName").Value, Monai.Deploy.Storage.HealthCheckOptions.ServiceHealthCheck); + services.AddMonaiDeployStorageService(hostContext.Configuration!.GetSection("InformaticsGateway:storage:serviceAssemblyName").Value!, Monai.Deploy.Storage.HealthCheckOptions.ServiceHealthCheck); - services.AddMonaiDeployMessageBrokerPublisherService(hostContext.Configuration.GetSection("InformaticsGateway:messaging:publisherServiceAssemblyName").Value, true); - services.AddMonaiDeployMessageBrokerSubscriberService(hostContext.Configuration.GetSection("InformaticsGateway:messaging:subscriberServiceAssemblyName").Value, true); + services.AddMonaiDeployMessageBrokerPublisherService(hostContext.Configuration.GetSection("InformaticsGateway:messaging:publisherServiceAssemblyName").Value!, true); + services.AddMonaiDeployMessageBrokerSubscriberService(hostContext.Configuration.GetSection("InformaticsGateway:messaging:subscriberServiceAssemblyName").Value!, true); services.AddSingleton(); services.AddSingleton(); diff --git a/src/InformaticsGateway/Services/Connectors/IPayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/IPayloadAssembler.cs index 05035065b..6c72b2daf 100644 --- a/src/InformaticsGateway/Services/Connectors/IPayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/IPayloadAssembler.cs @@ -44,6 +44,16 @@ internal interface IPayloadAssembler /// Number of seconds to wait for additional files. Task Queue(string bucket, FileStorageMetadata file, DataOrigin dataOrigin, uint timeout); + /// + /// Queue a new file for the specified payload bucket. + /// + /// The bucket group the file belongs to. + /// Path to the file to be added to the payload bucket. + /// The service that triggered this queue request + /// Number of seconds to wait for additional files. + /// Cancellation token. + Task Queue(string bucket, FileStorageMetadata file, DataOrigin dataOrigin, uint timeout, CancellationToken cancellationToken); + /// /// Dequeue a payload from the queue for the message broker to notify subscribers. /// The default implementation blocks the call until a file is available from the queue. @@ -51,4 +61,4 @@ internal interface IPayloadAssembler /// Propagates notification that operations should be canceled. Payload Dequeue(CancellationToken cancellationToken); } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index 1222add24..bc784031f 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -44,6 +44,7 @@ internal sealed partial class PayloadAssembler : IPayloadAssembler, IDisposable private readonly ILogger _logger; private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly CancellationTokenSource _tokenSource; private readonly ConcurrentDictionary> _payloads; private readonly Task _intializedTask; private readonly BlockingCollection _workItems; @@ -56,7 +57,8 @@ public PayloadAssembler( _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); - _workItems = new BlockingCollection(); + _workItems = []; + _tokenSource = new CancellationTokenSource(); _payloads = new ConcurrentDictionary>(); _intializedTask = RemovePendingPayloads(); @@ -95,7 +97,16 @@ private async Task RemovePendingPayloads() /// Instance to be queued /// The service that triggered this queue request /// Number of seconds the bucket shall wait before sending the payload to be processed. Note: timeout cannot be modified once the bucket is created. - public async Task Queue(string bucket, FileStorageMetadata file, DataOrigin dataOrigin, uint timeout) + public async Task Queue(string bucket, FileStorageMetadata file, DataOrigin dataOrigin, uint timeout) => await Queue(bucket, file, dataOrigin, timeout, CancellationToken.None).ConfigureAwait(false); + /// + /// Queues a new instance of . + /// + /// Name of the bucket where the file would be added to + /// Instance to be queued + /// The service that triggered this queue request + /// Number of seconds the bucket shall wait before sending the payload to be processed. Note: timeout cannot be modified once the bucket is created. + /// Cancellation token. + public async Task Queue(string bucket, FileStorageMetadata file, DataOrigin dataOrigin, uint timeout, CancellationToken cancellationToken) { Guard.Against.Null(file, nameof(file)); @@ -103,7 +114,7 @@ public async Task Queue(string bucket, FileStorageMetadata file, DataOrigi using var _ = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", file.CorrelationId } }); - var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, file.PayloadId).ConfigureAwait(false); + var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, file.PayloadId, cancellationToken).ConfigureAwait(false); payload.Add(file); _logger.FileAddedToBucket(payload.Key, payload.Count, file.PayloadId ?? "null"); return payload.PayloadId; @@ -133,7 +144,7 @@ private async void OnTimedEvent(Object? source, System.Timers.ElapsedEventArgs e } foreach (var key in _payloads.Keys) { - var payload = await _payloads[key].Task.ConfigureAwait(false); + var payload = await _payloads[key].WithCancellation(_tokenSource.Token); using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", payload.CorrelationId } }); _logger.BucketElapsedTime(key, payload.Timeout, payload.ElapsedTime().TotalSeconds, payload.Files.Count, payload.FilesUploaded, payload.FilesFailedToUpload); @@ -200,21 +211,25 @@ private async Task QueueBucketForNotification(string key, Payload payload) } } - private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder = null) + private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder = null, CancellationToken cancellationToken = default) { - return await _payloads.GetOrAdd(key, x => new AsyncLazy(async () => - { - var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService(); - var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null, destinationFolder); - await repository.AddAsync(newPayload).ConfigureAwait(false); - _logger.BucketCreated(key, timeout); - return newPayload; - })); + var payload = _payloads.GetOrAdd(key, x => new AsyncLazy((cancellationToken) => PayloadFactory(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, destinationFolder, cancellationToken))); + return await payload.WithCancellation(cancellationToken).ConfigureAwait(false); + } + + private async Task PayloadFactory(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder, CancellationToken cancellationToken) + { + var scope = _serviceScopeFactory.CreateScope(); + var repository = scope.ServiceProvider.GetRequiredService(); + var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null, destinationFolder); + await repository.AddAsync(newPayload, cancellationToken).ConfigureAwait(false); + _logger.BucketCreated(key, timeout); + return newPayload; } public void Dispose() { + _tokenSource.Cancel(); _payloads.Clear(); _timer.Stop(); } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadMoveException.cs b/src/InformaticsGateway/Services/Connectors/PayloadMoveException.cs index 45cd651a9..18293e91a 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadMoveException.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadMoveException.cs @@ -18,7 +18,6 @@ namespace Monai.Deploy.InformaticsGateway.Services.Connectors { - [Serializable] public class PayloadNotifyException : Exception { public FailureReason Reason { get; } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs index 45bc68268..e783faeaf 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs @@ -321,6 +321,7 @@ protected virtual void Dispose(bool disposing) { if (disposing) { + _cancellationTokenSource.Dispose(); _scope.Dispose(); } diff --git a/src/InformaticsGateway/Services/DicomWeb/ConvertStreamException.cs b/src/InformaticsGateway/Services/DicomWeb/ConvertStreamException.cs index fd411f283..04dc14750 100644 --- a/src/InformaticsGateway/Services/DicomWeb/ConvertStreamException.cs +++ b/src/InformaticsGateway/Services/DicomWeb/ConvertStreamException.cs @@ -15,11 +15,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Services.DicomWeb { - [Serializable] public class ConvertStreamException : Exception { public ConvertStreamException() @@ -33,9 +31,5 @@ public ConvertStreamException(string message) : base(message) public ConvertStreamException(string message, Exception innerException) : base(message, innerException) { } - - protected ConvertStreamException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index b6f73b1c6..00b5f4b0e 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -79,7 +79,7 @@ public abstract class ExportServiceBase : IHostedService, IMonaiService, IDispos /// Override the ExportDataBlockCallback method to customize export logic. /// Must update State to either Succeeded or Failed. /// - /// + /// /// /// protected abstract Task ExportDataBlockCallback(ExportRequestDataMessage exportRequestData, CancellationToken cancellationToken); diff --git a/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs b/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs index 0b2860011..61af23027 100755 --- a/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs +++ b/src/InformaticsGateway/Services/Export/ExternalAppExeception.cs @@ -15,7 +15,6 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Services.Export { @@ -32,9 +31,5 @@ public ExternalAppExeception(string message) : base(message) public ExternalAppExeception(string message, Exception innerException) : base(message, innerException) { } - - protected ExternalAppExeception(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Services/Export/ScuExportService.cs b/src/InformaticsGateway/Services/Export/ScuExportService.cs index 09d47a48a..d87e73e6a 100755 --- a/src/InformaticsGateway/Services/Export/ScuExportService.cs +++ b/src/InformaticsGateway/Services/Export/ScuExportService.cs @@ -18,16 +18,13 @@ using System; using System.Threading; using System.Threading.Tasks; -using System.Threading.Tasks.Dataflow; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.Messaging.Common; -using Monai.Deploy.Messaging.Events; namespace Monai.Deploy.InformaticsGateway.Services.Export { diff --git a/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs b/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs index 7dc3ba299..f3643ff2a 100644 --- a/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs +++ b/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs @@ -53,7 +53,7 @@ public async Task GetContentAsync(HttpRequest request, string c Guard.Against.NullOrWhiteSpace(correlationId, nameof(correlationId)); Guard.Against.NullOrInvalidInput(mediaTypeHeaderValue, nameof(mediaTypeHeaderValue), (value) => { - return value.MediaType.Value.Equals(ContentTypes.ApplicationFhirJson, StringComparison.OrdinalIgnoreCase); + return value.MediaType.Value!.Equals(ContentTypes.ApplicationFhirJson, StringComparison.OrdinalIgnoreCase); }); _logger.ParsingFhirJson(); @@ -95,4 +95,4 @@ private static string SetIdIfMIssing(string correlationId, JsonNode jsonDoc) return jsonDoc[Resources.PropertyId]?.GetValue() ?? string.Empty; } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/Fhir/FhirStoreException.cs b/src/InformaticsGateway/Services/Fhir/FhirStoreException.cs index 23d4f1971..cde0030a3 100755 --- a/src/InformaticsGateway/Services/Fhir/FhirStoreException.cs +++ b/src/InformaticsGateway/Services/Fhir/FhirStoreException.cs @@ -15,11 +15,9 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Services.Fhir { - [Serializable] public class FhirStoreException : Exception { public OperationOutcome OperationOutcome { get; } = new(); @@ -47,9 +45,5 @@ public FhirStoreException(string correlationId, string message, IssueType issueT Text = message }); } - - protected FhirStoreException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs b/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs index 465e609e0..21dc4c1f3 100644 --- a/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs +++ b/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs @@ -53,7 +53,7 @@ public async Task GetContentAsync(HttpRequest request, string c Guard.Against.NullOrWhiteSpace(correlationId, nameof(correlationId)); Guard.Against.NullOrInvalidInput(mediaTypeHeaderValue, nameof(mediaTypeHeaderValue), (value) => { - return value.MediaType.Value.Equals(ContentTypes.ApplicationFhirXml, StringComparison.OrdinalIgnoreCase); + return value.MediaType.Value!.Equals(ContentTypes.ApplicationFhirXml, StringComparison.OrdinalIgnoreCase); }); _logger.ParsingFhirXml(); @@ -117,4 +117,4 @@ private static string SetIdIfMIssing(string correlationId, XmlNamespaceManager x return idNode.Attributes[Resources.AttributeValue]!.Value; } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs b/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs index ebb73e6aa..ec5518c9e 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/Hl7SendException.cs @@ -15,7 +15,6 @@ */ using System; -using System.Runtime.Serialization; namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 { @@ -32,9 +31,5 @@ public Hl7SendException(string message) : base(message) public Hl7SendException(string message, Exception innerException) : base(message, innerException) { } - - protected Hl7SendException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index 520043b0d..cc8a0c36d 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -57,7 +57,7 @@ public MllpClient(ITcpClientAdapter client, Hl7Configuration configurations, ILo _exceptions = new List(); _messages = new List(); - _loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "Endpoint", _client.RemoteEndPoint }, { "CorrelationId", ClientId } }); + _loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "Endpoint", _client.RemoteEndPoint }, { "CorrelationId", ClientId } })!; } public async Task Start(Func onDisconnect, CancellationToken cancellationToken) diff --git a/src/InformaticsGateway/Services/Http/Startup.cs b/src/InformaticsGateway/Services/Http/Startup.cs index 6f0779ebd..bc72741c6 100755 --- a/src/InformaticsGateway/Services/Http/Startup.cs +++ b/src/InformaticsGateway/Services/Http/Startup.cs @@ -18,6 +18,7 @@ using System.Net.Mime; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; using FellowOakDicom.Serialization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -48,6 +49,7 @@ public Startup(IConfiguration configuration) public void ConfigureServices(IServiceCollection services) { services.AddHttpContextAccessor(); + services.AddHttpLogging(o => { }); services.AddControllers(opts => { opts.RespectBrowserAcceptHeader = true; @@ -61,6 +63,7 @@ public void ConfigureServices(IServiceCollection services) WriteIndented = false }; + jsonSerializerOptions.TypeInfoResolver ??= JsonTypeInfoResolver.Combine(); jsonSerializerOptions.Converters.Add(new JsonStringEnumMemberConverter(JsonNamingPolicy.CamelCase, false)); jsonSerializerOptions.Converters.Add(new DicomJsonConverter(writeTagsAsKeywords: false, autoValidate: false)); opts.OutputFormatters.Add(new FhirJsonFormatters(jsonSerializerOptions)); diff --git a/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs b/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs index aa6f1e459..9d9551e53 100755 --- a/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs +++ b/src/InformaticsGateway/Services/Scp/ExternalAppScpService.cs @@ -67,11 +67,11 @@ public override void ServiceStart() NetworkManager.IPv4Any, ScpPort, logger: _scpServiceInternalLogger, - userState: _associationDataProvider); + userState: _associationDataProvider, + configure: configure => configure.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations); Server.Options.IgnoreUnsupportedTransferSyntaxChange = true; Server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; - Server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; if (Server.Exception != null) { diff --git a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs index d8c224a04..897ab9eb2 100755 --- a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs @@ -32,10 +32,11 @@ public interface IApplicationEntityManager /// /// Handles the C-Store request. /// - /// Instance of . + /// Instance of . /// Called AE Title to be associated with the call. - /// Calling AE Title to be associated with the call. + /// Calling AE Title to be associated with the call. /// Unique association ID. + /// SCP input type. Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId, ScpInputTypeEnum type = ScpInputTypeEnum.WorkflowTrigger); /// @@ -55,6 +56,7 @@ public interface IApplicationEntityManager /// Checks if source AE Title is configured. /// /// + /// /// Task IsValidSourceAsync(string callingAe, string host); } diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs b/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs index 832ebec13..67b1b63ac 100755 --- a/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs +++ b/src/InformaticsGateway/Services/Scp/ScpServiceBase.cs @@ -105,11 +105,11 @@ public void ServiceStartBase(int ScpPort) NetworkManager.IPv4Any, ScpPort, logger: _scpServiceInternalLogger, - userState: _associationDataProvider); + userState: _associationDataProvider, + configure: configure => configure.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations); Server.Options.IgnoreUnsupportedTransferSyntaxChange = true; Server.Options.LogDimseDatasets = _configuration.Value.Dicom.Scp.LogDimseDatasets; - Server.Options.MaxClientsAllowed = _configuration.Value.Dicom.Scp.MaximumNumberOfAssociations; if (Server.Exception != null) { diff --git a/src/InformaticsGateway/Services/Scu/ScuService.cs b/src/InformaticsGateway/Services/Scu/ScuService.cs index 1833955d7..4326d0535 100755 --- a/src/InformaticsGateway/Services/Scu/ScuService.cs +++ b/src/InformaticsGateway/Services/Scu/ScuService.cs @@ -65,7 +65,7 @@ private Task BackgroundProcessing(CancellationToken cancellationToken) { var item = _workQueue.Dequeue(cancellationToken); - var linkedCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, item.CancellationToken); + using var linkedCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, item.CancellationToken); ProcessThread(item, linkedCancellationToken.Token); } diff --git a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs index 49d894728..fbbaffd7b 100755 --- a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs +++ b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs @@ -213,7 +213,7 @@ private async Task VerifyExists(string path, CancellationToken cancellatio }) .ExecuteAsync(async () => { - var internalCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + using var internalCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); internalCancellationTokenSource.CancelAfter(_configuration.Value.Storage.StorageServiceListTimeout); var exists = await _storageService.VerifyObjectExistsAsync(_configuration.Value.Storage.StorageServiceBucketName, path).ConfigureAwait(false); _logger.VerifyFileExists(path, exists); @@ -268,6 +268,7 @@ protected virtual void Dispose(bool disposing) { if (disposing) { + _cancellationTokenSource.Dispose(); _scope.Dispose(); } diff --git a/src/InformaticsGateway/Services/Storage/StoageInfoProvider.cs b/src/InformaticsGateway/Services/Storage/StoageInfoProvider.cs index 6e9eb0b17..8d8af6ed5 100644 --- a/src/InformaticsGateway/Services/Storage/StoageInfoProvider.cs +++ b/src/InformaticsGateway/Services/Storage/StoageInfoProvider.cs @@ -54,7 +54,7 @@ public long AvailableFreeSpace { get { - var driveInfo = _fileSystem.DriveInfo.FromDriveName(_localTemporaryStoragePath); + var driveInfo = _fileSystem.DriveInfo.New(_localTemporaryStoragePath); return driveInfo.AvailableFreeSpace; } } @@ -79,7 +79,7 @@ public StorageInfoProvider( private void Initialize() { - var driveInfo = _fileSystem.DriveInfo.FromDriveName(_localTemporaryStoragePath); + var driveInfo = _fileSystem.DriveInfo.New(_localTemporaryStoragePath); _reservedSpace = (long)(driveInfo.TotalSize * (1 - (_storageConfiguration.Watermark / 100.0))); _reservedSpace = Math.Max(_reservedSpace, _storageConfiguration.ReserveSpaceGB * OneGB); _logger.StorageInfoProviderStartup(_localTemporaryStoragePath, driveInfo.TotalSize, _reservedSpace); @@ -87,7 +87,7 @@ private void Initialize() private bool IsSpaceAvailable() { - var driveInfo = _fileSystem.DriveInfo.FromDriveName(_localTemporaryStoragePath); + var driveInfo = _fileSystem.DriveInfo.New(_localTemporaryStoragePath); var freeSpace = driveInfo.AvailableFreeSpace; diff --git a/src/InformaticsGateway/Test/Common/DicomFileStorageMetadataExtensionsTest.cs b/src/InformaticsGateway/Test/Common/DicomFileStorageMetadataExtensionsTest.cs index dc6a585de..1e5c7bf36 100644 --- a/src/InformaticsGateway/Test/Common/DicomFileStorageMetadataExtensionsTest.cs +++ b/src/InformaticsGateway/Test/Common/DicomFileStorageMetadataExtensionsTest.cs @@ -48,13 +48,13 @@ public async Task GivenADicomFileStorageMetadata_WhenSetDataStreamsIsCalledWithI var dicom = InstanceGenerator.GenerateDicomFile(); var json = dicom.ToJson(DicomJsonOptions.Complete, false); - await metadata.SetDataStreams(dicom, json, TemporaryDataStorageLocation.Memory).ConfigureAwait(false); + await metadata.SetDataStreams(dicom, json, TemporaryDataStorageLocation.Memory).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(metadata.File.Data); Assert.NotNull(metadata.JsonFile.Data); var ms = new MemoryStream(); - await dicom.SaveAsync(ms).ConfigureAwait(false); + await dicom.SaveAsync(ms).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(ms.ToArray(), (metadata.File.Data as MemoryStream).ToArray()); var jsonFromStream = Encoding.UTF8.GetString((metadata.JsonFile.Data as MemoryStream).ToArray()); @@ -82,13 +82,13 @@ public async Task GivenADicomFileStorageMetadata_WhenSetDataStreamsIsCalledWithD var dicom = InstanceGenerator.GenerateDicomFile(); var json = dicom.ToJson(DicomJsonOptions.Complete, false); - await metadata.SetDataStreams(dicom, json, TemporaryDataStorageLocation.Disk, fileSystem, "/temp").ConfigureAwait(false); + await metadata.SetDataStreams(dicom, json, TemporaryDataStorageLocation.Disk, fileSystem, "/temp").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(metadata.File.Data); Assert.NotNull(metadata.JsonFile.Data); var ms = new MemoryStream(); - await dicom.SaveAsync(ms).ConfigureAwait(false); + await dicom.SaveAsync(ms).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); using var temporaryDataAsMemoryStream = new MemoryStream(); metadata.File.Data.CopyTo(temporaryDataAsMemoryStream); @@ -126,7 +126,7 @@ public void GivenADicomFileStorageMetadataWithInvalidDSValue_WhenSetDataStreamsI Assert.Throws(() => dicom.ToJson(DicomJsonOptions.Complete, true)); } - [Fact] + [Fact(Skip = "Disabled due to bug in 5.1.2")] public async Task GivenADicomFileStorageMetadataWithInvalidDSValue_WhenSetDataStreamsIsCalled_ExpectDataStreamsAreSet() { var metadata = new DicomFileStorageMetadata( @@ -146,13 +146,13 @@ public async Task GivenADicomFileStorageMetadataWithInvalidDSValue_WhenSetDataSt dicom.Dataset.Add(DicomTag.PixelSpacing, "0.68300002813334234392234", "0.2354257587243524352345"); var json = dicom.ToJson(DicomJsonOptions.Complete, false); - await metadata.SetDataStreams(dicom, json, TemporaryDataStorageLocation.Memory).ConfigureAwait(false); + await metadata.SetDataStreams(dicom, json, TemporaryDataStorageLocation.Memory).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(metadata.File.Data); Assert.NotNull(metadata.JsonFile.Data); var ms = new MemoryStream(); - await dicom.SaveAsync(ms).ConfigureAwait(false); + await dicom.SaveAsync(ms).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Equal(ms.ToArray(), (metadata.File.Data as MemoryStream).ToArray()); var jsonFromStream = Encoding.UTF8.GetString((metadata.JsonFile.Data as MemoryStream).ToArray()); @@ -162,4 +162,4 @@ public async Task GivenADicomFileStorageMetadataWithInvalidDSValue_WhenSetDataSt Assert.Equal(dicom.Dataset, dicomFileFromJson); } } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj index 7c303125e..4ec376ef3 100755 --- a/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj +++ b/src/InformaticsGateway/Test/Monai.Deploy.InformaticsGateway.Test.csproj @@ -13,44 +13,35 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 Monai.Deploy.InformaticsGateway.Test false Apache-2.0 true - - all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - @@ -58,19 +49,16 @@ - Always - - @@ -78,4 +66,4 @@ - + \ No newline at end of file diff --git a/src/InformaticsGateway/Test/Plug-ins/Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj b/src/InformaticsGateway/Test/Plug-ins/Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj index 6a69a7568..909968d6d 100644 --- a/src/InformaticsGateway/Test/Plug-ins/Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj +++ b/src/InformaticsGateway/Test/Plug-ins/Monai.Deploy.InformaticsGateway.Test.PlugIns.csproj @@ -13,19 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.Test.PlugIns Monai.Deploy.InformaticsGateway.Test.PlugIns - net6.0 + net8.0 enable enable - - - + \ No newline at end of file diff --git a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs index 385bfb97a..55e63b0a5 100755 --- a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineFactoryTest.cs @@ -36,7 +36,7 @@ namespace Monai.Deploy.InformaticsGateway.Test.Services.Common public class InputDataPlugInEngineFactoryTest { private readonly Mock> _logger; - private readonly FileSystem _fileSystem; + private readonly IFileSystem _fileSystem; private readonly ITestOutputHelper _output; public InputDataPlugInEngineFactoryTest(ITestOutputHelper output) diff --git a/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs b/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs index 1d3ed888f..31cbc41b9 100644 --- a/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/Pagination/PagedResponseTest.cs @@ -30,7 +30,7 @@ public void SetUp_GivenExpectedInput_ReturnsExpectedResult() { var filter = new PaginationFilter(); var data = new List { "orange", "apple", "donkey" }; - var pagedResponse = new PagedResponse>(data,0, 3); + var pagedResponse = new PagedResponse>(data, 0, 3); var uriService = new UriService(new Uri("https://test.com")); pagedResponse.SetUp(filter, 9, uriService, "test"); @@ -38,7 +38,6 @@ public void SetUp_GivenExpectedInput_ReturnsExpectedResult() Assert.Equal(pagedResponse.LastPage, "/test?pageNumber=3&pageSize=3"); Assert.Equal(pagedResponse.NextPage, "/test?pageNumber=2&pageSize=3"); Assert.Null(pagedResponse.PreviousPage); - } } } diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs index 064d39052..5b4ae127e 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs @@ -122,7 +122,7 @@ await payloadAssembler.Queue( } [RetryFact(10, 200)] - public async Task GivenAPayloadThatHasNotCompleteUploads_WhenProcessedByTimedEvent_ExpectToBeRemovedFromQueue() + public async Task GivenAPayloadThatHasIncompleteUploads_WhenProcessedByTimedEvent_ExpectToBeRemovedFromQueue() { var payloadAssembler = new PayloadAssembler(_logger.Object, _serviceScopeFactory.Object); diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs index a4d79cebc..e116762c6 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs @@ -24,7 +24,6 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.SharedTest; diff --git a/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs b/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs index e076e06e8..afdb3e6f0 100755 --- a/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/ExportServiceBaseTest.cs @@ -102,7 +102,7 @@ protected override async Task ProcessMessage(MessageReceivedEventArgs eventArgs) } exportFlow.Complete(); - await reportingActionBlock.Completion.ConfigureAwait(false); + await reportingActionBlock.Completion.ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); } } diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 1f2119bc6..7c94b55e0 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -246,11 +246,11 @@ public async Task GivenConnectedTcpClients_WhenDisconnects_ExpectServiceToDispos _ = service.StartAsync(_cancellationTokenSource.Token); Assert.True(checkEvent.Wait(3000)); - await Task.Delay(200).ConfigureAwait(false); + await Task.Delay(200).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(service.ActiveConnections > 0); _cancellationTokenSource.Cancel(); - await Task.Delay(500).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); service.Dispose(); client.Verify(p => p.Dispose(), Times.Exactly(callCount)); @@ -271,7 +271,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenStorageSpaceIsLow_ExpectToD _ = service.StartAsync(_cancellationTokenSource.Token); _cancellationTokenSource.CancelAfter(400); - await Task.Delay(500).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); clientAdapter.Verify(p => p.Close(), Times.AtLeastOnce()); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Never()); @@ -315,7 +315,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _ = service.StartAsync(_cancellationTokenSource.Token); Assert.True(checkEvent.Wait(3000)); - await Task.Delay(500).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _uploadQueue.Verify(p => p.Queue(It.IsAny()), Times.Exactly(3)); _payloadAssembler.Verify(p => p.Queue(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); @@ -362,7 +362,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _ = service.StartAsync(_cancellationTokenSource.Token); Assert.True(checkEvent.Wait(3000)); - await Task.Delay(500).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _mIIpExtract.Verify(p => p.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); } diff --git a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs index 89bfc3e7d..cea575eef 100755 --- a/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/DicomAssociationInfoControllerTest.cs @@ -36,7 +36,7 @@ namespace Monai.Deploy.InformaticsGateway.Test.Services.Http public class DicomAssociationInfoControllerTest { private readonly Mock> _logger; - private Mock _loggerFactory; + private readonly Mock _loggerFactory; private readonly DicomAssociationInfoController _controller; private readonly IOptions _options; private readonly Mock _repo; @@ -73,7 +73,7 @@ public async Task GetAllAsync_GiveExpectedInput_ReturnsOK() var okResult = Assert.IsType(result); var response = Assert.IsType>>(okResult.Value); - Assert.Equal(0 ,response.TotalRecords); + Assert.Equal(0, response.TotalRecords); Assert.Empty(response.Data); } } diff --git a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs index df9934201..fb9490a1d 100755 --- a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs @@ -172,8 +172,8 @@ public async Task IsValidSource_FalseWhenAEIsEmptyAsync() _monaiAeChangedNotificationService, _connfiguration); - Assert.False(await manager.IsValidSourceAsync(" ", "123").ConfigureAwait(false)); - Assert.False(await manager.IsValidSourceAsync("AAA", "").ConfigureAwait(false)); + Assert.False(await manager.IsValidSourceAsync(" ", "123").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); + Assert.False(await manager.IsValidSourceAsync("AAA", "").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); } [RetryFact(5, 250, DisplayName = "IsValidSource - False when no matching source found")] @@ -195,7 +195,7 @@ public async Task IsValidSource_FalseWhenNoMatchingSourceAsync() )); var sourceAeTitle = "ValidSource"; - Assert.False(await manager.IsValidSourceAsync(sourceAeTitle, "1.2.3.4").ConfigureAwait(false)); + Assert.False(await manager.IsValidSourceAsync(sourceAeTitle, "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); _sourceEntityRepository.Verify(p => p.ContainsAsync(It.IsAny>>(), It.IsAny()), Times.Once()); _logger.VerifyLoggingMessageBeginsWith($"Available source AET: SAE @ 1.2.3.4.", LogLevel.Information, Times.Once()); @@ -213,7 +213,7 @@ public async Task IsValidSource_TrueAsync() _sourceEntityRepository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())) .ReturnsAsync(true); - Assert.True(await manager.IsValidSourceAsync(aet, "1.2.3.4").ConfigureAwait(false)); + Assert.True(await manager.IsValidSourceAsync(aet, "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); _sourceEntityRepository.Verify(p => p.ContainsAsync(It.IsAny>>(), It.IsAny()), Times.Once()); } @@ -233,7 +233,7 @@ public async Task ShallHandleAEChangeEventsAsync() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Added)); - Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); _monaiAeChangedNotificationService.Notify(new MonaiApplicationentityChangedEvent( new MonaiApplicationEntity @@ -241,7 +241,7 @@ public async Task ShallHandleAEChangeEventsAsync() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Updated)); - Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); _monaiAeChangedNotificationService.Notify(new MonaiApplicationentityChangedEvent( new MonaiApplicationEntity @@ -249,7 +249,7 @@ public async Task ShallHandleAEChangeEventsAsync() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Deleted)); - Assert.False(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); + Assert.False(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); } [RetryFact(5, 250, DisplayName = "Shall prevent AE update when AE Title do not match")] @@ -267,7 +267,7 @@ public async Task ShallPreventAEUpdateWHenAETDoNotMatchAsync() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Added)); - Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); _monaiAeChangedNotificationService.Notify(new MonaiApplicationentityChangedEvent( new MonaiApplicationEntity @@ -276,8 +276,8 @@ public async Task ShallPreventAEUpdateWHenAETDoNotMatchAsync() Name = "AE1" }, ChangedEventType.Updated)); - Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); - Assert.False(await manager.IsAeTitleConfiguredAsync("AE2").ConfigureAwait(false)); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); + Assert.False(await manager.IsAeTitleConfiguredAsync("AE2").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); } [RetryFact(5, 250, DisplayName = "Shall handle CS Store Request")] @@ -296,7 +296,7 @@ public async Task ShallHandleCStoreRequest() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Added)); - Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)); var request = GenerateRequest(); await manager.HandleCStoreRequest(request, "AE1", "AE", associationId, InformaticsGateway.Services.Common.ScpInputTypeEnum.WorkflowTrigger); diff --git a/src/InformaticsGateway/Test/Services/Storage/StorageInfoProviderTest.cs b/src/InformaticsGateway/Test/Services/Storage/StorageInfoProviderTest.cs index ce3204da8..a6eec4385 100644 --- a/src/InformaticsGateway/Test/Services/Storage/StorageInfoProviderTest.cs +++ b/src/InformaticsGateway/Test/Services/Storage/StorageInfoProviderTest.cs @@ -37,7 +37,7 @@ public StorageInfoProviderTest() _configuration = Options.Create(new InformaticsGatewayConfiguration()); _driveInfo = new Mock(); - _fileSystem.Setup(p => p.DriveInfo.FromDriveName(It.IsAny())) + _fileSystem.Setup(p => p.DriveInfo.New(It.IsAny())) .Returns(_driveInfo.Object); _fileSystem.Setup(p => p.Directory.CreateDirectory(It.IsAny())); _fileSystem.Setup(p => p.Path.GetFullPath(It.IsAny())).Returns((string path) => System.IO.Path.GetFullPath(path)); diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json old mode 100755 new mode 100644 index 0cbb69366..4fd6571e0 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -1,81 +1,39 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", "resolved": "6.0.0", "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.11.0, )", - "resolved": "6.11.0", - "contentHash": "aBaagwdNtVKkug1F3imGXUlmoBd8ZUZX8oQ5niThaJhF79SpESe1Gzq7OFuZkQdKD5Pa4Mone+jrbas873AT4g==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, - "Microsoft.AspNetCore.Mvc.WebApiCompatShim": { - "type": "Direct", - "requested": "[2.2.0, )", - "resolved": "2.2.0", - "contentHash": "YKovpp46Fgah0N8H4RGb+7x9vdjj50mS3NON910pYJFQmn20Cd1mYVkTunjy/DrZpvwmJ8o5Es0VnONSYVXEAQ==", - "dependencies": { - "Microsoft.AspNet.WebApi.Client": "5.2.6", - "Microsoft.AspNetCore.Mvc.Core": "2.2.0", - "Microsoft.AspNetCore.Mvc.Formatters.Json": "2.2.0", - "Microsoft.AspNetCore.WebUtilities": "2.2.0" - } - }, - "Microsoft.EntityFrameworkCore.InMemory": { - "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25" - } - }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, - "Swashbuckle.AspNetCore": { - "type": "Direct", - "requested": "[6.5.0, )", - "resolved": "6.5.0", - "contentHash": "FK05XokgjgwlCI6wCT+D4/abtQkL1X1/B9Oas6uIwHFmYrIO9WUD5aLC9IzMs9GnHfUXOtXZ2S43gN1mhs5+aA==", - "dependencies": { - "Microsoft.Extensions.ApiDescription.Server": "6.0.5", - "Swashbuckle.AspNetCore.Swagger": "6.5.0", - "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0", - "Swashbuckle.AspNetCore.SwaggerUI": "6.5.0" - } - }, "System.IO.Abstractions.TestingHelpers": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Dp6gPoqJ7i8dRGubfxzA219fFCtkam9BgSmuIT+fQcFPKkW6vx9PuLTSELsNq+gRoEAzxGbWjsT/3WslfcmRfg==", "dependencies": { - "System.IO.Abstractions": "17.2.3" + "TestableIO.System.IO.Abstractions.TestingHelpers": "20.0.4" } }, "xRetry": { @@ -89,46 +47,46 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AspNetCore.HealthChecks.MongoDb": { "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "0R3NVbsjMhS5fd2hGijzQNKJ0zQBv/qMC7nkpmnbtgribCj7vfNdAhSqv4lwbibffRWPW5A/7VNJMX4aPej0WQ==", + "resolved": "8.0.0", + "contentHash": "0YjJlCwkwulozPxFCRcJAl2CdjU5e5ekj4/BQsA6GZbzRxwtN3FIg7LJcWUUgMdwqDoe+6SKFBRnSRpfLY4owA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.2", - "MongoDB.Driver": "2.14.1" + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "MongoDB.Driver": "2.22.0" } }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -141,8 +99,8 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -154,27 +112,27 @@ }, "DotNext": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "5Xp6G9U0MhSmfgxKklUUsOFfSg2VqF+/rkd7WyoUs7HqbnVd32bRw2rWW5o+rieHLzUlW/sagctPiaZqmeTA+g==", + "resolved": "4.15.2", + "contentHash": "Q5l6yVmJh9ow2MjDPSMOAj1N9fZpuu1SFRLEEjL5shk5i80GU0PsqoNDKFsAI7ciePoAP6y8mkARpmmDzP4Xqw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "DotNext.Threading": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "G/AogSunqiZZ/0H4y3Qy/YNveIB+6azddStmFxbxLWkruXZ27gXyoRQ9kQ2gpDbq/+YfMINz9nmTY5ZtuCzuyw==", + "resolved": "4.15.2", + "contentHash": "bOOePY7XQTMtOQ+0cui3K9x44Q8CEpH/tXfXFHPBZjwFexa9SBevMGvHO6MINHC1QnKUP9nHZIIMQ3Jfr88aQQ==", "dependencies": { - "DotNext": "4.7.4", - "System.Threading.Channels": "6.0.0" + "DotNext": "4.15.2", + "System.Threading.Channels": "7.0.0" } }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -183,7 +141,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -192,289 +150,163 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" }, - "Microsoft.AspNet.WebApi.Client": { - "type": "Transitive", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, - "Microsoft.AspNetCore.Authentication.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "VloMLDJMf3n/9ic5lCBOa42IBYJgyB1JhzLsL68Zqg+2bEPWfGBj/xCJy/LrKTArN0coOcZp3wyVTZlx0y9pHQ==", - "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", - "Microsoft.Extensions.Logging.Abstractions": "2.2.0", - "Microsoft.Extensions.Options": "2.2.0" - } - }, - "Microsoft.AspNetCore.Authentication.Core": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "XlVJzJ5wPOYW+Y0J6Q/LVTEyfS4ssLXmt60T0SPP+D8abVhBTl+cgw2gDHlyKYIkcJg7btMVh383NDkMVqD/fg==", - "dependencies": { - "Microsoft.AspNetCore.Authentication.Abstractions": "2.2.0", - "Microsoft.AspNetCore.Http": "2.2.0", - "Microsoft.AspNetCore.Http.Extensions": "2.2.0" - } - }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "Transitive", - "resolved": "6.0.11", - "contentHash": "ivpWC8L84Y+l9VZOa0uJXPoUE+n3TiSRZpfKxMElRtLMYCeXmz5x3O7CuCJkZ65z1520RWuEZDmHefxiz5TqPg==", - "dependencies": { - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.10.0" - } - }, - "Microsoft.AspNetCore.Authorization": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "/L0W8H3jMYWyaeA9gBJqS/tSWBegP9aaTM0mjRhxTttBY9z4RVDRYJ2CwPAmAXIuPr3r1sOw+CS8jFVRGHRezQ==", - "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "2.2.0", - "Microsoft.Extensions.Options": "2.2.0" - } - }, - "Microsoft.AspNetCore.Authorization.Policy": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "aJCo6niDRKuNg2uS2WMEmhJTooQUGARhV2ENQ2tO5443zVHUo19MSgrgGo9FIrfD+4yKPF8Q+FF33WkWfPbyKw==", - "dependencies": { - "Microsoft.AspNetCore.Authentication.Abstractions": "2.2.0", - "Microsoft.AspNetCore.Authorization": "2.2.0" - } - }, - "Microsoft.AspNetCore.Hosting.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", - "dependencies": { - "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", - "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", - "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" - } - }, - "Microsoft.AspNetCore.Hosting.Server.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", - "dependencies": { - "Microsoft.AspNetCore.Http.Features": "2.2.0", - "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" - } - }, - "Microsoft.AspNetCore.Http": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==", - "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", - "Microsoft.AspNetCore.WebUtilities": "2.2.0", - "Microsoft.Extensions.ObjectPool": "2.2.0", - "Microsoft.Extensions.Options": "2.2.0", - "Microsoft.Net.Http.Headers": "2.2.0" - } - }, - "Microsoft.AspNetCore.Http.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", - "dependencies": { - "Microsoft.AspNetCore.Http.Features": "2.2.0", - "System.Text.Encodings.Web": "4.5.0" - } - }, - "Microsoft.AspNetCore.Http.Extensions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", - "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", - "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", - "Microsoft.Net.Http.Headers": "2.2.0", - "System.Buffers": "4.5.0" - } - }, - "Microsoft.AspNetCore.Http.Features": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", + "resolved": "8.0.0", + "contentHash": "rwxaZYHips5M9vqxRkGfJthTx+Ws4O4yCuefn17J371jL3ouC5Ker43h2hXb5yd9BMnImE9rznT75KJHm6bMgg==", "dependencies": { - "Microsoft.Extensions.Primitives": "2.2.0" + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.0.3" } }, - "Microsoft.AspNetCore.JsonPatch": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "o9BB9hftnCsyJalz9IT0DUFxz8Xvgh3TOfGWolpuf19duxB4FySq7c25XDYBmBMS+sun5/PsEUAi58ra4iJAoA==", - "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Newtonsoft.Json": "11.0.2" - } - }, - "Microsoft.AspNetCore.Mvc.Abstractions": { + "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "ET6uZpfVbGR1NjCuLaLy197cQ3qZUjzl7EG5SL4GfJH/c9KRE89MMBrQegqWsh0w1iRUB/zQaK0anAjxa/pz4g==", - "dependencies": { - "Microsoft.AspNetCore.Routing.Abstractions": "2.2.0", - "Microsoft.Net.Http.Headers": "2.2.0" - } + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" }, - "Microsoft.AspNetCore.Mvc.Core": { + "Microsoft.Bcl.HashCode": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "ALiY4a6BYsghw8PT5+VU593Kqp911U3w9f/dH9/ZoI3ezDsDAGiObqPu/HP1oXK80Ceu0XdQ3F0bx5AXBeuN/Q==", - "dependencies": { - "Microsoft.AspNetCore.Authentication.Core": "2.2.0", - "Microsoft.AspNetCore.Authorization.Policy": "2.2.0", - "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", - "Microsoft.AspNetCore.Http": "2.2.0", - "Microsoft.AspNetCore.Http.Extensions": "2.2.0", - "Microsoft.AspNetCore.Mvc.Abstractions": "2.2.0", - "Microsoft.AspNetCore.ResponseCaching.Abstractions": "2.2.0", - "Microsoft.AspNetCore.Routing": "2.2.0", - "Microsoft.AspNetCore.Routing.Abstractions": "2.2.0", - "Microsoft.Extensions.DependencyInjection": "2.2.0", - "Microsoft.Extensions.DependencyModel": "2.1.0", - "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", - "Microsoft.Extensions.Logging.Abstractions": "2.2.0", - "System.Diagnostics.DiagnosticSource": "4.5.0", - "System.Threading.Tasks.Extensions": "4.5.1" - } + "resolved": "1.1.1", + "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, - "Microsoft.AspNetCore.Mvc.Formatters.Json": { + "Microsoft.CodeAnalysis.Analyzers": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "ScWwXrkAvw6PekWUFkIr5qa9NKn4uZGRvxtt3DvtUrBYW5Iu2y4SS/vx79JN0XDHNYgAJ81nVs+4M7UE1Y/O+g==", - "dependencies": { - "Microsoft.AspNetCore.JsonPatch": "2.2.0", - "Microsoft.AspNetCore.Mvc.Core": "2.2.0" - } + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" }, - "Microsoft.AspNetCore.ResponseCaching.Abstractions": { + "Microsoft.CodeAnalysis.Common": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "CIHWEKrHzZfFp7t57UXsueiSA/raku56TgRYauV/W1+KAQq6vevz60zjEKaazt3BI76zwMz3B4jGWnCwd8kwQw==", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "2.2.0" + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" } }, - "Microsoft.AspNetCore.Routing": { + "Microsoft.CodeAnalysis.CSharp": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "jAhDBy0wryOnMhhZTtT9z63gJbvCzFuLm8yC6pHzuVu9ZD1dzg0ltxIwT4cfwuNkIL/TixdKsm3vpVOpG8euWQ==", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", "dependencies": { - "Microsoft.AspNetCore.Http.Extensions": "2.2.0", - "Microsoft.AspNetCore.Routing.Abstractions": "2.2.0", - "Microsoft.Extensions.Logging.Abstractions": "2.2.0", - "Microsoft.Extensions.ObjectPool": "2.2.0", - "Microsoft.Extensions.Options": "2.2.0" + "Microsoft.CodeAnalysis.Common": "[4.5.0]" } }, - "Microsoft.AspNetCore.Routing.Abstractions": { + "Microsoft.CodeAnalysis.CSharp.Workspaces": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "lRRaPN7jDlUCVCp9i0W+PB0trFaKB0bgMJD7hEJS9Uo4R9MXaMC8X2tJhPLmeVE3SGDdYI4QNKdVmhNvMJGgPQ==", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "2.2.0" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" } }, - "Microsoft.AspNetCore.WebUtilities": { + "Microsoft.CodeAnalysis.Workspaces.Common": { "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", "dependencies": { - "Microsoft.Net.Http.Headers": "2.2.0", - "System.Text.Encodings.Web": "4.5.0" + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" } }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.Bcl.HashCode": { - "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" - }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" + } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Tools": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "zRdaXiiB1gEA0b+AJTd2+drh78gkEA4HyZ1vqNZrKq4xwW8WwavSiQsoeb1UsIMZkocLMBbhQYWClkZzuTKEgQ==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.EntityFrameworkCore.Design": "8.0.0" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -484,272 +316,270 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", + "resolved": "8.0.0", + "contentHash": "rtnltltUHm1nMEupZ9PNbs+b/8VXDZ/9Be8kxsaX3A00wqIQqNanfAG9xavu3CSCpkflF8M72py9oEdwbVaMZA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" } }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==" - }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "cfPUWdjigLIRIJSKz3uaZxShgf86RVDXHC1VEEchj1gnY25akwPYpbrfSoIGDCqA9UmOMdlctq411+2pAViFow==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "0qjS31rN1MQTc46tAYbzmMTSRfdV5ndZxSjYxIGqKSidd4wpNJfNII/pdhU5Fx8olarQoKL9lqqYw4yNOIwT0Q==", + "resolved": "7.0.3", + "contentHash": "vxjHVZbMKD3rVdbvKhzAW+7UiFrYToUVm3AGmYfKSOAwyhdLl/ELX1KZr+FaLyyS5VReIzWRWJfbOuHM9i6ywg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "zbcwV6esnNzhZZ/VP87dji6VrUBLB5rxnZBkDMqNYpyG+nrBnBsbm4PUYLCBMUflHCM9EMLDG0rLnqqT+l0ldA==" + "resolved": "7.0.3", + "contentHash": "b6GbGO+2LOTBEccHhqoJsOsmemG4A/MY+8H0wK/ewRhiG+DCYwEnucog1cSArPIY55zcn+XdZl0YEiUHkpDISQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "7.0.3" + } }, "Microsoft.IdentityModel.Protocols": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "DFyXD0xylP+DknCT3hzJ7q/Q5qRNu0hO/gCU90O0ATdR0twZmlcuY9RNYaaDofXKVbzcShYNCFCGle2G/o8mkg==", + "resolved": "7.0.3", + "contentHash": "BtwR+tctBYhPNygyZmt1Rnw74GFrJteW+1zcdIgyvBCjkek6cNwPPqRfdhzCv61i+lwyNomRi8+iI4QKd4YCKA==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Logging": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "LVvMXAWPbPeEWTylDrxunlHH2wFyE4Mv0L4gZrJHC4HTESbWHquKZb/y/S8jgiQEDycOP0PDQvbG4RR/tr2TVQ==", + "resolved": "7.0.3", + "contentHash": "W97TraHApDNArLwpPcXfD+FZH7njJsfEwZE9y9BoofeXMS8H0LBBobz0VOmYmMK4mLdOKxzN7SFT3Ekg0FWI3Q==", "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.10.0", - "System.IdentityModel.Tokens.Jwt": "6.10.0" + "Microsoft.IdentityModel.Protocols": "7.0.3", + "System.IdentityModel.Tokens.Jwt": "7.0.3" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "qbf1NslutDB4oLrriYTJpy7oB1pbh2ej2lEHd2IPDQH9C74ysOdhU5wAC7KoXblldbo7YsNR2QYFOqQM/b0Rsg==", + "resolved": "7.0.3", + "contentHash": "wB+LlbDjhnJ98DULjmFepqf9eEMh/sDs6S6hFh68iNRHmwollwhxk+nbSSfpA5+j+FbRyNskoaY4JsY1iCOKCg==", "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.10.0", - "System.Security.Cryptography.Cng": "4.5.0" - } - }, - "Microsoft.Net.Http.Headers": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "2.2.0", - "System.Buffers": "4.5.0" + "Microsoft.IdentityModel.Logging": "7.0.3" } }, "Microsoft.NETCore.Platforms": { @@ -769,8 +599,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -778,10 +608,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -806,83 +636,85 @@ }, "Minio": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "7tZj90WEuuH60RAP4wBYexjMuJOhCnK7I46hCiX3CtZPackHisLZ8aAJmn3KlwbUX22dBDphwemD+h37vet8Qw==", + "resolved": "6.0.1", + "contentHash": "uavo/zTpUzHLqnB0nyAk6E/2THLRPvZ59Md7IkLKXkAFiX//K2knVK2+dSHDNN2uAUqCvLqO+cM+s9VGBWbIKQ==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.1.0", + "CommunityToolkit.HighPerformance": "8.2.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", "System.IO.Hashing": "7.0.0", - "System.Reactive.Linq": "5.0.0" + "System.Reactive": "6.0.0" } }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Security": { "type": "Transitive", - "resolved": "0.1.3", - "contentHash": "9/E/UEK9Foo1cUHRRgNIR8uk+oTLiBbzR2vqBsxIo1EwbduDVuBGFcIh2lpAJZmFFwBNv0KtmTASdD3w5UWd+g==", + "resolved": "1.0.0", + "contentHash": "q0dQiOpOoHX4a3XkueqFRx51WOrQpW1Lwj7e4oqI6aOBeUlA9CPMdZ4+4BlemXc/1A5IClrPugp/owZ1NJ2Wxg==", "dependencies": { - "Ardalis.GuardClauses": "4.0.1", - "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.11", - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.3", - "Microsoft.Extensions.Logging.Configuration": "6.0.0" + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "8.0.0", + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Configuration": "8.0.0" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.MinIO": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "0sHLiT0qU2Fg5O+AF8UDqzsJEYztUAFZeOPh4kOLC4bckhb+wSsuv7VcAXWtR3BOY6TxaMVVUJ+EK/o5mCp3tQ==", + "resolved": "1.0.0", + "contentHash": "o6Lq9rshOJ3sxz4lIfl14Zn7+YXvXXg2Jpndtnnx4Ez1RDSTDu2Zf08lEgFHTmwAML1e4fsVVm16LaXv3h3L3A==", "dependencies": { - "Minio": "5.0.0", - "Monai.Deploy.Storage": "0.2.18", - "Monai.Deploy.Storage.S3Policy": "0.2.18" + "Minio": "6.0.1", + "Monai.Deploy.Storage": "1.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -890,29 +722,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -920,6 +752,14 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "NETStandard.Library": { "type": "Transitive", "resolved": "1.6.1", @@ -976,36 +816,27 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NLog.Extensions.Logging": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "rxUGUqhE3DlcKfKhPJOI0xOt8q2+NX0NkBY9lbRXwZEYQsh8ASFS8X7K+Y7/dcE8v0tpAe7GF8rPD5h4h9Hpsg==", + "resolved": "5.3.8", + "contentHash": "6VD0lyeokWltL6j8lO7mS7v7lbuO/qn0F7kdvhKhEx1JvFyD39nzohOK3JvkVh4Nn3mrcMDCyDxvTvmiW55jQg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "NLog": "5.2.4" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "NLog": "5.2.8" } }, "NLog.Web.AspNetCore": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "80FaN8CKu94E3mZqZ+r46nRyEYgnHMn4i3vPslbaINs8k+TqJClNFYw6uWLhPU4AN7PKi/jHHzpswqn7K8jgGg==", + "resolved": "5.3.8", + "contentHash": "Rt2OCulpAF6rSrZWZzPgHikAI8SDKkq3/52xA/uJ4JtmNjoizULN/IBYtYlZojbPbXiFm3uadOO2rOvvMhjXBQ==", "dependencies": { - "NLog.Extensions.Logging": "5.3.4" + "NLog.Extensions.Logging": "5.3.8" } }, "NuGet.Frameworks": { @@ -1015,13 +846,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -1146,32 +985,43 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + } + }, + "Swashbuckle.AspNetCore": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "FK05XokgjgwlCI6wCT+D4/abtQkL1X1/B9Oas6uIwHFmYrIO9WUD5aLC9IzMs9GnHfUXOtXZ2S43gN1mhs5+aA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "Microsoft.Extensions.ApiDescription.Server": "6.0.5", + "Swashbuckle.AspNetCore.Swagger": "6.5.0", + "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0", + "Swashbuckle.AspNetCore.SwaggerUI": "6.5.0" } }, "Swashbuckle.AspNetCore.Swagger": { @@ -1208,6 +1058,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections": { "type": "Transitive", "resolved": "4.3.0", @@ -1243,12 +1098,52 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Configuration.ConfigurationManager": { + "System.Composition": { "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", "dependencies": { - "System.Security.Cryptography.ProtectedData": "4.4.0" + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" } }, "System.Console": { @@ -1275,11 +1170,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -1342,11 +1234,11 @@ }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "C+Q5ORsFycRkRuvy/Xd0Pv5xVpmWSAvQYZAGs7VQogmkqlLhvfZXTgBIlHqC3cxkstSoLJAYx6xZB7foQ2y5eg==", + "resolved": "7.0.3", + "contentHash": "caEe+OpQNYNiyZb+DJpUVROXoVySWBahko2ooNfUcllxa9ZQUM8CgM/mDjP6AoFn6cQU9xMmG+jivXWub8cbGg==", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.JsonWebTokens": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "System.IO": { @@ -1363,8 +1255,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1432,6 +1328,11 @@ "resolved": "7.0.0", "contentHash": "sDnWM0N3AMCa86LrKTWeF3BZLD2sgWyYUc7HL6z4+xyDZNQRwzmxbo4qP2rX2MqC+Sy1/gOSRDah5ltxY5jPxw==" }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, "System.Linq": { "type": "Transitive", "resolved": "4.3.0", @@ -1444,14 +1345,6 @@ "System.Runtime.Extensions": "4.3.0" } }, - "System.Linq.Async": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, "System.Linq.Expressions": { "type": "Transitive", "resolved": "4.3.0", @@ -1552,17 +1445,8 @@ }, "System.Reactive": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" - }, - "System.Reactive.Linq": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "IB4/qlV4T1WhZvM11RVoFUSZXPow9VWVeQ1uDkSKgz6bAO+gCf65H/vjrYlwyXmojSSxvfHndF9qdH43P/IuAw==", - "dependencies": { - "System.Reactive": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } + "resolved": "6.0.0", + "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" }, "System.Reflection": { "type": "Transitive", @@ -1622,8 +1506,11 @@ }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } }, "System.Reflection.Primitives": { "type": "Transitive", @@ -1760,8 +1647,21 @@ }, "System.Security.Cryptography.Cng": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } }, "System.Security.Cryptography.Csp": { "type": "Transitive", @@ -1836,11 +1736,6 @@ "System.Threading.Tasks": "4.3.0" } }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" - }, "System.Security.Cryptography.X509Certificates": { "type": "Transitive", "resolved": "4.3.0", @@ -1909,19 +1804,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Text.RegularExpressions": { @@ -1958,8 +1849,13 @@ }, "System.Threading.Tasks.Extensions": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } }, "System.Threading.Timer": { "type": "Transitive", @@ -2012,6 +1908,28 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "O8YeM+jsunyWt4ch93QnvWmMN/uguU0uX2VvDEvlltOxxHfCOuy0jG9m9p/lys52orlbpRa/Rl6mMXwoK2tdcA==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -2019,30 +1937,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -2050,23 +1965,24 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { - "DotNext.Threading": "[4.7.4, )", + "DotNext.Threading": "[4.15.2, )", "HL7-dotnetcore": "[2.36.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -2075,10 +1991,10 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Security": "[0.1.3, )", - "Monai.Deploy.Storage.MinIO": "[0.2.18, )", - "NLog.Web.AspNetCore": "[5.3.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Security": "[1.0.0, )", + "Monai.Deploy.Storage.MinIO": "[1.0.0, )", + "NLog.Web.AspNetCore": "[5.3.8, )", "Swashbuckle.AspNetCore": "[6.5.0, )" } }, @@ -2087,25 +2003,25 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -2118,9 +2034,10 @@ "monai.deploy.informaticsgateway.database": { "type": "Project", "dependencies": { - "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "AspNetCore.HealthChecks.MongoDb": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Tools": "[8.0.0, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", @@ -2133,55 +2050,55 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.dicomweb.client": { "type": "Project", "dependencies": { - "Microsoft.AspNet.WebApi.Client": "[5.2.9, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )", - "System.Linq.Async": "[6.0.1, )", - "fo-dicom": "[5.1.1, )" + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration": "[6.0.1, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Relational": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.4, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "NLog": "[5.2.8, )", + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.test.plugins": { diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json old mode 100755 new mode 100644 index 1778d145c..fa41553f7 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -1,15 +1,15 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "DotNext.Threading": { "type": "Direct", - "requested": "[4.7.4, )", - "resolved": "4.7.4", - "contentHash": "G/AogSunqiZZ/0H4y3Qy/YNveIB+6azddStmFxbxLWkruXZ27gXyoRQ9kQ2gpDbq/+YfMINz9nmTY5ZtuCzuyw==", + "requested": "[4.15.2, )", + "resolved": "4.15.2", + "contentHash": "bOOePY7XQTMtOQ+0cui3K9x44Q8CEpH/tXfXFHPBZjwFexa9SBevMGvHO6MINHC1QnKUP9nHZIIMQ3Jfr88aQQ==", "dependencies": { - "DotNext": "4.7.4", - "System.Threading.Channels": "6.0.0" + "DotNext": "4.15.2", + "System.Threading.Channels": "7.0.0" } }, "HL7-dotnetcore": { @@ -20,58 +20,61 @@ }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", "dependencies": { - "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.5, )", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Security": { "type": "Direct", - "requested": "[0.1.3, )", - "resolved": "0.1.3", - "contentHash": "9/E/UEK9Foo1cUHRRgNIR8uk+oTLiBbzR2vqBsxIo1EwbduDVuBGFcIh2lpAJZmFFwBNv0KtmTASdD3w5UWd+g==", - "dependencies": { - "Ardalis.GuardClauses": "4.0.1", - "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.11", - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.3", - "Microsoft.Extensions.Logging.Configuration": "6.0.0" + "requested": "[1.0.0, )", + "resolved": "1.0.0", + "contentHash": "q0dQiOpOoHX4a3XkueqFRx51WOrQpW1Lwj7e4oqI6aOBeUlA9CPMdZ4+4BlemXc/1A5IClrPugp/owZ1NJ2Wxg==", + "dependencies": { + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "8.0.0", + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Configuration": "8.0.0" } }, "Monai.Deploy.Storage.MinIO": { "type": "Direct", - "requested": "[0.2.18, )", - "resolved": "0.2.18", - "contentHash": "0sHLiT0qU2Fg5O+AF8UDqzsJEYztUAFZeOPh4kOLC4bckhb+wSsuv7VcAXWtR3BOY6TxaMVVUJ+EK/o5mCp3tQ==", + "requested": "[1.0.0, )", + "resolved": "1.0.0", + "contentHash": "o6Lq9rshOJ3sxz4lIfl14Zn7+YXvXXg2Jpndtnnx4Ez1RDSTDu2Zf08lEgFHTmwAML1e4fsVVm16LaXv3h3L3A==", "dependencies": { - "Minio": "5.0.0", - "Monai.Deploy.Storage": "0.2.18", - "Monai.Deploy.Storage.S3Policy": "0.2.18" + "Minio": "6.0.1", + "Monai.Deploy.Storage": "1.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0" } }, "NLog.Web.AspNetCore": { "type": "Direct", - "requested": "[5.3.4, )", - "resolved": "5.3.4", - "contentHash": "80FaN8CKu94E3mZqZ+r46nRyEYgnHMn4i3vPslbaINs8k+TqJClNFYw6uWLhPU4AN7PKi/jHHzpswqn7K8jgGg==", + "requested": "[5.3.8, )", + "resolved": "5.3.8", + "contentHash": "Rt2OCulpAF6rSrZWZzPgHikAI8SDKkq3/52xA/uJ4JtmNjoizULN/IBYtYlZojbPbXiFm3uadOO2rOvvMhjXBQ==", "dependencies": { - "NLog.Extensions.Logging": "5.3.4" + "NLog.Extensions.Logging": "5.3.8" } }, "Swashbuckle.AspNetCore": { @@ -88,35 +91,35 @@ }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AspNetCore.HealthChecks.MongoDb": { "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "0R3NVbsjMhS5fd2hGijzQNKJ0zQBv/qMC7nkpmnbtgribCj7vfNdAhSqv4lwbibffRWPW5A/7VNJMX4aPej0WQ==", + "resolved": "8.0.0", + "contentHash": "0YjJlCwkwulozPxFCRcJAl2CdjU5e5ekj4/BQsA6GZbzRxwtN3FIg7LJcWUUgMdwqDoe+6SKFBRnSRpfLY4owA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.2", - "MongoDB.Driver": "2.14.1" + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "MongoDB.Driver": "2.22.0" } }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -128,18 +131,18 @@ }, "DotNext": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "5Xp6G9U0MhSmfgxKklUUsOFfSg2VqF+/rkd7WyoUs7HqbnVd32bRw2rWW5o+rieHLzUlW/sagctPiaZqmeTA+g==", + "resolved": "4.15.2", + "contentHash": "Q5l6yVmJh9ow2MjDPSMOAj1N9fZpuu1SFRLEEjL5shk5i80GU0PsqoNDKFsAI7ciePoAP6y8mkARpmmDzP4Xqw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -148,35 +151,26 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, "Humanizer.Core": { "type": "Transitive", - "resolved": "2.8.26", - "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" }, - "Microsoft.AspNet.WebApi.Client": { - "type": "Transitive", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "Transitive", - "resolved": "6.0.11", - "contentHash": "ivpWC8L84Y+l9VZOa0uJXPoUE+n3TiSRZpfKxMElRtLMYCeXmz5x3O7CuCJkZ65z1520RWuEZDmHefxiz5TqPg==", + "resolved": "8.0.0", + "contentHash": "rwxaZYHips5M9vqxRkGfJthTx+Ws4O4yCuefn17J371jL3ouC5Ker43h2hXb5yd9BMnImE9rznT75KJHm6bMgg==", "dependencies": { - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.10.0" + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.0.3" } }, "Microsoft.Bcl.AsyncInterfaces": { @@ -189,69 +183,118 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, - "Microsoft.CSharp": { + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { "type": "Transitive", "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Tools": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "zRdaXiiB1gEA0b+AJTd2+drh78gkEA4HyZ1vqNZrKq4xwW8WwavSiQsoeb1UsIMZkocLMBbhQYWClkZzuTKEgQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Design": "8.0.0" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -261,258 +304,270 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", + "resolved": "8.0.0", + "contentHash": "rtnltltUHm1nMEupZ9PNbs+b/8VXDZ/9Be8kxsaX3A00wqIQqNanfAG9xavu3CSCpkflF8M72py9oEdwbVaMZA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "cfPUWdjigLIRIJSKz3uaZxShgf86RVDXHC1VEEchj1gnY25akwPYpbrfSoIGDCqA9UmOMdlctq411+2pAViFow==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "0qjS31rN1MQTc46tAYbzmMTSRfdV5ndZxSjYxIGqKSidd4wpNJfNII/pdhU5Fx8olarQoKL9lqqYw4yNOIwT0Q==", + "resolved": "7.0.3", + "contentHash": "vxjHVZbMKD3rVdbvKhzAW+7UiFrYToUVm3AGmYfKSOAwyhdLl/ELX1KZr+FaLyyS5VReIzWRWJfbOuHM9i6ywg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "zbcwV6esnNzhZZ/VP87dji6VrUBLB5rxnZBkDMqNYpyG+nrBnBsbm4PUYLCBMUflHCM9EMLDG0rLnqqT+l0ldA==" + "resolved": "7.0.3", + "contentHash": "b6GbGO+2LOTBEccHhqoJsOsmemG4A/MY+8H0wK/ewRhiG+DCYwEnucog1cSArPIY55zcn+XdZl0YEiUHkpDISQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "7.0.3" + } }, "Microsoft.IdentityModel.Protocols": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "DFyXD0xylP+DknCT3hzJ7q/Q5qRNu0hO/gCU90O0ATdR0twZmlcuY9RNYaaDofXKVbzcShYNCFCGle2G/o8mkg==", + "resolved": "7.0.3", + "contentHash": "BtwR+tctBYhPNygyZmt1Rnw74GFrJteW+1zcdIgyvBCjkek6cNwPPqRfdhzCv61i+lwyNomRi8+iI4QKd4YCKA==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Logging": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "LVvMXAWPbPeEWTylDrxunlHH2wFyE4Mv0L4gZrJHC4HTESbWHquKZb/y/S8jgiQEDycOP0PDQvbG4RR/tr2TVQ==", + "resolved": "7.0.3", + "contentHash": "W97TraHApDNArLwpPcXfD+FZH7njJsfEwZE9y9BoofeXMS8H0LBBobz0VOmYmMK4mLdOKxzN7SFT3Ekg0FWI3Q==", "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.10.0", - "System.IdentityModel.Tokens.Jwt": "6.10.0" + "Microsoft.IdentityModel.Protocols": "7.0.3", + "System.IdentityModel.Tokens.Jwt": "7.0.3" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "qbf1NslutDB4oLrriYTJpy7oB1pbh2ej2lEHd2IPDQH9C74ysOdhU5wAC7KoXblldbo7YsNR2QYFOqQM/b0Rsg==", + "resolved": "7.0.3", + "contentHash": "wB+LlbDjhnJ98DULjmFepqf9eEMh/sDs6S6hFh68iNRHmwollwhxk+nbSSfpA5+j+FbRyNskoaY4JsY1iCOKCg==", "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.10.0", - "System.Security.Cryptography.Cng": "4.5.0" + "Microsoft.IdentityModel.Logging": "7.0.3" } }, "Microsoft.NETCore.Platforms": { @@ -520,26 +575,11 @@ "resolved": "5.0.0", "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Microsoft.OpenApi": { "type": "Transitive", "resolved": "1.2.3", "contentHash": "Nug3rO+7Kl5/SBAadzSMAVgqDlfGjJZ0GenQrLywJ84XGKO0uRqkunz5Wyl0SDwcR71bAATXvSdbdzPrYRYKGw==" }, - "Microsoft.Win32.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "Microsoft.Win32.Registry": { "type": "Transitive", "resolved": "5.0.0", @@ -551,49 +591,51 @@ }, "Minio": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "7tZj90WEuuH60RAP4wBYexjMuJOhCnK7I46hCiX3CtZPackHisLZ8aAJmn3KlwbUX22dBDphwemD+h37vet8Qw==", + "resolved": "6.0.1", + "contentHash": "uavo/zTpUzHLqnB0nyAk6E/2THLRPvZ59Md7IkLKXkAFiX//K2knVK2+dSHDNN2uAUqCvLqO+cM+s9VGBWbIKQ==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.1.0", + "CommunityToolkit.HighPerformance": "8.2.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", "System.IO.Hashing": "7.0.0", - "System.Reactive.Linq": "5.0.0" + "System.Reactive": "6.0.0" } }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -601,29 +643,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -631,55 +673,12 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, - "NETStandard.Library": { + "Mono.TextTemplating": { "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" } }, "Newtonsoft.Json": { @@ -687,151 +686,43 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NLog.Extensions.Logging": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "rxUGUqhE3DlcKfKhPJOI0xOt8q2+NX0NkBY9lbRXwZEYQsh8ASFS8X7K+Y7/dcE8v0tpAe7GF8rPD5h4h9Hpsg==", + "resolved": "5.3.8", + "contentHash": "6VD0lyeokWltL6j8lO7mS7v7lbuO/qn0F7kdvhKhEx1JvFyD39nzohOK3JvkVh4Nn3mrcMDCyDxvTvmiW55jQg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "NLog": "5.2.4" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "NLog": "5.2.8" } }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" - }, - "RabbitMQ.Client": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "System.Memory": "4.5.5", - "System.Threading.Channels": "7.0.0" + "Polly.Core": "8.2.1" } }, - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" - }, - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "Polly.Core": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" - }, - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, - "runtime.native.System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", - "dependencies": { - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" - } - }, - "runtime.native.System.Security.Cryptography.OpenSsl": { + "RabbitMQ.Client": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + "System.Memory": "4.5.5", + "System.Threading.Channels": "7.0.0" } }, - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" - }, - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" - }, - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" - }, - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" - }, - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" - }, - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" - }, "SharpCompress": { "type": "Transitive", "resolved": "0.30.1", @@ -844,32 +735,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Swashbuckle.AspNetCore.Swagger": { @@ -893,45 +784,15 @@ "resolved": "6.5.0", "contentHash": "OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==" }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Collections.Concurrent": { + "System.CodeDom": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" }, "System.Collections.Immutable": { "type": "Transitive", @@ -941,175 +802,75 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Diagnostics.Debug": { + "System.Composition": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" } }, - "System.Diagnostics.DiagnosticSource": { + "System.Composition.AttributedModel": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" }, - "System.Diagnostics.Tools": { + "System.Composition.Convention": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Composition.AttributedModel": "6.0.0" } }, - "System.Diagnostics.Tracing": { + "System.Composition.Hosting": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Composition.Runtime": "6.0.0" } }, - "System.Globalization": { + "System.Composition.Runtime": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" }, - "System.Globalization.Calendars": { + "System.Composition.TypedParts": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Runtime": "4.3.0" + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" } }, - "System.Globalization.Extensions": { + "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "C+Q5ORsFycRkRuvy/Xd0Pv5xVpmWSAvQYZAGs7VQogmkqlLhvfZXTgBIlHqC3cxkstSoLJAYx6xZB7foQ2y5eg==", + "resolved": "7.0.3", + "contentHash": "caEe+OpQNYNiyZb+DJpUVROXoVySWBahko2ooNfUcllxa9ZQUM8CgM/mDjP6AoFn6cQU9xMmG+jivXWub8cbGg==", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" - } - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" + "Microsoft.IdentityModel.JsonWebTokens": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" - }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.IO.FileSystem": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.FileSystem.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", - "dependencies": { - "System.Runtime": "4.3.0" + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" } }, "System.IO.Hashing": { @@ -1117,232 +878,27 @@ "resolved": "7.0.0", "contentHash": "sDnWM0N3AMCa86LrKTWeF3BZLD2sgWyYUc7HL6z4+xyDZNQRwzmxbo4qP2rX2MqC+Sy1/gOSRDah5ltxY5jPxw==" }, - "System.Linq": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Linq.Async": { + "System.IO.Pipelines": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Emit.Lightweight": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, - "System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Net.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Net.Sockets": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.ObjectModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, "System.Reactive": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" - }, - "System.Reactive.Linq": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "IB4/qlV4T1WhZvM11RVoFUSZXPow9VWVeQ1uDkSKgz6bAO+gCf65H/vjrYlwyXmojSSxvfHndF9qdH43P/IuAw==", - "dependencies": { - "System.Reactive": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } + "resolved": "6.0.0", + "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" }, - "System.Runtime": { + "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" + "System.Collections.Immutable": "6.0.0" } }, "System.Runtime.CompilerServices.Unsafe": { @@ -1350,64 +906,6 @@ "resolved": "6.0.0", "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, - "System.Runtime.Numerics": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", - "dependencies": { - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, "System.Security.AccessControl": { "type": "Transitive", "resolved": "5.0.0", @@ -1417,152 +915,11 @@ "System.Security.Principal.Windows": "5.0.0" } }, - "System.Security.Cryptography.Algorithms": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.Apple": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" - }, - "System.Security.Cryptography.Csp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Security.Cryptography.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Linq": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", - "dependencies": { - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Security.Cryptography.X509Certificates": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, "System.Security.Principal.Windows": { "type": "Transitive", "resolved": "5.0.0", "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", "resolved": "6.0.0", @@ -1571,49 +928,17 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Text.Encoding.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "System.Text.RegularExpressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.Channels": { @@ -1621,101 +946,48 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, - "System.Threading.Tasks": { + "TestableIO.System.IO.Abstractions": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" }, - "System.Threading.Tasks.Extensions": { + "TestableIO.System.IO.Abstractions.Wrappers": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Xml.ReaderWriter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Extensions": "4.3.0" - } - }, - "System.Xml.XDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" + "TestableIO.System.IO.Abstractions": "20.0.4" } }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -1728,9 +1000,10 @@ "monai.deploy.informaticsgateway.database": { "type": "Project", "dependencies": { - "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "AspNetCore.HealthChecks.MongoDb": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Tools": "[8.0.0, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", @@ -1743,55 +1016,55 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.dicomweb.client": { "type": "Project", "dependencies": { - "Microsoft.AspNet.WebApi.Client": "[5.2.9, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )", - "System.Linq.Async": "[6.0.1, )", - "fo-dicom": "[5.1.1, )" + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration": "[6.0.1, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Relational": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.4, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "NLog": "[5.2.8, )", + "Polly": "[8.2.1, )" } } } diff --git a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj index b02fccd0a..baead361f 100755 --- a/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj +++ b/src/Plug-ins/RemoteAppExecution/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.csproj @@ -13,12 +13,10 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution - net6.0 + net8.0 enable enable Apache-2.0 @@ -28,39 +26,32 @@ ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset false true + true - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - + + + + + + + + + + + - - + \ No newline at end of file diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs index da6b6c540..2a8473ec9 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs @@ -37,8 +37,8 @@ public void GivenEntityFrameworkDatabaseType_WhenConfigureIsCalled_AddsDependenc serviceCollection.Setup(p => p.GetEnumerator()).Returns(serviceDescriptors.GetEnumerator()); var registrar = new DatabaseRegistrar(); - var configInMemory = new Dictionary { - { "top:InformaticsGatewayDatabase","DataSource=file::memory:?cache=shared"}, + var configInMemory = new List> { + new("top:InformaticsGatewayDatabase","DataSource=file::memory:?cache=shared"), }; IConfiguration configuration = new ConfigurationBuilder().AddInMemoryCollection(configInMemory).Build(); @@ -55,7 +55,7 @@ public void GivenEntityFrameworkDatabaseType_WhenConfigureIsCalled_AddsDependenc Assert.Same(serviceCollection.Object, returnedServiceCollection); - serviceCollection.Verify(p => p.Add(It.IsAny()), Times.Exactly(5)); + serviceCollection.Verify(p => p.Add(It.IsAny()), Times.Exactly(6)); serviceCollection.Verify(p => p.Add(It.Is(p => p.ServiceType == typeof(RemoteAppExecutionDbContext))), Times.Once()); serviceCollection.Verify(p => p.Add(It.Is(p => p.ServiceType == typeof(IDatabaseMigrationManagerForPlugIns) && p.ImplementationType == typeof(MigrationManager))), Times.Once()); serviceCollection.Verify(p => p.Add(It.Is(p => p.ServiceType == typeof(IRemoteAppExecutionRepository) && p.ImplementationType == typeof(RemoteAppExecutionRepository))), Times.Once()); @@ -70,8 +70,8 @@ public void GivenMongoDatabaseType_WhenConfigureIsCalled_AddsDependencies() serviceCollection.Setup(p => p.GetEnumerator()).Returns(serviceDescriptors.GetEnumerator()); var registrar = new DatabaseRegistrar(); - var configInMemory = new Dictionary { - { "top:InformaticsGatewayDatabase","DataSource=file::memory:?cache=shared"}, + var configInMemory = new List> { + new("top:InformaticsGatewayDatabase","DataSource=file::memory:?cache=shared"), }; var loggerMock = new Mock(); diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs index 0a4088c1e..2d02f8fa6 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/EntityFramework/RemoteAppExecutionRepositoryTest.cs @@ -82,8 +82,8 @@ public async Task GivenARemoteAppExecution_WhenAddingToDatabase_ExpectItToBeSave record.OriginalValues.Add(DicomTag.StudyDescription.ToString(), Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16)); var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(record).ConfigureAwait(false); - var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Id.Equals(record.Id)).ConfigureAwait(false); + await store.AddAsync(record).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Id.Equals(record.Id)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(record.CorrelationId, actual!.CorrelationId); @@ -99,13 +99,13 @@ public async Task GivenARemoteAppExecution_WhenRemoveIsCalled_ExpectItToDeleted( var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var record = _databaseFixture.RemoteAppExecutions.First(); - var expected = await store.GetAsync(record.SopInstanceUid).ConfigureAwait(false); + var expected = await store.GetAsync(record.SopInstanceUid).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); - var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Id == record.Id).ConfigureAwait(false); + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Id == record.Id).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -115,7 +115,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithSopInstanceUi var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); - var actual = await store.GetAsync(expected.SopInstanceUid).ConfigureAwait(false); + var actual = await store.GetAsync(expected.SopInstanceUid).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected.SopInstanceUid, actual.SopInstanceUid); Assert.Equal(expected.StudyInstanceUid, actual.StudyInstanceUid); @@ -134,7 +134,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithStudyAndSerie var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); - var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, expected.SeriesInstanceUid).ConfigureAwait(false); + var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, expected.SeriesInstanceUid).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected.SopInstanceUid, actual.SopInstanceUid); Assert.Equal(expected.StudyInstanceUid, actual.StudyInstanceUid); @@ -153,7 +153,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithRandomSeries_ var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); - var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, DicomUIDGenerator.GenerateDerivedFromUUID().UID).ConfigureAwait(false); + var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, DicomUIDGenerator.GenerateDerivedFromUUID().UID).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected.SopInstanceUid, actual.SopInstanceUid); Assert.Equal(expected.StudyInstanceUid, actual.StudyInstanceUid); diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs index 34724230b..028b93910 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/Database/MongoDb/RemoteAppExecutionRepositoryTest.cs @@ -82,10 +82,10 @@ public async Task GivenARemoteAppExecution_WhenAddingToDatabase_ExpectItToBeSave record.OriginalValues.Add(DicomTag.StudyDescription.ToString(), Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16)); var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); - await store.AddAsync(record).ConfigureAwait(false); + await store.AddAsync(record).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var collection = _databaseFixture.Database.GetCollection(nameof(RemoteAppExecution)); - var actual = await collection.Find(p => p.Id == record.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var actual = await collection.Find(p => p.Id == record.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(record.CorrelationId, actual!.CorrelationId); @@ -101,14 +101,14 @@ public async Task GivenARemoteAppExecution_WhenRemoveIsCalled_ExpectItToDeleted( var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var record = _databaseFixture.RemoteAppExecutions.First(); - var expected = await store.GetAsync(record.SopInstanceUid).ConfigureAwait(false); + var expected = await store.GetAsync(record.SopInstanceUid).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + var actual = await store.RemoveAsync(expected!).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Same(expected, actual); var collection = _databaseFixture.Database.GetCollection(nameof(RemoteAppExecution)); - var dbResult = await collection.Find(p => p.Id == record.Id).FirstOrDefaultAsync().ConfigureAwait(false); + var dbResult = await collection.Find(p => p.Id == record.Id).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.Null(dbResult); } @@ -118,7 +118,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithSopInstanceUi var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); - var actual = await store.GetAsync(expected.SopInstanceUid).ConfigureAwait(false); + var actual = await store.GetAsync(expected.SopInstanceUid).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected.SopInstanceUid, actual.SopInstanceUid); Assert.Equal(expected.StudyInstanceUid, actual.StudyInstanceUid); @@ -137,7 +137,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithStudyAndSerie var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); - var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, expected.SeriesInstanceUid).ConfigureAwait(false); + var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, expected.SeriesInstanceUid).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected.SopInstanceUid, actual.SopInstanceUid); Assert.Equal(expected.StudyInstanceUid, actual.StudyInstanceUid); @@ -156,7 +156,7 @@ public async Task GivenARemoteAppExecution_WhenGetAsyncIsCalledWithRandomSeries_ var store = new RemoteAppExecutionRepository(_serviceScopeFactory.Object, _logger.Object, _options); var expected = _databaseFixture.RemoteAppExecutions.First(); - var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, DicomUIDGenerator.GenerateDerivedFromUUID().UID).ConfigureAwait(false); + var actual = await store.GetAsync(expected.WorkflowInstanceId, expected.ExportTaskId, expected.StudyInstanceUid, DicomUIDGenerator.GenerateDerivedFromUUID().UID).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); Assert.Equal(expected.SopInstanceUid, actual.SopInstanceUid); Assert.Equal(expected.StudyInstanceUid, actual.StudyInstanceUid); diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs index c1e458cf9..4053496c5 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs @@ -89,7 +89,7 @@ public async Task GivenEmptyReplaceTags_WhenExecuteIsCalledWithoutExistingRecord var message = new ExportRequestDataMessage(exportRequest, "file.dcm"); var dicom = InstanceGenerator.GenerateDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid); - _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(false); + _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _repository.Verify(p => p.GetAsync( It.Is(p => p == exportRequest.WorkflowInstanceId), @@ -123,7 +123,7 @@ public async Task GivenReplaceTags_WhenExecuteIsCalledWithoutExistingRecords_Exp dicom.Dataset.AddOrUpdate(DicomTag.PatientID, patientId); dicom.Dataset.AddOrUpdate(DicomTag.PatientName, patientName); - _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(false); + _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _repository.Verify(p => p.GetAsync( It.Is(p => p == exportRequest.WorkflowInstanceId), @@ -159,7 +159,7 @@ public async Task GivenExistingRecordWithSameStudy_WhenExecuteIsCalled_ExpectAsy SeriesInstanceUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID }); - _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(false); + _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _repository.Verify(p => p.GetAsync( It.Is(p => p == exportRequest.WorkflowInstanceId), @@ -195,7 +195,7 @@ public async Task GivenExistingRecordWithSameSeries_WhenExecuteIsCalled_ExpectAs SeriesInstanceUid = seriesInstanceUid }); - _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(false); + _ = await app.ExecuteAsync(dicom, message).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _repository.Verify(p => p.GetAsync( It.Is(p => p == exportRequest.WorkflowInstanceId), diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomReidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomReidentifierTest.cs index 8437677fc..494dda53d 100644 --- a/src/Plug-ins/RemoteAppExecution/Test/DicomReidentifierTest.cs +++ b/src/Plug-ins/RemoteAppExecution/Test/DicomReidentifierTest.cs @@ -82,7 +82,7 @@ public async Task GivenIncomingInstance_WhenExecuteIsCalledWithMissingRecord_Exp _repository.Setup(p => p.GetAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(RemoteAppExecution)); - _ = await app.ExecuteAsync(dicom, metadata).ConfigureAwait(false); + _ = await app.ExecuteAsync(dicom, metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _repository.Verify(p => p.GetAsync(It.IsAny(), It.IsAny()), Times.Once()); @@ -116,7 +116,7 @@ public async Task GivenIncomingInstance_WhenExecuteIsCalledWithRecord_ExpectData _repository.Setup(p => p.GetAsync(It.IsAny(), It.IsAny())).ReturnsAsync(record); - _ = await app.ExecuteAsync(dicom, metadata).ConfigureAwait(false); + _ = await app.ExecuteAsync(dicom, metadata).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); _repository.Verify(p => p.GetAsync(It.IsAny(), It.IsAny()), Times.Once()); diff --git a/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj b/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj index 22f46686c..096f05d37 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj +++ b/src/Plug-ins/RemoteAppExecution/Test/Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test.csproj @@ -13,11 +13,9 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 enable enable Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Test @@ -25,40 +23,35 @@ Apache-2.0 true - - - all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all + + + - - - + \ No newline at end of file diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json old mode 100755 new mode 100644 index ac62dee73..993b5cab1 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,60 +10,60 @@ }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "T1wFaHL0WS51PlrSzWfBX2qppMbuIserPUaSwrw6Uhvg4WllsQPKYqFGAZC9bbUAihjgY5es7MIgSEtXYNdLiw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "/pT9FOO0BxGSRscK/ekEb6TdiP3+nnyhPLElE1yuVG/QaZLaBAuM3RoywBHdIxWoFALaOS7ktXlKzuMX3khJ4A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25" + "Microsoft.EntityFrameworkCore": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "System.IO.Abstractions.TestingHelpers": { "type": "Direct", - "requested": "[17.2.3, )", - "resolved": "17.2.3", - "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "requested": "[20.0.4, )", + "resolved": "20.0.4", + "contentHash": "Dp6gPoqJ7i8dRGubfxzA219fFCtkam9BgSmuIT+fQcFPKkW6vx9PuLTSELsNq+gRoEAzxGbWjsT/3WslfcmRfg==", "dependencies": { - "System.IO.Abstractions": "17.2.3" + "TestableIO.System.IO.Abstractions.TestingHelpers": "20.0.4" } }, "xRetry": { @@ -77,37 +77,37 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "Castle.Core": { @@ -120,8 +120,8 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -133,10 +133,10 @@ }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -145,7 +145,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -154,6 +154,11 @@ "resolved": "2.36.0", "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -169,241 +174,305 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" + } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -417,8 +486,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -426,10 +495,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -454,49 +523,49 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -504,29 +573,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -534,6 +603,14 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "NETStandard.Library": { "type": "Transitive", "resolved": "1.6.1", @@ -592,8 +669,8 @@ }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NuGet.Frameworks": { "type": "Transitive", @@ -602,13 +679,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -733,32 +818,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "System.AppContext": { @@ -774,6 +859,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections": { "type": "Transitive", "resolved": "4.3.0", @@ -809,6 +899,54 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Composition": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, "System.Console": { "type": "Transitive", "resolved": "4.3.0", @@ -833,11 +971,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -912,8 +1047,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -976,6 +1115,11 @@ "System.Runtime": "4.3.0" } }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, "System.Linq": { "type": "Transitive", "resolved": "4.3.0", @@ -1144,8 +1288,11 @@ }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } }, "System.Reflection.Primitives": { "type": "Transitive", @@ -1439,19 +1586,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Text.RegularExpressions": { @@ -1547,6 +1690,28 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "O8YeM+jsunyWt4ch93QnvWmMN/uguU0uX2VvDEvlltOxxHfCOuy0jG9m9p/lys52orlbpRa/Rl6mMXwoK2tdcA==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -1554,30 +1719,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -1585,36 +1747,36 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -1629,25 +1791,26 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration": "[6.0.1, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Relational": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.4, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "NLog": "[5.2.8, )", + "Polly": "[8.2.1, )" } } } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index a171e527a..a6edc2064 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -1,147 +1,150 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "YawyMKj1f+GkwHrxMIf9tX84sMGgLFa5YoRmyuUugGhffiubkVLYIrlm4W0uSy2NzX4t6+V7keFLQf7lRQvDmA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", "dependencies": { - "Humanizer.Core": "2.8.26", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.Extensions.Configuration": { "type": "Direct", - "requested": "[6.0.1, )", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "MongoDB.Driver": { "type": "Direct", - "requested": "[2.21.0, )", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "requested": "[2.23.1, )", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "NLog": { "type": "Direct", - "requested": "[5.2.4, )", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "requested": "[5.2.8, )", + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -153,10 +156,10 @@ }, "fo-dicom": { "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -165,7 +168,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -176,8 +179,8 @@ }, "Humanizer.Core": { "type": "Transitive", - "resolved": "2.8.26", - "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, "Macross.Json.Extensions": { "type": "Transitive", @@ -194,178 +197,233 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "1Qf/tEg6IlzbvCxrc+pZE+ZGrajBdB/+V2+abeAu6lg8wXGHmO8JtnrNqwc5svSbcz3udxinUPyH3vw6ZujKbg==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.21", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.21", - "contentHash": "5FSA1euCRtbRqVgTn2ahgCG9Cy29UQXAZMCJLUlrQQaC5rko0+d/aq9SiFGIDP7cvoWUsatrlNdfc6UyOMV5aA==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -383,49 +441,49 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -433,18 +491,18 @@ }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -452,15 +510,28 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" + }, "RabbitMQ.Client": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -478,32 +549,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "System.Buffers": { @@ -511,6 +582,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections.Immutable": { "type": "Transitive", "resolved": "6.0.0", @@ -519,24 +595,86 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Diagnostics.DiagnosticSource": { + "System.Composition": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" } }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" + }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", @@ -566,19 +704,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.Channels": { @@ -586,29 +720,42 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -623,7 +770,7 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } } } diff --git a/src/Shared/Test/VerifyLogExtension.cs b/src/Shared/Test/VerifyLogExtension.cs index ba45f76d3..47577a908 100755 --- a/src/Shared/Test/VerifyLogExtension.cs +++ b/src/Shared/Test/VerifyLogExtension.cs @@ -14,7 +14,9 @@ * limitations under the License. */ +#pragma warning disable IDE0005 // Using directive is unnecessary. using System; +#pragma warning restore IDE0005 // Using directive is unnecessary. using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Logging; using Moq; @@ -32,7 +34,6 @@ public static Mock VerifyLoggingMessageEndsWith(this Mock logg #pragma warning disable CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. Func state = (v, t) => v.ToString().EndsWith(expectedMessage); - logger.Verify( x => x.Log( It.Is(l => l == expectedLogLevel), @@ -126,7 +127,6 @@ public static Mock> VerifyLogging(this Mock> logger, Lo { times ??= Times.Once(); - logger.Verify( x => x.Log( It.Is(l => l == expectedLogLevel), @@ -139,5 +139,6 @@ public static Mock> VerifyLogging(this Mock> logger, Lo return logger; } } + #pragma warning restore CS8602 // Dereference of a possibly null reference. } diff --git a/tests/Integration.Test/Common/Assertions.cs b/tests/Integration.Test/Common/Assertions.cs index f0d861570..074e5094c 100755 --- a/tests/Integration.Test/Common/Assertions.cs +++ b/tests/Integration.Test/Common/Assertions.cs @@ -23,6 +23,7 @@ using FellowOakDicom; using FellowOakDicom.Serialization; using Minio; +using Minio.DataModel.Args; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; @@ -307,7 +308,7 @@ internal void ShouldHaveCorrectNumberOfWorkflowRequestMessagesAndHl7Messages(Hl7 } } - private MinioClient GetMinioClient() => new MinioClient() + private MinioClient GetMinioClient() => (MinioClient)new MinioClient() .WithEndpoint(_options.Storage.Settings["endpoint"]) .WithCredentials(_options.Storage.Settings["accessKey"], _options.Storage.Settings["accessToken"]) .Build(); diff --git a/tests/Integration.Test/Common/DicomWebDataSink.cs b/tests/Integration.Test/Common/DicomWebDataSink.cs index fb1bf9644..1daa84fc8 100755 --- a/tests/Integration.Test/Common/DicomWebDataSink.cs +++ b/tests/Integration.Test/Common/DicomWebDataSink.cs @@ -59,7 +59,7 @@ public async Task SendAsync(DataProvider dataProvider, params object[] args) var endpoint = args[0].ToString(); _outputHelper.WriteLine($"POSTing studies to {endpoint} with {dicomFileSpec.Files.Count} files..."); - var httpClient = HttpClientFactory.Create(); + var httpClient = new HttpClient(); var dicomWebClient = new DicomWebClient(httpClient, null); dicomWebClient.ConfigureServiceUris(new Uri(endpoint)); diff --git a/tests/Integration.Test/Common/FhirDataSink.cs b/tests/Integration.Test/Common/FhirDataSink.cs index 931442e50..4671e5e06 100755 --- a/tests/Integration.Test/Common/FhirDataSink.cs +++ b/tests/Integration.Test/Common/FhirDataSink.cs @@ -39,7 +39,7 @@ public FhirDataClient(Configurations configurations, InformaticsGatewayConfigura public async Task SendAsync(DataProvider dataProvider, params object[] args) { Guard.Against.Null(dataProvider, nameof(dataProvider)); - var httpClient = HttpClientFactory.Create(); + var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri($"{_configurations.InformaticsGatewayOptions.ApiEndpoint}/fhir/"); httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(dataProvider.FhirSpecs.MediaType)); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", dataProvider.FhirSpecs.MediaType); diff --git a/tests/Integration.Test/Common/MinioDataSink.cs b/tests/Integration.Test/Common/MinioDataSink.cs index f54d61f2e..3d0c8a5c5 100755 --- a/tests/Integration.Test/Common/MinioDataSink.cs +++ b/tests/Integration.Test/Common/MinioDataSink.cs @@ -17,6 +17,7 @@ using System.Diagnostics; using System.Text; using Minio; +using Minio.DataModel.Args; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; using Polly; @@ -102,7 +103,7 @@ await _retryPolicy.ExecuteAsync(async () => }); } - private MinioClient CreateMinioClient() => new MinioClient() + private MinioClient CreateMinioClient() => (MinioClient)new MinioClient() .WithEndpoint(_options.Storage.Settings["endpoint"]) .WithCredentials(_options.Storage.Settings["accessKey"], _options.Storage.Settings["accessToken"]) .Build(); diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 6f1d24e3b..df08fe2df 100755 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -82,7 +82,7 @@ public static void Init(ISpecFlowOutputHelper outputHelper) s_hl7Sink = new Hl7DataClient(Configurations.Instance, s_options.Value, outputHelper); s_echoscu = new DicomCEchoDataClient(Configurations.Instance, s_options.Value, outputHelper); s_storescu = new DicomCStoreDataClient(Configurations.Instance, s_options.Value, outputHelper); - s_informaticsGatewayClient = new InformaticsGatewayClient(HttpClientFactory.Create(), scope.ServiceProvider.GetRequiredService>()); + s_informaticsGatewayClient = new InformaticsGatewayClient(new HttpClient(), scope.ServiceProvider.GetRequiredService>()); s_informaticsGatewayClient.ConfigureServiceUris(new Uri(Configurations.Instance.InformaticsGatewayOptions.ApiEndpoint)); s_options.Value.Dicom.Scu.MaximumNumberOfAssociations = 1; s_options.Value.DicomWeb.MaximumNumberOfConnection = 1; diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index 2d79b05c2..1ee43297f 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -13,55 +13,49 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - net6.0 + net8.0 enable true true - all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - - - - - - - - - - - + + + + + + + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + + + + - - - @@ -73,11 +67,9 @@ - - Always @@ -92,7 +84,6 @@ Always - @@ -100,7 +91,6 @@ - study.json @@ -110,4 +100,4 @@ - + \ No newline at end of file diff --git a/tests/Integration.Test/debug.sh b/tests/Integration.Test/debug.sh index 5edaeeab9..2331136a0 100755 --- a/tests/Integration.Test/debug.sh +++ b/tests/Integration.Test/debug.sh @@ -20,7 +20,7 @@ export SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" TEST_DIR="$SCRIPT_DIR/" LOG_DIR="${GITHUB_WORKSPACE:-$SCRIPT_DIR}" RUN_DIR="$SCRIPT_DIR/.run" -BIN_DIR="$TEST_DIR/bin/Release/net6.0" +BIN_DIR="$TEST_DIR/bin/Release/net8.0" CONFIG_DIR="$SCRIPT_DIR/configs" EXIT=false METRICSFILE="$LOG_DIR/metrics.log" diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json old mode 100755 new mode 100644 index 9a208b6ce..9561bfb0d --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + "net8.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -10,20 +10,20 @@ }, "FluentAssertions": { "type": "Direct", - "requested": "[6.11.0, )", - "resolved": "6.11.0", - "contentHash": "aBaagwdNtVKkug1F3imGXUlmoBd8ZUZX8oQ5niThaJhF79SpESe1Gzq7OFuZkQdKD5Pa4Mone+jrbas873AT4g==", + "requested": "[6.12.0, )", + "resolved": "6.12.0", + "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", "dependencies": { "System.Configuration.ConfigurationManager": "4.4.0" } }, "fo-dicom": { "type": "Direct", - "requested": "[5.1.1, )", - "resolved": "5.1.1", - "contentHash": "YraR81u9XuTN7l+pt6HzT0KvuhgWVZ9LCuHMH3zgFfAtv4peT1y+nYMSGwF9YqNP+oZnzh0s0PJ+vJMsTDpGIw==", + "requested": "[5.1.2, )", + "resolved": "5.1.2", + "contentHash": "2lM76Vq+GRdwyY3BQiUJ+V6yxdFiOG4ysLJC7qNTxLsq/1pr5ZTTXiIzWQa+uJ0MuKnzzFogV5+meDflsyjs2g==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.2.0", + "CommunityToolkit.HighPerformance": "8.2.2", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.HashCode": "1.1.1", "Microsoft.Extensions.DependencyInjection": "6.0.1", @@ -32,7 +32,7 @@ "System.Buffers": "4.5.1", "System.Text.Encoding.CodePages": "6.0.0", "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.7", + "System.Text.Json": "6.0.9", "System.Threading.Channels": "6.0.0" } }, @@ -44,134 +44,136 @@ }, "Microsoft.EntityFrameworkCore": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "txcqw2xrmvMoTIgzAdUk8JHLELofGgTK3i6glswVZs4SC8BOU1M/iSAtwMIVtAtfzxuBIUAbHPx+Ly6lfkYe7g==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "SoODat83pGQUpWB9xULdMX6tuKpq/RTXDuJ2WeC1ldUKcKzLkaFJD1n+I0nOLY58odez/e7z8b6zdp235G/kyg==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "6.0.25", - "Microsoft.EntityFrameworkCore.Analyzers": "6.0.25", - "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "System.Collections.Immutable": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.0", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[6.0.25, )", - "resolved": "6.0.25", - "contentHash": "vaQNuXgUN0nIzFXQiPSb9iAaJqLvZA164Sx9mjF5rFQS5cwQ/AiymF0e4J0QH3P07Mf3zEVZE5u2fTO0NacuMQ==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "hd3l+6Wyo4GwFAWa8J87L1X1ypYsk3za1lIsaF3U4X/tUJof/QPkuFbdfAADhmNqvqppmUL04RbgFM2nl5A7rQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.25", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.Extensions.Configuration": { "type": "Direct", - "requested": "[6.0.1, )", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.EnvironmentVariables": { "type": "Direct", - "requested": "[6.0.1, )", - "resolved": "6.0.1", - "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" } }, "Minio": { "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "7tZj90WEuuH60RAP4wBYexjMuJOhCnK7I46hCiX3CtZPackHisLZ8aAJmn3KlwbUX22dBDphwemD+h37vet8Qw==", + "requested": "[6.0.1, )", + "resolved": "6.0.1", + "contentHash": "uavo/zTpUzHLqnB0nyAk6E/2THLRPvZ59Md7IkLKXkAFiX//K2knVK2+dSHDNN2uAUqCvLqO+cM+s9VGBWbIKQ==", "dependencies": { - "CommunityToolkit.HighPerformance": "8.1.0", + "CommunityToolkit.HighPerformance": "8.2.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", "System.IO.Hashing": "7.0.0", - "System.Reactive.Linq": "5.0.0" + "System.Reactive": "6.0.0" } }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[1.0.5, )", - "resolved": "1.0.5", - "contentHash": "L+BWU5Xq1ARjFRcpnefDJGuG52Zw4Iz3qql1tn8lYfqoC4B37fAUVz6k7Ar7v1OUwPo/JR8q4OP2IIMpqpKRRA==", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", "dependencies": { - "Monai.Deploy.Messaging": "1.0.5", - "Polly": "7.2.4", - "RabbitMQ.Client": "6.5.0" + "Monai.Deploy.Messaging": "2.0.0", + "Polly": "8.2.0", + "RabbitMQ.Client": "6.8.1" } }, "Monai.Deploy.Storage.MinIO": { "type": "Direct", - "requested": "[0.2.18, )", - "resolved": "0.2.18", - "contentHash": "0sHLiT0qU2Fg5O+AF8UDqzsJEYztUAFZeOPh4kOLC4bckhb+wSsuv7VcAXWtR3BOY6TxaMVVUJ+EK/o5mCp3tQ==", + "requested": "[1.0.0, )", + "resolved": "1.0.0", + "contentHash": "o6Lq9rshOJ3sxz4lIfl14Zn7+YXvXXg2Jpndtnnx4Ez1RDSTDu2Zf08lEgFHTmwAML1e4fsVVm16LaXv3h3L3A==", "dependencies": { - "Minio": "5.0.0", - "Monai.Deploy.Storage": "0.2.18", - "Monai.Deploy.Storage.S3Policy": "0.2.18" + "Minio": "6.0.1", + "Monai.Deploy.Storage": "1.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0" } }, "Moq": { "type": "Direct", - "requested": "[4.20.69, )", - "resolved": "4.20.69", - "contentHash": "8P/oAUOL8ZVyXnzBBcgdhTsOD1kQbAWfOcMI7KDQO3HqQtzB/0WYLdnMa4Jefv8nu/MQYiiG0IuoJdvG0v0Nig==", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", "dependencies": { "Castle.Core": "5.1.1" } }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "dependencies": { + "Polly.Core": "8.2.1" + } }, "RabbitMQ.Client": { "type": "Direct", - "requested": "[6.5.0, )", - "resolved": "6.5.0", - "contentHash": "9hY5HiWPtCla1/l0WmXmLnqoX7iKE3neBQUWnetIJrRpOvTbO//XQfQDh++xgHCshL40Kv/6bR0HDkmJz46twg==", + "requested": "[6.8.1, )", + "resolved": "6.8.1", + "contentHash": "jNsmGgmCNw2S/NzskeN2ijtGywtH4Sk/G6jWUTD5sY9SrC27Xz6BsLIiB8hdsfjeyWCa4j4GvCIGkpE8wrjU1Q==", "dependencies": { "System.Memory": "4.5.5", "System.Threading.Channels": "7.0.0" @@ -211,56 +213,46 @@ }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.6.5, )", + "resolved": "2.6.5", + "contentHash": "iPSL63kw21BdSsdA79bvbVNvyn17DWI4D6VbgNxYtvzgViKrmbRLr8sWPxSlc4AvnofEuFfAi/rrLSzSRomwCg==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.9.0", + "xunit.assert": "2.6.5", + "xunit.core": "[2.6.5]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" - }, - "AnswerDicomTools": { - "type": "Transitive", - "resolved": "0.1.1-rc0089", - "contentHash": "DgDBjo708kHmr0lUdUrYaRLjmaICrJMBh6w/Vd0E/r2SJ0DDiQuxMABJzIwXwrVFSzrrwpqPqWBQMTCY++9uPQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "MongoDB.Driver": "2.21.0", - "fo-dicom": "5.1.1" - } + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "Ardalis.GuardClauses": { "type": "Transitive", - "resolved": "4.1.1", - "contentHash": "+UcJ2s+gf2wMNrwadCaHZV2DMcGgBU1t22A+jm40P4MHQRLy9hcleGy5xdVWd4dXZPa5Vlp4TG5xU2rhoDYrBA==" + "resolved": "4.3.0", + "contentHash": "5KQ6zQDNRduora6L8lGQcRikLNLj0s4XjctGuUX24uBRzHMMKv6BatVDSBWRs96riz7PJj7Efn3yOFhfYXgnWg==" }, "AspNetCore.HealthChecks.MongoDb": { "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "0R3NVbsjMhS5fd2hGijzQNKJ0zQBv/qMC7nkpmnbtgribCj7vfNdAhSqv4lwbibffRWPW5A/7VNJMX4aPej0WQ==", + "resolved": "8.0.0", + "contentHash": "0YjJlCwkwulozPxFCRcJAl2CdjU5e5ekj4/BQsA6GZbzRxwtN3FIg7LJcWUUgMdwqDoe+6SKFBRnSRpfLY4owA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.2", - "MongoDB.Driver": "2.14.1" + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "MongoDB.Driver": "2.22.0" } }, "AWSSDK.Core": { "type": "Transitive", - "resolved": "3.7.200.13", - "contentHash": "yiUuhTI8w183euRqhXym1DyhnD/1ccxceRoruCfkIoqY3PAaFgFL8pE4iDLDZa7SUW4M4qZnQ5PMlFr1rrl6zw==" + "resolved": "3.7.300.29", + "contentHash": "BMvjbKNzA7Y1eFbhnRbexaUKZ6FwR/hAdvmPYYYA35kw0Ig5E12shMiCEqtRL1EQYVpAqmLdSPZNxV4hu5Ncng==" }, "AWSSDK.SecurityToken": { "type": "Transitive", - "resolved": "3.7.201.9", - "contentHash": "yKlTPrvNeDdzkOX82Ydf7MD09Gk3dK74JWZPRWJ3QIxskWVoNTAyLvfVBzbi+/fGnjf8/qKsSzxT7GHLqds37A==", + "resolved": "3.7.300.30", + "contentHash": "hsCHGNTf1UeNEVBrjuFsWQfylcqzrBn27bfidgr0VVCKc82dz/PEFIrSFzXuEOjvRSiO5wji/V7x9bGyf1aJ6A==", "dependencies": { - "AWSSDK.Core": "[3.7.200.13, 4.0.0)" + "AWSSDK.Core": "[3.7.300.29, 4.0.0)" } }, "BoDi": { @@ -278,8 +270,8 @@ }, "CommunityToolkit.HighPerformance": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "iKzsPiSnXoQUN5AoApYmdfnLn9osNb+YCLWRr5PFmrDEQVIu7OeOyf4DPvNBvbqbYLZCfvHozPkulyv6zBQsFw==" + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, "DnsClient": { "type": "Transitive", @@ -291,19 +283,19 @@ }, "DotNext": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "5Xp6G9U0MhSmfgxKklUUsOFfSg2VqF+/rkd7WyoUs7HqbnVd32bRw2rWW5o+rieHLzUlW/sagctPiaZqmeTA+g==", + "resolved": "4.15.2", + "contentHash": "Q5l6yVmJh9ow2MjDPSMOAj1N9fZpuu1SFRLEEjL5shk5i80GU0PsqoNDKFsAI7ciePoAP6y8mkARpmmDzP4Xqw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "DotNext.Threading": { "type": "Transitive", - "resolved": "4.7.4", - "contentHash": "G/AogSunqiZZ/0H4y3Qy/YNveIB+6azddStmFxbxLWkruXZ27gXyoRQ9kQ2gpDbq/+YfMINz9nmTY5ZtuCzuyw==", + "resolved": "4.15.2", + "contentHash": "bOOePY7XQTMtOQ+0cui3K9x44Q8CEpH/tXfXFHPBZjwFexa9SBevMGvHO6MINHC1QnKUP9nHZIIMQ3Jfr88aQQ==", "dependencies": { - "DotNext": "4.7.4", - "System.Threading.Channels": "6.0.0" + "DotNext": "4.15.2", + "System.Threading.Channels": "7.0.0" } }, "Gherkin": { @@ -311,26 +303,22 @@ "resolved": "19.0.3", "contentHash": "kq9feqMojMj9aABrHb/ABEPaH2Y4dSclseSahAru6qxCeqVQNLLTgw/6vZMauzI1yBUL2fz03ub5yEd5btLfvg==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" }, - "Microsoft.AspNet.WebApi.Client": { - "type": "Transitive", - "resolved": "5.2.9", - "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", - "dependencies": { - "Newtonsoft.Json": "10.0.1", - "Newtonsoft.Json.Bson": "1.0.1" - } - }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "Transitive", - "resolved": "6.0.11", - "contentHash": "ivpWC8L84Y+l9VZOa0uJXPoUE+n3TiSRZpfKxMElRtLMYCeXmz5x3O7CuCJkZ65z1520RWuEZDmHefxiz5TqPg==", + "resolved": "8.0.0", + "contentHash": "rwxaZYHips5M9vqxRkGfJthTx+Ws4O4yCuefn17J371jL3ouC5Ker43h2hXb5yd9BMnImE9rznT75KJHm6bMgg==", "dependencies": { - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.10.0" + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.0.3" } }, "Microsoft.Bcl.AsyncInterfaces": { @@ -343,51 +331,115 @@ "resolved": "1.1.1", "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" }, - "Microsoft.CodeCoverage": { + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3", + "System.Collections.Immutable": "6.0.0", + "System.Reflection.Metadata": "6.0.1", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encoding.CodePages": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } }, - "Microsoft.CSharp": { + "Microsoft.CodeAnalysis.CSharp.Workspaces": { "type": "Transitive", "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0", + "System.IO.Pipelines": "6.0.3", + "System.Threading.Channels": "6.0.0" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "rbXNoMg/ylGyJxLcyetojuXFzvDG85M31DfFbqL8veN4P8oG6wmnPwWNn3/bDIEDVvdw15R092dxpobQeQcjGg==", + "resolved": "8.0.0", + "contentHash": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "DalO25C96LsIfAPlyizyun9y1XrIquRugPEGXC8+z7dFo+GyU0LRd0R11JDd3rJWjR18NOFYwqNenjyDpNRO3A==" + "resolved": "8.0.0", + "contentHash": "VR22s3+zoqlVI7xauFKn1znSIFHO8xuILT+noSwS8bZCKcHz0ydkTDQMuaxSa5WBaQrZmwtTz9rmRvJ7X8mSPQ==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "i6UpdWqWxSBbIFOkaMoubM40yIjTZO+0rIUkY5JRltSeFI4PzncBBQcNVNXXjAmiLXF/xY0xTS+ykClbkV46Yg==" + "resolved": "8.0.0", + "contentHash": "ZXxEeLs2zoZ1TA+QoMMcw4f3Tirf8PzgdDax8RoWo0dxI2KmqiEGWYjhm2B/XyWfglc6+mNRyB8rZiQSmxCpeg==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "94reKYu63jg4O75UI3LMJHwOSi8tQ6IfubiZhdnSsWcgtmAuF8OyLfjK/MIxuvaQRJZAF6E747FIuxjOtb8/og==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Mono.TextTemplating": "2.2.1" + } }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "ci2lR++x7R7LR71+HoeRnB9Z5VeOQ1ILLbFRhsjjWZyLrAMkdq7TK9Ll47jo1TXDWF8Ddeap1JgcptgPKkWSRA==", + "resolved": "8.0.0", + "contentHash": "fFKkr24cYc7Zw5T6DC4tEyOEPgPbq23BBmym1r9kn4ET9F3HKaetpOeQtV2RryYyUxEeNkJuxgfiZHTisqZc+A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "6.0.25", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.EntityFrameworkCore": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "IU4E8I9FS2sUVxJJ0w/4jogLQ8C0zvu/SO6b1tRmiiCtTrHhjUB0tqhxjrFnDXZ/mpCJOElw50+qhbcElm0CYw==", + "resolved": "8.0.0", + "contentHash": "Vtnf4SIenAR0fp4OGEb83Dgn37lSMQqt6952e0f/6u/HNO4KQBKYiFw9vWIW4f4nNApre39WioW+jqaIVk15Wg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "6.0.25", - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.DependencyModel": "6.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.DependencyModel": "8.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Tools": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "zRdaXiiB1gEA0b+AJTd2+drh78gkEA4HyZ1vqNZrKq4xwW8WwavSiQsoeb1UsIMZkocLMBbhQYWClkZzuTKEgQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Design": "8.0.0" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -397,326 +449,241 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "resolved": "8.0.0", + "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9vz47iGkzqhh0bGqomOTxaJNEEajeNcbSTSWwhh9Soo9lWm0UdPbw04CxXCQJPhc0aw9OaMnOxx7sCcde8/adA==", + "resolved": "8.0.0", + "contentHash": "P9SoBuVZhJPpALZmSq72aQEb9ryP67EdquaCZGXGrrcASTNHYdrUhnpgSwIipgM5oVC+dKpRXg5zxobmF9xr5g==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.4", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "9sd1K/rp/vlxrBWNa0i8fgHCBPg94cocGMsJr7z9e2zQGQxMHNGpspdcy/FRGPAh2CINQet/RrM6Ef196xI20w==" + "resolved": "8.0.0", + "contentHash": "AT2qqos3IgI09ok36Qag9T8bb6kHJ3uT9Q5ki6CySybFsK6/9JbvQAgAHf1pVEjST0/N4JaFaCbm40R5edffwg==" }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Transitive", - "resolved": "6.0.25", - "contentHash": "Cmhq0sgb53+dh9xHOlBEQUhi13vsZeQ4fcYC9JYO4med7pabj9x3100opCdUv+7UX+tUC1GPm/nco+1skJdLFA==", + "resolved": "8.0.0", + "contentHash": "rtnltltUHm1nMEupZ9PNbs+b/8VXDZ/9Be8kxsaX3A00wqIQqNanfAG9xavu3CSCpkflF8M72py9oEdwbVaMZA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.25" + "Microsoft.EntityFrameworkCore.Relational": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" - }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", - "Microsoft.Extensions.Configuration.Json": "6.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Physical": "6.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Logging.Console": "6.0.0", - "Microsoft.Extensions.Logging.Debug": "6.0.0", - "Microsoft.Extensions.Logging.EventLog": "6.0.0", - "Microsoft.Extensions.Logging.EventSource": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Text.Json": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.EventLog": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, - "Microsoft.Extensions.Logging.EventSource": { + "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "resolved": "8.0.0", + "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "6.0.0" + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "cfPUWdjigLIRIJSKz3uaZxShgf86RVDXHC1VEEchj1gnY25akwPYpbrfSoIGDCqA9UmOMdlctq411+2pAViFow==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "0qjS31rN1MQTc46tAYbzmMTSRfdV5ndZxSjYxIGqKSidd4wpNJfNII/pdhU5Fx8olarQoKL9lqqYw4yNOIwT0Q==", + "resolved": "7.0.3", + "contentHash": "vxjHVZbMKD3rVdbvKhzAW+7UiFrYToUVm3AGmYfKSOAwyhdLl/ELX1KZr+FaLyyS5VReIzWRWJfbOuHM9i6ywg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "zbcwV6esnNzhZZ/VP87dji6VrUBLB5rxnZBkDMqNYpyG+nrBnBsbm4PUYLCBMUflHCM9EMLDG0rLnqqT+l0ldA==" + "resolved": "7.0.3", + "contentHash": "b6GbGO+2LOTBEccHhqoJsOsmemG4A/MY+8H0wK/ewRhiG+DCYwEnucog1cSArPIY55zcn+XdZl0YEiUHkpDISQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "7.0.3" + } }, "Microsoft.IdentityModel.Protocols": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "DFyXD0xylP+DknCT3hzJ7q/Q5qRNu0hO/gCU90O0ATdR0twZmlcuY9RNYaaDofXKVbzcShYNCFCGle2G/o8mkg==", + "resolved": "7.0.3", + "contentHash": "BtwR+tctBYhPNygyZmt1Rnw74GFrJteW+1zcdIgyvBCjkek6cNwPPqRfdhzCv61i+lwyNomRi8+iI4QKd4YCKA==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.Logging": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "LVvMXAWPbPeEWTylDrxunlHH2wFyE4Mv0L4gZrJHC4HTESbWHquKZb/y/S8jgiQEDycOP0PDQvbG4RR/tr2TVQ==", + "resolved": "7.0.3", + "contentHash": "W97TraHApDNArLwpPcXfD+FZH7njJsfEwZE9y9BoofeXMS8H0LBBobz0VOmYmMK4mLdOKxzN7SFT3Ekg0FWI3Q==", "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.10.0", - "System.IdentityModel.Tokens.Jwt": "6.10.0" + "Microsoft.IdentityModel.Protocols": "7.0.3", + "System.IdentityModel.Tokens.Jwt": "7.0.3" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "qbf1NslutDB4oLrriYTJpy7oB1pbh2ej2lEHd2IPDQH9C74ysOdhU5wAC7KoXblldbo7YsNR2QYFOqQM/b0Rsg==", + "resolved": "7.0.3", + "contentHash": "wB+LlbDjhnJ98DULjmFepqf9eEMh/sDs6S6hFh68iNRHmwollwhxk+nbSSfpA5+j+FbRyNskoaY4JsY1iCOKCg==", "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.10.0", - "System.Security.Cryptography.Cng": "4.5.0" + "Microsoft.IdentityModel.Logging": "7.0.3" } }, "Microsoft.NETCore.Platforms": { @@ -736,8 +703,8 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", "dependencies": { "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" @@ -745,10 +712,10 @@ }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.8.0", "Newtonsoft.Json": "13.0.1" } }, @@ -773,53 +740,53 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "1.0.5", - "contentHash": "J8Lskfy8PSVQLDE2uLqh53uaPpqpRJuSGVHpR2jrw+GYnTTDv21j/2gxwG8Hq2NgNOkWLNVi+fFnyWd6WFiUTA==", + "resolved": "2.0.0", + "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", "Newtonsoft.Json": "13.0.3", - "System.IO.Abstractions": "17.2.3" + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Security": { "type": "Transitive", - "resolved": "0.1.3", - "contentHash": "9/E/UEK9Foo1cUHRRgNIR8uk+oTLiBbzR2vqBsxIo1EwbduDVuBGFcIh2lpAJZmFFwBNv0KtmTASdD3w5UWd+g==", + "resolved": "1.0.0", + "contentHash": "q0dQiOpOoHX4a3XkueqFRx51WOrQpW1Lwj7e4oqI6aOBeUlA9CPMdZ4+4BlemXc/1A5IClrPugp/owZ1NJ2Wxg==", "dependencies": { - "Ardalis.GuardClauses": "4.0.1", - "Microsoft.AspNetCore.Authentication.JwtBearer": "6.0.11", - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.3", - "Microsoft.Extensions.Logging.Configuration": "6.0.0" + "Ardalis.GuardClauses": "4.3.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "8.0.0", + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Configuration": "8.0.0" } }, "Monai.Deploy.Storage": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+1JX7QDgVEMqYA0/M1QMr1gtXRC6lEuhBtLfJXWi6cEgh9kOPE0KiHd1AWI7PxBgBbsEBZaNQSvWqShlwcu6bA==", + "resolved": "1.0.0", + "contentHash": "YN087swDoJJCj+UgPVWzsraxL730ajg8OJdEahgPvZFe4quFlfhWIGLweVKRNhSvrN/CV87/m+noLJu7jSEaww==", "dependencies": { - "AWSSDK.SecurityToken": "3.7.201.9", - "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.21", - "Monai.Deploy.Storage.S3Policy": "0.2.18", - "System.IO.Abstractions": "17.2.3" + "AWSSDK.SecurityToken": "3.7.300.30", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", + "Monai.Deploy.Storage.S3Policy": "1.0.0", + "System.IO.Abstractions": "20.0.4" } }, "Monai.Deploy.Storage.S3Policy": { "type": "Transitive", - "resolved": "0.2.18", - "contentHash": "+b0nDnf4OoajdH2hB02elRC6G+GjlYnxJC+F3dGbUUXGMtPApzs8c8s/EG4fKzihxsVovJtqnJl7atcaPyl12Q==", + "resolved": "1.0.0", + "contentHash": "I8My4nZEt1vA2wDvti84CfhK+TnyW60E/50Cb+xyhzdrlqWpWr/Xbwhl1ocELAPDeRsakECK4cikrNYLbpp+pQ==", "dependencies": { - "Ardalis.GuardClauses": "4.1.1", + "Ardalis.GuardClauses": "4.3.0", "Newtonsoft.Json": "13.0.3" } }, "MongoDB.Bson": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "QT+D1I3Jz6r6S6kCgJD1L9dRCLVJCKlkGRkA+tJ7uLpHRmjDNcNKy4D1T+L9gQrjl95lDN9PHdwEytdvCW/jzA==", + "resolved": "2.23.1", + "contentHash": "IX9tycM35xK5hFwnU+rzharPJOtKYtON6E6Lp2nwOVjh40TUcS/HYToEEWZkLgqKNMCfYPK3Fz3QUCxzhkQRGA==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "5.0.0" @@ -827,29 +794,29 @@ }, "MongoDB.Driver": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "VxKj1wuhadiXhaXkykCWRgsYOysdaOYJ202hJFz25UjkrqC/tHA8RS4hdS5HYfGWoI//fypBXnxZCkEjXLXdfw==", + "resolved": "2.23.1", + "contentHash": "kidqCwGBuLBx2IcW4os3J6zsp9yaUWm7Sp8G08Nm2RVRSAf0cJXfsynl2wRWpHh0HgfIzzwkevP/qhfsKfu8bQ==", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", - "MongoDB.Driver.Core": "2.21.0", + "MongoDB.Bson": "2.23.1", + "MongoDB.Driver.Core": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0" } }, "MongoDB.Driver.Core": { "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "Ac44U3bQfinmdH5KNFjTidJe9LKW87SxkXJ3YuIUJQMITEc4083YF1yvjJxaSeYF9er0YgHSmwhHpsZv0Fwplg==", + "resolved": "2.23.1", + "contentHash": "K8LMdnVgT82vdbSllv8VzjPOLa9k5rLcCBd1fG45z+QGJNPWzAFW5lLgLJQ7xXuJgQIwvP1DBx6X6ecWBtox7g==", "dependencies": { "AWSSDK.SecurityToken": "3.7.100.14", "DnsClient": "1.6.1", "Microsoft.Extensions.Logging.Abstractions": "2.0.0", - "MongoDB.Bson": "2.21.0", + "MongoDB.Bson": "2.23.1", "MongoDB.Libmongocrypt": "1.8.0", "SharpCompress": "0.30.1", "Snappier": "1.0.0", "System.Buffers": "4.5.1", - "ZstdSharp.Port": "0.6.2" + "ZstdSharp.Port": "0.7.3" } }, "MongoDB.Libmongocrypt": { @@ -857,6 +824,14 @@ "resolved": "1.8.0", "contentHash": "fgNw8Dxpkq7mpoaAYes8cfnPRzvFIoB8oL9GPXwi3op/rONftl0WAeg4akRLcxfoVuUvuUO2wGoVBr3JzJ7Svw==" }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "NETStandard.Library": { "type": "Transitive", "resolved": "1.6.1", @@ -913,36 +888,27 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "Newtonsoft.Json.Bson": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "Newtonsoft.Json": "10.0.1" - } - }, "NLog": { "type": "Transitive", - "resolved": "5.2.4", - "contentHash": "/qzds1Cp9rQD53La3mlWOmCHsFSbmT9BCb8q6k3eOrbOYDfdf3ZN1hBW7IDImUD6V8BfPfEFBhXGDLOEOQxHgQ==" + "resolved": "5.2.8", + "contentHash": "jAIELkWBs1CXFPp986KSGpDFQZHCFccO+LMbKBTTNm42KifaI1mYzFMFQQfuGmGMTrCx0TFPhDjHDE4cLAZWiQ==" }, "NLog.Extensions.Logging": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "rxUGUqhE3DlcKfKhPJOI0xOt8q2+NX0NkBY9lbRXwZEYQsh8ASFS8X7K+Y7/dcE8v0tpAe7GF8rPD5h4h9Hpsg==", + "resolved": "5.3.8", + "contentHash": "6VD0lyeokWltL6j8lO7mS7v7lbuO/qn0F7kdvhKhEx1JvFyD39nzohOK3JvkVh4Nn3mrcMDCyDxvTvmiW55jQg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "NLog": "5.2.4" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "NLog": "5.2.8" } }, "NLog.Web.AspNetCore": { "type": "Transitive", - "resolved": "5.3.4", - "contentHash": "80FaN8CKu94E3mZqZ+r46nRyEYgnHMn4i3vPslbaINs8k+TqJClNFYw6uWLhPU4AN7PKi/jHHzpswqn7K8jgGg==", + "resolved": "5.3.8", + "contentHash": "Rt2OCulpAF6rSrZWZzPgHikAI8SDKkq3/52xA/uJ4JtmNjoizULN/IBYtYlZojbPbXiFm3uadOO2rOvvMhjXBQ==", "dependencies": { - "NLog.Extensions.Logging": "5.3.4" + "NLog.Extensions.Logging": "5.3.8" } }, "NuGet.Frameworks": { @@ -950,6 +916,11 @@ "resolved": "6.5.0", "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" + }, "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { "type": "Transitive", "resolved": "4.3.2", @@ -1096,32 +1067,32 @@ }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.2" + "SQLitePCLRaw.core": "2.1.6" } }, "Swashbuckle.AspNetCore": { @@ -1169,6 +1140,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.Collections": { "type": "Transitive", "resolved": "4.3.0", @@ -1204,6 +1180,54 @@ "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, + "System.Composition": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "4.5.0", @@ -1237,11 +1261,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -1304,11 +1325,11 @@ }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "6.10.0", - "contentHash": "C+Q5ORsFycRkRuvy/Xd0Pv5xVpmWSAvQYZAGs7VQogmkqlLhvfZXTgBIlHqC3cxkstSoLJAYx6xZB7foQ2y5eg==", + "resolved": "7.0.3", + "contentHash": "caEe+OpQNYNiyZb+DJpUVROXoVySWBahko2ooNfUcllxa9ZQUM8CgM/mDjP6AoFn6cQU9xMmG+jivXWub8cbGg==", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.10.0", - "Microsoft.IdentityModel.Tokens": "6.10.0" + "Microsoft.IdentityModel.JsonWebTokens": "7.0.3", + "Microsoft.IdentityModel.Tokens": "7.0.3" } }, "System.IO": { @@ -1325,8 +1346,12 @@ }, "System.IO.Abstractions": { "type": "Transitive", - "resolved": "17.2.3", - "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + "resolved": "20.0.4", + "contentHash": "Vv3DffYCM/DEQ7+9Dn7ydq852WSVtdeoLNlztIqaMAl4o6aALyAJQRTQ30d/3D7BVf5pALsGm22HYb4Y6h8xvw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4", + "TestableIO.System.IO.Abstractions.Wrappers": "20.0.4" + } }, "System.IO.Compression": { "type": "Transitive", @@ -1394,6 +1419,11 @@ "resolved": "7.0.0", "contentHash": "sDnWM0N3AMCa86LrKTWeF3BZLD2sgWyYUc7HL6z4+xyDZNQRwzmxbo4qP2rX2MqC+Sy1/gOSRDah5ltxY5jPxw==" }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, "System.Linq": { "type": "Transitive", "resolved": "4.3.0", @@ -1506,17 +1536,8 @@ }, "System.Reactive": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" - }, - "System.Reactive.Linq": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "IB4/qlV4T1WhZvM11RVoFUSZXPow9VWVeQ1uDkSKgz6bAO+gCf65H/vjrYlwyXmojSSxvfHndF9qdH43P/IuAw==", - "dependencies": { - "System.Reactive": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } + "resolved": "6.0.0", + "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" }, "System.Reflection": { "type": "Transitive", @@ -1576,8 +1597,11 @@ }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "6.0.1", + "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "dependencies": { + "System.Collections.Immutable": "6.0.0" + } }, "System.Reflection.Primitives": { "type": "Transitive", @@ -1724,8 +1748,21 @@ }, "System.Security.Cryptography.Cng": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } }, "System.Security.Cryptography.Csp": { "type": "Transitive", @@ -1881,19 +1918,15 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Text.RegularExpressions": { @@ -1930,8 +1963,13 @@ }, "System.Threading.Tasks.Extensions": { "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } }, "System.Threading.Timer": { "type": "Transitive", @@ -1984,6 +2022,19 @@ "System.Xml.ReaderWriter": "4.3.0" } }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "zvuE3an8qmEjlz72ZKyW/gBZprR0TMTDxuw77i1OXi5wEagXRhHwP4lOaLvHIXNlwyCAmdmei6iLHsfsZcuUAA==" + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "20.0.4", + "contentHash": "LbVaZauZfCkcGmHyPhQ2yiKv5GQqTvMViPYd3NjU1tGxp0N2p7Oc6Q/2trN6ZNIZCr42ujJdYUB63hE4mtsHRQ==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "20.0.4" + } + }, "Validation": { "type": "Transitive", "resolved": "2.4.18", @@ -1996,30 +2047,27 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.9.0", + "contentHash": "02ucFDty6Y9BBT5c35YueFfbM3uEzeFdRvlNtAPhZVUkGUlhl3jsV2XesgTj986/PZXIjpVoc2D8ee6p1ha/Fw==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.5", + "contentHash": "gb5uv7vjBFz7nhEa6aXK5sVJwsG/88xf8DN5wqK0ejCDsDybqICyNJIj+eoD43xbmdPZryNDPpeWDCfiKI/bnA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.6.5", + "contentHash": "hpdMnSNlx4ejaxpaIAFaqHt4q9ZCnzZLnURrSa5CzYXxHhIQbV8/0yXLjRdublhreonGXVMmsQ1KHlS9WbfpCw==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]", + "xunit.extensibility.execution": "[2.6.5]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.6.5", + "contentHash": "dSGRkVxzH27XaL83+Z9kNPllqgsmsiPayXw+0weCGsrZQxfSCBNNkSb9nYUpkVoEBCUviXOmo1tfApqhgqTjog==", "dependencies": { "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" @@ -2027,11 +2075,11 @@ }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.6.5", + "contentHash": "jUMr88e0lSqDq8Vut0XVqx7plFg91QsKW/rX6gaVnJL6Z19LmNSDmyqd7cg6HQGfboAmyoFZyydA4Kcgouu1BA==", "dependencies": { "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.6.5]" } }, "Xunit.SkippableFact": { @@ -2045,33 +2093,15 @@ }, "ZstdSharp.Port": { "type": "Transitive", - "resolved": "0.6.2", - "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" - }, - "monai-deploy-informatics-gateway-pseudonymisation": { - "type": "Project", - "dependencies": { - "AnswerDicomTools": "[0.1.1-rc0089, )", - "Ardalis.GuardClauses": "[4.1.1, )", - "HL7-dotnetcore": "[2.36.0, )", - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration": "[6.0.1, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Hosting": "[6.0.1, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.4, )", - "Polly": "[7.2.4, )", - "fo-dicom": "[5.1.1, )" - } + "resolved": "0.7.3", + "contentHash": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==" }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { - "DotNext.Threading": "[4.7.4, )", + "DotNext.Threading": "[4.15.2, )", "HL7-dotnetcore": "[2.36.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", @@ -2080,10 +2110,10 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Security": "[0.1.3, )", - "Monai.Deploy.Storage.MinIO": "[0.2.18, )", - "NLog.Web.AspNetCore": "[5.3.4, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Security": "[1.0.0, )", + "Monai.Deploy.Storage.MinIO": "[1.0.0, )", + "NLog.Web.AspNetCore": "[5.3.8, )", "Swashbuckle.AspNetCore": "[6.5.0, )" } }, @@ -2092,12 +2122,12 @@ "dependencies": { "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", - "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[1.0.5, )", - "Monai.Deploy.Messaging.RabbitMQ": "[1.0.5, )", - "Monai.Deploy.Storage": "[0.2.18, )", - "fo-dicom": "[5.1.1, )" + "Monai.Deploy.Messaging": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Storage": "[1.0.0, )", + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.client": { @@ -2110,14 +2140,14 @@ "monai.deploy.informaticsgateway.client.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )" + "Ardalis.GuardClauses": "[4.3.0, )" } }, "monai.deploy.informaticsgateway.common": { "type": "Project", "dependencies": { - "Ardalis.GuardClauses": "[4.1.1, )", - "System.IO.Abstractions": "[17.2.3, )" + "Ardalis.GuardClauses": "[4.3.0, )", + "System.IO.Abstractions": "[20.0.4, )" } }, "monai.deploy.informaticsgateway.configuration": { @@ -2130,9 +2160,10 @@ "monai.deploy.informaticsgateway.database": { "type": "Project", "dependencies": { - "AspNetCore.HealthChecks.MongoDb": "[6.0.2, )", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "AspNetCore.HealthChecks.MongoDb": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Tools": "[8.0.0, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", @@ -2145,55 +2176,55 @@ "dependencies": { "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", - "NLog": "[5.2.4, )" + "NLog": "[5.2.8, )" } }, "monai.deploy.informaticsgateway.database.entityframework": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "Polly": "[7.2.4, )" + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.database.mongodb": { "type": "Project", "dependencies": { "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.dicomweb.client": { "type": "Project", "dependencies": { - "Microsoft.AspNet.WebApi.Client": "[5.2.9, )", "Monai.Deploy.InformaticsGateway.Client.Common": "[1.0.0, )", - "System.Linq.Async": "[6.0.1, )", - "fo-dicom": "[5.1.1, )" + "fo-dicom": "[5.1.2, )" } }, "monai.deploy.informaticsgateway.plugins.remoteappexecution": { "type": "Project", "dependencies": { - "Microsoft.EntityFrameworkCore": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", - "Microsoft.Extensions.Configuration": "[6.0.1, )", - "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", - "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )", + "Microsoft.EntityFrameworkCore": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Design": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Relational": "[8.0.0, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.0, )", + "Microsoft.Extensions.Configuration": "[8.0.0, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[8.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )", "Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )", - "MongoDB.Driver": "[2.21.0, )", - "NLog": "[5.2.4, )", - "Polly": "[7.2.4, )" + "MongoDB.Driver": "[2.23.1, )", + "NLog": "[5.2.8, )", + "Polly": "[8.2.1, )" } }, "monai.deploy.informaticsgateway.test.plugins": { diff --git a/tests/Integration.Test/run.sh b/tests/Integration.Test/run.sh index 5bbbd9e79..08356d9cf 100755 --- a/tests/Integration.Test/run.sh +++ b/tests/Integration.Test/run.sh @@ -21,7 +21,7 @@ export SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" DOCKER_COMPOSE_DIR="$SCRIPT_DIR/../../docker-compose" TEST_DIR="$SCRIPT_DIR/" LOG_DIR="${GITHUB_WORKSPACE:-$SCRIPT_DIR}" -BIN_DIR="$TEST_DIR/bin/Release/net6.0" +BIN_DIR="$TEST_DIR/bin/Release/net8.0" FEATURE= export STUDYJSON="study.json" From 18fbfb755fa29ffd769b41fc43c15d4b8ba0a0f2 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 15 Jan 2024 10:06:26 +0000 Subject: [PATCH 61/75] adding HL7 message plugin support Signed-off-by: Neil South --- .github/workflows/ci.yml | 4 +- src/Api/Hl7ApplicationConfigEntity.cs | 8 +- .../HealthLevel7 => Api/Mllp}/IMllpClient.cs | 6 +- .../HealthLevel7 => Api/Mllp}/IMllpExtract.cs | 8 +- .../HealthLevel7 => Api/Mllp}/IMllpService.cs | 2 +- .../Mllp}/MllpClientResult.cs | 4 +- ...Monai.Deploy.InformaticsGateway.Api.csproj | 1 + src/Api/PlugIns/IInputHL7DataPlugIn.cs | 35 ++ src/Api/PlugIns/IInputHL7DataPlugInEngine.cs | 42 ++ src/Api/Storage/Hl7FileStorageMetadata.cs | 2 +- src/Api/Test/packages.lock.json | 6 + src/Api/packages.lock.json | 6 + src/CLI/Test/packages.lock.json | 6 + src/CLI/packages.lock.json | 6 + src/Client/Test/packages.lock.json | 1 + src/Client/packages.lock.json | 6 + src/Configuration/Test/packages.lock.json | 6 + src/Configuration/packages.lock.json | 6 + src/Database/Api/Test/packages.lock.json | 6 + src/Database/Api/packages.lock.json | 6 + src/Database/DatabaseMigrationManager.cs | 2 +- .../20231204113501_Hl7DEstinationAndConfig.cs | 2 +- .../20231207154732_Hl7Plugins.Designer.cs | 508 ++++++++++++++++++ .../Migrations/20231207154732_Hl7Plugins.cs | 27 + .../InformaticsGatewayContextModelSnapshot.cs | 3 + .../Hl7ApplicationConfigRepository.cs | 6 +- .../EntityFramework/Test/packages.lock.json | 6 + .../EntityFramework/packages.lock.json | 6 + .../Integration.Test/packages.lock.json | 6 + .../HL7DestinationEntityRepository.cs | 5 +- .../Hl7ApplicationConfigRepository.cs | 5 +- src/Database/MongoDB/packages.lock.json | 6 + src/Database/packages.lock.json | 6 + .../Logging/Log.800.Hl7Service.cs | 21 +- src/InformaticsGateway/Program.cs | 7 +- .../Common/IInputDataPluginEngineFactory.cs | 7 + .../Services/Common/InputDataPluginEngine.cs | 11 +- .../Common/InputHL7DataPlugInEngine.cs | 94 ++++ .../Services/Common/OutputDataPluginEngine.cs | 2 +- .../Services/Connectors/PayloadAssembler.cs | 22 + .../PayloadNotificationActionHandler.cs | 3 + .../Services/Export/ExportServiceBase.cs | 3 +- .../Services/Export/Hl7ExportService.cs | 6 +- .../HealthLevel7/IMllpClientFactory.cs | 2 +- .../Services/HealthLevel7/MllpClient.cs | 19 +- .../Services/HealthLevel7/MllpExtract.cs | 62 ++- .../Services/HealthLevel7/MllpService.cs | 51 +- .../Services/Http/Startup.cs | 2 - .../Services/Scp/ApplicationEntityHandler.cs | 2 +- .../Test/Plug-ins/TestInputHL7DataPlugs.cs | 39 ++ .../InputHL7DataPlugInEngineFactoryTest.cs | 69 +++ .../Common/InputHL7DataPlugInEngineTest.cs | 164 ++++++ .../Services/Export/ExportHl7ServiceTests.cs | 1 + .../Services/HealthLevel7/MllPExtractTests.cs | 17 +- .../Services/HealthLevel7/MllpClientTest.cs | 3 +- .../Services/HealthLevel7/MllpServiceTest.cs | 23 +- .../Test/packages.lock.json | 1 + src/InformaticsGateway/nlog.config | 1 + src/InformaticsGateway/packages.lock.json | 1 + .../Test/packages.lock.json | 6 + .../RemoteAppExecution/packages.lock.json | 6 + tests/Integration.Test/Common/DataProvider.cs | 3 +- .../StepDefinitions/Hl7StepDefinitions.cs | 2 +- ...emoteAppExecutionPlugInsStepDefinitions.cs | 1 - tests/Integration.Test/appsettings.json | 19 + tests/Integration.Test/packages.lock.json | 127 +++++ 66 files changed, 1455 insertions(+), 97 deletions(-) mode change 100644 => 100755 .github/workflows/ci.yml rename src/{InformaticsGateway/Services/HealthLevel7 => Api/Mllp}/IMllpClient.cs (88%) mode change 100644 => 100755 rename src/{InformaticsGateway/Services/HealthLevel7 => Api/Mllp}/IMllpExtract.cs (78%) rename src/{InformaticsGateway/Services/HealthLevel7 => Api/Mllp}/IMllpService.cs (92%) rename src/{InformaticsGateway/Services/HealthLevel7 => Api/Mllp}/MllpClientResult.cs (91%) create mode 100755 src/Api/PlugIns/IInputHL7DataPlugIn.cs create mode 100755 src/Api/PlugIns/IInputHL7DataPlugInEngine.cs mode change 100644 => 100755 src/Database/DatabaseMigrationManager.cs create mode 100755 src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs mode change 100644 => 100755 src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs mode change 100644 => 100755 src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs create mode 100755 src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs create mode 100755 src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs create mode 100755 src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs create mode 100755 src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml old mode 100644 new mode 100755 index ca6a5527c..51a009a7b --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,11 +183,11 @@ jobs: ports: - 27017:27017 steps: - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: zulu - java-version: '11' + java-version: '17' - uses: actions/setup-dotnet@v3 with: diff --git a/src/Api/Hl7ApplicationConfigEntity.cs b/src/Api/Hl7ApplicationConfigEntity.cs index aefa605cf..3cc3160d9 100755 --- a/src/Api/Hl7ApplicationConfigEntity.cs +++ b/src/Api/Hl7ApplicationConfigEntity.cs @@ -26,7 +26,7 @@ namespace Monai.Deploy.InformaticsGateway.Api { - public class Hl7ApplicationConfigEntity : MongoDBEntityBase + public sealed class Hl7ApplicationConfigEntity : MongoDBEntityBase { /// /// Gets or sets the name of a Hl7 application entity. @@ -60,6 +60,8 @@ public class Hl7ApplicationConfigEntity : MongoDBEntityBase /// public List PlugInAssemblies { get; set; } = default!; + public DateTime LastModified { get; set; } = DateTime.UtcNow; + public IEnumerable Validate() { var errors = new List(); @@ -114,7 +116,7 @@ public override string ToString() } //string key, string value - public class StringKeyValuePair : IKeyValuePair + public sealed class StringKeyValuePair : IKeyValuePair, IEquatable { [Key] public string Key { get; set; } = string.Empty; @@ -136,7 +138,7 @@ public static List FromDictionary(Dictionary } - public class DataKeyValuePair : IKeyValuePair + public sealed class DataKeyValuePair : IKeyValuePair, IEquatable { [Key] public string Key { get; set; } = string.Empty; diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs b/src/Api/Mllp/IMllpClient.cs old mode 100644 new mode 100755 similarity index 88% rename from src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs rename to src/Api/Mllp/IMllpClient.cs index 8e38ac846..e8c631c32 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs +++ b/src/Api/Mllp/IMllpClient.cs @@ -18,9 +18,9 @@ using System.Threading; using System.Threading.Tasks; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal interface IMllpClient : IDisposable + public interface IMllpClient : IDisposable { Guid ClientId { get; } @@ -28,4 +28,4 @@ internal interface IMllpClient : IDisposable Task Start(Func onDisconnect, CancellationToken cancellationToken); } -} \ No newline at end of file +} diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs b/src/Api/Mllp/IMllpExtract.cs similarity index 78% rename from src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs rename to src/Api/Mllp/IMllpExtract.cs index 8fd8bbf37..2c82fee46 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpExtract.cs +++ b/src/Api/Mllp/IMllpExtract.cs @@ -19,10 +19,12 @@ using HL7.Dotnetcore; using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal interface IMllpExtract + public interface IMllpExtract { - Task ExtractInfo(Hl7FileStorageMetadata meta, Message message); + Task ExtractInfo(Hl7FileStorageMetadata meta, Message message, Hl7ApplicationConfigEntity configItem); + + Task GetConfigItem(Message message); } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs b/src/Api/Mllp/IMllpService.cs similarity index 92% rename from src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs rename to src/Api/Mllp/IMllpService.cs index 6272464b2..d12e1fd28 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpService.cs +++ b/src/Api/Mllp/IMllpService.cs @@ -18,7 +18,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { public interface IMllpService { diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClientResult.cs b/src/Api/Mllp/MllpClientResult.cs similarity index 91% rename from src/InformaticsGateway/Services/HealthLevel7/MllpClientResult.cs rename to src/Api/Mllp/MllpClientResult.cs index 401875804..36db3b65f 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClientResult.cs +++ b/src/Api/Mllp/MllpClientResult.cs @@ -18,9 +18,9 @@ using System.Collections.Generic; using HL7.Dotnetcore; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal class MllpClientResult + public class MllpClientResult { public IList Messages { get; } public AggregateException? AggregateException { get; } diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index f4b8450b0..181306f97 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -53,6 +53,7 @@ + diff --git a/src/Api/PlugIns/IInputHL7DataPlugIn.cs b/src/Api/PlugIns/IInputHL7DataPlugIn.cs new file mode 100755 index 000000000..b44d0f736 --- /dev/null +++ b/src/Api/PlugIns/IInputHL7DataPlugIn.cs @@ -0,0 +1,35 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.PlugIns +{ + /// + /// IInputDataPlugIn enables lightweight data processing over incoming data received from supported data ingestion + /// services. + /// Refer to for additional details. + /// + public interface IInputHL7DataPlugIn + { + string Name { get; } + + Task<(Message hl7Message, FileStorageMetadata fileMetadata)> ExecuteAsync(Message hl7File, FileStorageMetadata fileMetadata); + } + +} diff --git a/src/Api/PlugIns/IInputHL7DataPlugInEngine.cs b/src/Api/PlugIns/IInputHL7DataPlugInEngine.cs new file mode 100755 index 000000000..dc34b976d --- /dev/null +++ b/src/Api/PlugIns/IInputHL7DataPlugInEngine.cs @@ -0,0 +1,42 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Api.PlugIns +{ + /// + /// IInputDataPlugInEngine processes incoming data receivied from various supported services through + /// a list of plug-ins based on . + /// Rules: + /// + /// SCP: A list of plug-ins can be configured with each AET, and each plug-in is executed in the order stored, enabling piping of the incoming data before each file is uploaded to the storage service. + /// Incoming data is processed one file at a time and SHALL not wait for the entire study to arrive. + /// Plug-ins MUST be lightweight and not hinder the upload process. + /// Plug-ins SHALL not accumulate files in memory or storage for bulk processing. + /// + /// + public interface IInputHL7DataPlugInEngine + { + void Configure(IReadOnlyList pluginAssemblies); + + Task> ExecutePlugInsAsync(Message hl7File, FileStorageMetadata fileMetadata, Hl7ApplicationConfigEntity configItem); + } +} diff --git a/src/Api/Storage/Hl7FileStorageMetadata.cs b/src/Api/Storage/Hl7FileStorageMetadata.cs index 576f88ae3..b4e33aed3 100755 --- a/src/Api/Storage/Hl7FileStorageMetadata.cs +++ b/src/Api/Storage/Hl7FileStorageMetadata.cs @@ -27,7 +27,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Storage public sealed record Hl7FileStorageMetadata : FileStorageMetadata { public const string Hl7SubDirectoryName = "ehr"; - public const string FileExtension = ".txt"; + public const string FileExtension = ".hl7"; /// [JsonIgnore] diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index c3b2fbbdd..903cc6b49 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -94,6 +94,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1277,6 +1282,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 2f0038d42..1a4adf62a 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -21,6 +21,12 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Direct", + "requested": "[2.36.0, )", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Direct", "requested": "[3.0.0, )", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index 7ae5d5d97..dbdd6f20e 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -137,6 +137,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1560,6 +1565,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 75418ec51..22c1f3e80 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -93,6 +93,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -541,6 +546,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index 49b143571..2bbd6ee7a 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -1826,6 +1826,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index d3be0afb3..2a3e704e0 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -43,6 +43,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -274,6 +279,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 9265712dc..02e67b1eb 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -102,6 +102,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1290,6 +1295,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index 5af67fda9..2b5691080 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -43,6 +43,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -274,6 +279,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index 93a1cc3a7..65aff269f 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -76,6 +76,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1264,6 +1269,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index f86d76521..53e07aa40 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -49,6 +49,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -280,6 +285,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/DatabaseMigrationManager.cs b/src/Database/DatabaseMigrationManager.cs old mode 100644 new mode 100755 index da35c17a4..72acb2cd8 --- a/src/Database/DatabaseMigrationManager.cs +++ b/src/Database/DatabaseMigrationManager.cs @@ -61,7 +61,7 @@ private static Type[] FindMatchingTypesFromAssemblies(Assembly[] assemblies) var matchingTypes = new List(); foreach (var assembly in assemblies) { - var types = assembly.ExportedTypes.Where(p => p.IsAssignableFrom(typeof(IDatabaseMigrationManager))); + var types = assembly.ExportedTypes.Where(p => p.IsAssignableFrom(typeof(IDatabaseMigrationManager)) && p.Name != nameof(IDatabaseMigrationManager)); if (types.Any()) { matchingTypes.AddRange(types); diff --git a/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs index 7dbf72215..d23d89c28 100755 --- a/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs +++ b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs @@ -1,4 +1,4 @@ -using System; + using Microsoft.EntityFrameworkCore.Migrations; #nullable disable diff --git a/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs new file mode 100755 index 000000000..256eb5527 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20231207154732_Hl7Plugins")] + partial class Hl7Plugins + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataMapping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all2"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs new file mode 100755 index 000000000..c86631267 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20231207154732_Hl7Plugins.cs @@ -0,0 +1,27 @@ + +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class Hl7Plugins : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "LastModified", + table: "Hl7ApplicationConfig", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "LastModified", + table: "Hl7ApplicationConfig"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs index cec0093f1..8eb10b0df 100755 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -34,6 +34,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("DateTimeCreated") .HasColumnType("TEXT"); + b.Property("LastModified") + .HasColumnType("TEXT"); + b.Property("PlugInAssemblies") .IsRequired() .HasColumnType("TEXT"); diff --git a/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs old mode 100644 new mode 100755 index 7f6711ab4..898181503 --- a/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs +++ b/src/Database/EntityFramework/Repositories/Hl7ApplicationConfigRepository.cs @@ -63,11 +63,7 @@ public Task DeleteAsync(string id, CancellationToken { return _retryPolicy.ExecuteAsync(async () => { - var entity = await GetByIdAsync(id).ConfigureAwait(false); - if (entity is null) - { - throw new DatabaseException("Failed to delete entity."); - } + var entity = await GetByIdAsync(id).ConfigureAwait(false) ?? throw new DatabaseException("Failed to delete entity."); var result = _dataset.Remove(entity); await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); return result.Entity; diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 40ce6d70b..95ac88e42 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -102,6 +102,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1468,6 +1473,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index c80430fab..91f7b6eac 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -110,6 +110,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.8.26", @@ -472,6 +477,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index 8ad2d5e4f..c0cbcf5cf 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -110,6 +110,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1395,6 +1400,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs old mode 100644 new mode 100755 index 37676d848..feb428f09 --- a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs @@ -53,7 +53,10 @@ public HL7DestinationEntityRepository( _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( options.Value.Retries.RetryDelays, - (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + (exception, timespan, count, context) => + { + _logger.DatabaseErrorRetry(timespan, count, exception); + }); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DatabaseName); diff --git a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs index b7a35ce5e..8b23cf257 100755 --- a/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs +++ b/src/Database/MongoDB/Repositories/Hl7ApplicationConfigRepository.cs @@ -49,7 +49,10 @@ public Hl7ApplicationConfigRepository(IServiceScopeFactory serviceScopeFactory, _scope = serviceScopeFactory.CreateScope(); _retryPolicy = Policy.Handle().WaitAndRetryAsync( options.Value.Retries.RetryDelays, - (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + (exception, timespan, count, context) => + { + _logger.DatabaseErrorRetry(timespan, count, exception); + }); var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); var mongoDatabase = mongoDbClient.GetDatabase(options.Value.DatabaseName); diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index b248f4c03..cd453a7c0 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -69,6 +69,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -373,6 +378,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 9fa7405f1..af4bbeb2a 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -94,6 +94,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.8.26", @@ -609,6 +614,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs index a3235b8a0..b207d5f87 100755 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -51,14 +51,14 @@ public static partial class Log [LoggerMessage(EventId = 809, Level = LogLevel.Debug, Message = "Acknowledgment type={value}.")] public static partial void AcknowledgmentType(this ILogger logger, string value); - [LoggerMessage(EventId = 810, Level = LogLevel.Information, Message = "Acknowledgment sent: length={length}.")] - public static partial void AcknowledgmentSent(this ILogger logger, int length); + [LoggerMessage(EventId = 810, Level = LogLevel.Information, Message = "Acknowledgment sent message:{message} length:{length}.")] + public static partial void AcknowledgmentSent(this ILogger logger, string message, int length); [LoggerMessage(EventId = 811, Level = LogLevel.Debug, Message = "HL7 bytes received: {length}.")] public static partial void Hl7MessageBytesRead(this ILogger logger, int length); - [LoggerMessage(EventId = 812, Level = LogLevel.Debug, Message = "Parsing message with {length} bytes.")] - public static partial void Hl7GenerateMessage(this ILogger logger, int length); + [LoggerMessage(EventId = 812, Level = LogLevel.Debug, Message = "Parsing message with {length} bytes. {message}")] + public static partial void Hl7GenerateMessage(this ILogger logger, int length, string message); [LoggerMessage(EventId = 813, Level = LogLevel.Debug, Message = "Waiting for HL7 message.")] public static partial void HL7ReadingMessage(this ILogger logger); @@ -101,5 +101,18 @@ public static partial class Log [LoggerMessage(EventId = 826, Level = LogLevel.Debug, Message = "HL7 meassage sent received {ack}")] public static partial void Hl7MessageSent(this ILogger logger, string ack); + + [LoggerMessage(EventId = 827, Level = LogLevel.Warning, Message = "HL7 plugin loading exceptions")] + public static partial void HL7PluginLoadingExceptions(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 828, Level = LogLevel.Information, Message = "HL7 message recieved. {message}")] + public static partial void Hl7MessageReceieved(this ILogger logger, string message); + + [LoggerMessage(EventId = 829, Level = LogLevel.Trace, Message = "HL7 config Not matching message Id {senderId} configId {configID}")] + public static partial void Hl7NotMatchingConfig(this ILogger logger, string senderId, string configID); + + [LoggerMessage(EventId = 830, Level = LogLevel.Error, Message = "Error generating HL7 acknowledgment. for message {message}")] + public static partial void ErrorGeneratingHl7Acknowledgment(this ILogger logger, Exception ex, string message); + } } diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 9586ee88c..c860f83aa 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -25,6 +25,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; @@ -35,7 +36,6 @@ using Monai.Deploy.InformaticsGateway.Services.DicomWeb; using Monai.Deploy.InformaticsGateway.Services.Export; using Monai.Deploy.InformaticsGateway.Services.Fhir; -using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; using Monai.Deploy.InformaticsGateway.Services.Http; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Scu; @@ -116,8 +116,10 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped, InputDataPlugInEngineFactory>(); services.AddScoped, OutputDataPlugInEngineFactory>(); + services.AddScoped, InputHL7DataPlugInEngineFactory>(); services.AddMonaiDeployStorageService(hostContext.Configuration!.GetSection("InformaticsGateway:storage:serviceAssemblyName").Value, Monai.Deploy.Storage.HealthCheckOptions.ServiceHealthCheck); @@ -152,7 +154,6 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => .AddHttpClient("fhir", configure => configure.Timeout = timeout) .SetHandlerLifetime(timeout); -#pragma warning disable CS8603 // Possible null reference return. services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); @@ -164,7 +165,6 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); -#pragma warning restore CS8603 // Possible null reference return. }) .ConfigureWebHostDefaults(webBuilder => @@ -182,6 +182,7 @@ private static NLog.Logger ConfigureNLog(string assemblyVersionNumber) ext.RegisterLayoutRenderer("servicename", logEvent => typeof(Program).Namespace); ext.RegisterLayoutRenderer("serviceversion", logEvent => assemblyVersionNumber); ext.RegisterLayoutRenderer("machinename", logEvent => Environment.MachineName); + ext.RegisterLayoutRenderer("appname", logEvent => "MIG"); }) .LoadConfigurationFromAppSettings() .GetCurrentClassLogger(); diff --git a/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs b/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs old mode 100644 new mode 100755 index 4f122da6f..880eaef95 --- a/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs +++ b/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs @@ -125,4 +125,11 @@ public OutputDataPlugInEngineFactory(IFileSystem fileSystem, ILogger + { + public InputHL7DataPlugInEngineFactory(IFileSystem fileSystem, ILogger> logger) : base(fileSystem, logger) + { + } + } } diff --git a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs old mode 100644 new mode 100755 index 3b0d177d2..51d7b18b3 --- a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json; using System.Threading.Tasks; using FellowOakDicom; using Microsoft.Extensions.Logging; @@ -31,7 +32,7 @@ internal class InputDataPlugInEngine : IInputDataPlugInEngine { private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; - private IReadOnlyList? _plugsins; + private IReadOnlyList? _plugins; public InputDataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) { @@ -41,20 +42,22 @@ public InputDataPlugInEngine(IServiceProvider serviceProvider, ILogger pluginAssemblies) { - _plugsins = LoadPlugIns(_serviceProvider, pluginAssemblies); + _plugins = LoadPlugIns(_serviceProvider, pluginAssemblies); } public async Task> ExecutePlugInsAsync(DicomFile dicomFile, FileStorageMetadata fileMetadata) { - if (_plugsins == null) + if (_plugins == null) { throw new PlugInInitializationException("InputDataPlugInEngine not configured, please call Configure() first."); } - foreach (var plugin in _plugsins) + foreach (var plugin in _plugins) { _logger.ExecutingInputDataPlugIn(plugin.Name); (dicomFile, fileMetadata) = await plugin.ExecuteAsync(dicomFile, fileMetadata).ConfigureAwait(false); + + _logger.InputDataPlugInEngineexecuted(plugin.Name, JsonSerializer.Serialize(fileMetadata)); } return new Tuple(dicomFile, fileMetadata); diff --git a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs new file mode 100755 index 000000000..6f7f1d7bf --- /dev/null +++ b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs @@ -0,0 +1,94 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Logging; + +namespace Monai.Deploy.InformaticsGateway.Services.Common +{ + public class InputHL7DataPlugInEngine : IInputHL7DataPlugInEngine + { + private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; + private IReadOnlyList? _plugsins; + + public InputHL7DataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) + { + _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public void Configure(IReadOnlyList pluginAssemblies) + { + _plugsins = LoadPlugIns(_serviceProvider, pluginAssemblies); + } + + public async Task> ExecutePlugInsAsync(Message hl7File, FileStorageMetadata fileMetadata, Hl7ApplicationConfigEntity? configItem) + { + if (configItem?.PlugInAssemblies is not null && configItem.PlugInAssemblies.Any()) + { + if (_plugsins == null) + { + throw new PlugInInitializationException("InputHL7DataPlugInEngine not configured, please call Configure() first."); + } + + foreach (var plugin in _plugsins) + { + if (configItem is not null && configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) + { + _logger.ExecutingInputDataPlugIn(plugin.Name); + (hl7File, fileMetadata) = await plugin.ExecuteAsync(hl7File, fileMetadata).ConfigureAwait(false); + } + } + } + return new Tuple(hl7File, fileMetadata); + } + + private IReadOnlyList LoadPlugIns(IServiceProvider serviceProvider, IReadOnlyList pluginAssemblies) + { + var exceptions = new List(); + var list = new List(); + foreach (var plugin in pluginAssemblies) + { + try + { + _logger.AddingInputDataPlugIn(plugin); + list.Add(typeof(IInputHL7DataPlugIn).CreateInstance(serviceProvider, typeString: plugin)); + } + catch (Exception ex) + { + exceptions.Add(new PlugInLoadingException($"Error loading plug-in '{plugin}'.", ex)); + } + } + + if (exceptions.Any()) + { + throw new AggregateException("Error loading plug-in(s).", exceptions); + } + + return list; + } + } +} diff --git a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs index ecbf77a93..a497862dc 100755 --- a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs @@ -61,7 +61,7 @@ public async Task ExecutePlugInsAsync(ExportRequestDat (dicomFile, exportRequestDataMessage) = await plugin.ExecuteAsync(dicomFile, exportRequestDataMessage).ConfigureAwait(false); } using var ms = new MemoryStream(); - await dicomFile.SaveAsync(ms); + await dicomFile.SaveAsync(ms).ConfigureAwait(false); exportRequestDataMessage.SetData(ms.ToArray()); return exportRequestDataMessage; diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index 1222add24..9485f7fc0 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -18,6 +18,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; @@ -134,6 +135,21 @@ private async void OnTimedEvent(Object? source, System.Timers.ElapsedEventArgs e foreach (var key in _payloads.Keys) { var payload = await _payloads[key].Task.ConfigureAwait(false); + + + + + + + _logger.LogTrace($"Payload = correlationId {payload.CorrelationId} obj: {JsonSerializer.Serialize(payload)}"); + + + + + + + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", payload.CorrelationId } }); _logger.BucketElapsedTime(key, payload.Timeout, payload.ElapsedTime().TotalSeconds, payload.Files.Count, payload.FilesUploaded, payload.FilesFailedToUpload); @@ -204,10 +220,16 @@ private async Task CreateOrGetPayload(string key, string correlationId, { return await _payloads.GetOrAdd(key, x => new AsyncLazy(async () => { + + var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null, destinationFolder); await repository.AddAsync(newPayload).ConfigureAwait(false); + + _logger.LogTrace($"CreateOrGetPayload = correlationId {correlationId} obj: {JsonSerializer.Serialize(newPayload)}"); + + _logger.BucketCreated(key, timeout); return newPayload; })); diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 1aa2a848a..cae010ecf 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -16,6 +16,7 @@ using System; using System.Linq; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; @@ -169,6 +170,8 @@ private async Task SendArtifactRecievedEvent(Payload payload) }; artifiactRecievedEvent.DataOrigins.AddRange(payload.DataOrigins); + _logger.LogTrace($"Adding files to ArtifactsReceivedEvent files {JsonSerializer.Serialize(payload)}"); + artifiactRecievedEvent.Artifacts = payload.Files.Select(f => new Artifact { Type = f.DataOrigin.ArtifactType, Path = f.File.UploadPath }).ToList(); var message = new JsonMessage( diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs index 935f87817..b6f73b1c6 100755 --- a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs +++ b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs @@ -138,7 +138,6 @@ public async Task StopAsync(CancellationToken cancellationToken) await Task.Delay(250).ConfigureAwait(false); #pragma warning restore CA2016 // Forward the 'CancellationToken' parameter to methods _cancellationTokenSource.Dispose(); - return; } private void SetupPolling() @@ -147,7 +146,7 @@ private void SetupPolling() _logger.ExportEventSubscription(ServiceName, RoutingKey); } - protected async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) + protected virtual async Task OnMessageReceivedCallback(MessageReceivedEventArgs eventArgs) { using var loggerScope = _logger.BeginScope(new Messaging.Common.LoggingDataDictionary { { "ThreadId", Environment.CurrentManagedThreadId }, diff --git a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs index 16ed9a345..1acf2f17e 100755 --- a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs +++ b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs @@ -28,9 +28,10 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.Messaging.Common; using Polly; +using System.Linq; namespace Monai.Deploy.InformaticsGateway.Services.Export { @@ -119,7 +120,7 @@ private async Task ExecuteHl7Export( .ExecuteAsync(async () => { await _mllpService.SendMllp( - IPAddress.Parse(destination.HostIp), + Dns.GetHostAddresses(destination.HostIp).First(), destination.Port, Encoding.UTF8.GetString(exportRequestData.FileContent), cancellationToken ).ConfigureAwait(false); @@ -159,5 +160,6 @@ protected override Task ExecuteOutputDataEngineCallbac { return Task.FromResult(exportDataRequest); } + } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs index fe2c1b8a5..3640227a2 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpClientFactory.cs @@ -18,7 +18,7 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Common; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { internal interface IMllpClientFactory { diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index b3c87372b..be1cf2c02 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -23,12 +23,12 @@ using Ardalis.GuardClauses; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { internal sealed class MllpClient : IMllpClient { @@ -159,13 +159,18 @@ private async Task SendAcknowledgment(INetworkStream clientStream, Message messa if (ShouldSendAcknowledgment(message)) { - var ackMessage = message.GetACK(); + var ackMessage = message.GetACK(true); + if (ackMessage is null) + { + _logger.ErrorGeneratingHl7Acknowledgment(new Exception(), message.HL7Message); + return; + } var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); try { await clientStream.WriteAsync(ackData, cancellationToken).ConfigureAwait(false); await clientStream.FlushAsync(cancellationToken).ConfigureAwait(false); - _logger.AcknowledgmentSent(ackData.Length); + _logger.AcknowledgmentSent(ackMessage.HL7Message, ackData.Length); } catch (Exception ex) { @@ -181,7 +186,7 @@ private bool ShouldSendAcknowledgment(Message message) try { var value = message.DefaultSegment(Resources.MessageHeaderSegment).Fields(Resources.AcceptAcknowledgementType); - if (value is null) + if (value is null || string.IsNullOrWhiteSpace(value.Value)) { return true; } @@ -211,9 +216,9 @@ private bool CreateMessage(int startIndex, int endIndex, ref string data, out Me try { var text = data.Substring(messageStartIndex, endIndex - messageStartIndex); - _logger.Hl7GenerateMessage(text.Length); + _logger.Hl7GenerateMessage(text.Length, text); message = new Message(text); - message.ParseMessage(); + message.ParseMessage(true); data = data.Length > endIndex ? data.Substring(messageEndIndex) : string.Empty; return true; } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs index d27e7a71e..ccc571859 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -17,20 +17,21 @@ using System; using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; using FellowOakDicom; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { - internal sealed class MllpExtract : IMllpExtract + public sealed class MllpExtract : IMllpExtract { private readonly ILogger _logger; private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; @@ -44,25 +45,10 @@ public MllpExtract(IHl7ApplicationConfigRepository hl7ApplicationConfigRepositor } - public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message message) + public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message message, Hl7ApplicationConfigEntity configItem) { try { - // load the config - var config = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); - if (config == null) - { - _logger.Hl7NoConfig(); - return message; - } - _logger.Hl7ConfigLoaded($"Config: {config}"); - // get config for vendorId - var configItem = GetConfig(config, message); - if (configItem == null) - { - _logger.Hl7NoMatchingConfig(message.HL7Message); - return message; - } // extract data for the given fields // Use Id to get record from Db var details = await GetExtAppDetails(configItem, message).ConfigureAwait(false); @@ -94,6 +80,26 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess return message; } + public async Task GetConfigItem(Message message) + { + // load the config + var config = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); + if (config == null) + { + _logger.Hl7NoConfig(); + return null; + } + _logger.Hl7ConfigLoaded($"Config: {JsonSerializer.Serialize(config)}"); + // get config for vendorId + var configItem = GetConfig(config, message); + if (configItem == null) + { + _logger.Hl7NoMatchingConfig(message.HL7Message); + return null; + } + return configItem; + } + private async Task GetExtAppDetails(Hl7ApplicationConfigEntity hl7ApplicationConfigEntity, Message message) { var tagId = message.GetValue(hl7ApplicationConfigEntity.DataLink.Key); @@ -101,9 +107,9 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess switch (type) { case DataLinkType.PatientId: - return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; + return await _externalAppDetailsRepository.GetByPatientIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); case DataLinkType.StudyInstanceUid: - return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); ; + return await _externalAppDetailsRepository.GetByStudyIdOutboundAsync(tagId, new CancellationToken()).ConfigureAwait(false); default: break; } @@ -111,14 +117,20 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess throw new Exception($"Invalid DataLinkType: {type}"); } - internal static Hl7ApplicationConfigEntity? GetConfig(List config, Message message) + internal Hl7ApplicationConfigEntity? GetConfig(List config, Message message) { foreach (var item in config) { - if (item.SendingId.Value == message.GetValue(item.SendingId.Key)) + var sendingId = message.GetValue(item.SendingId.Key); + if (item.SendingId.Value == sendingId) { + _logger.Hl7FoundMatchingConfig(sendingId, JsonSerializer.Serialize(item)); return item; } + else + { + _logger.Hl7NotMatchingConfig(sendingId, item.SendingId.Value); + } } return null; } @@ -138,7 +150,7 @@ private Message RepopulateMessage(Hl7ApplicationConfigEntity config, ExternalApp { var newMess = message.HL7Message.Replace(oldvalue, details.PatientId); message = new Message(newMess); - message.ParseMessage(); + message.ParseMessage(true); } } else if (tag == DicomTag.StudyInstanceUID) @@ -150,7 +162,7 @@ private Message RepopulateMessage(Hl7ApplicationConfigEntity config, ExternalApp { var newMess = message.HL7Message.Replace(oldvalue, details.StudyInstanceUid); message = new Message(newMess); - message.ParseMessage(); + message.ParseMessage(true); } } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 8a4a99cd4..0004d0636 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -18,6 +18,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO.Abstractions; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; @@ -29,17 +30,20 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; +using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.Messaging.Events; -namespace Monai.Deploy.InformaticsGateway.Services.HealthLevel7 +namespace Monai.Deploy.InformaticsGateway.Api.Mllp { internal sealed class MllpService : IMllpService, IHostedService, IDisposable, IMonaiService { @@ -56,6 +60,9 @@ internal sealed class MllpService : IMllpService, IHostedService, IDisposable, I private readonly IStorageInfoProvider _storageInfoProvider; private readonly ConcurrentDictionary _activeTasks; private readonly IMllpExtract _mIIpExtract; + private readonly IInputHL7DataPlugInEngine _inputHL7DataPlugInEngine; + private readonly IHl7ApplicationConfigRepository _hl7ApplicationConfigRepository; + private DateTime _lastConfigRead = new(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc); public int ActiveConnections { @@ -91,6 +98,8 @@ public MllpService(IServiceScopeFactory serviceScopeFactory, _storageInfoProvider = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IStorageInfoProvider)); _mIIpExtract = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IMllpExtract)); _activeTasks = new ConcurrentDictionary(); + _inputHL7DataPlugInEngine = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IInputHL7DataPlugInEngine)); + _hl7ApplicationConfigRepository = serviceScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IHl7ApplicationConfigRepository)); } public Task StartAsync(CancellationToken cancellationToken) @@ -170,12 +179,23 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) Guard.Against.Null(client, nameof(client)); Guard.Against.Null(result, nameof(result)); + await ConfigurePlugInEngine().ConfigureAwait(false); + try { foreach (var message in result.Messages) { + var newMessage = message; var hl7Filemetadata = new Hl7FileStorageMetadata(client.ClientId.ToString(), DataService.HL7, client.ClientIp); - var newMessage = await _mIIpExtract.ExtractInfo(hl7Filemetadata, message).ConfigureAwait(false); + var configItem = await _mIIpExtract.GetConfigItem(message).ConfigureAwait(false); + if (configItem is not null) + { + await _inputHL7DataPlugInEngine.ExecutePlugInsAsync(message, hl7Filemetadata, configItem).ConfigureAwait(false); + newMessage = await _mIIpExtract.ExtractInfo(hl7Filemetadata, message, configItem).ConfigureAwait(false); + + _logger.LogTrace($"HL7 message after plug-in processing: {newMessage.HL7Message} correlationId: {hl7Filemetadata.CorrelationId}"); + } + _logger.Hl7MessageReceieved(newMessage.HL7Message); await hl7Filemetadata.SetDataStream(newMessage.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); var payloadId = await _payloadAssembler.Queue(client.ClientId.ToString(), hl7Filemetadata, new DataOrigin { DataService = DataService.HL7, Source = client.ClientIp, Destination = FileStorageMetadata.IpAddress() }).ConfigureAwait(false); hl7Filemetadata.PayloadId ??= payloadId.ToString(); @@ -194,6 +214,31 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) } } + private async Task ConfigurePlugInEngine() + { + var configs = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); + if (configs is not null && configs.Any() && configs.Max(c => c.LastModified) > _lastConfigRead) + { + var pluginAssemblies = new List(); + foreach (var config in configs.Where(p => p.PlugInAssemblies?.Count > 0)) + { + try + { + pluginAssemblies.AddRange(config.PlugInAssemblies.Where(p => pluginAssemblies.Contains(p) is false)); + } + catch (Exception ex) + { + _logger.HL7PluginLoadingExceptions(ex); + } + } + if (pluginAssemblies.Any()) + { + _inputHL7DataPlugInEngine.Configure(pluginAssemblies); + } + } + _lastConfigRead = DateTime.UtcNow; + } + private void WaitUntilAvailable(int maximumNumberOfConnections) { var count = 0; @@ -295,7 +340,7 @@ private async Task EnsureAck(NetworkStream networkStream) foreach (var message in _rawHl7Messages) { var hl7Message = new Message(message); - hl7Message.ParseMessage(); + hl7Message.ParseMessage(true); if (hl7Message.MessageStructure == "ACK") { return; diff --git a/src/InformaticsGateway/Services/Http/Startup.cs b/src/InformaticsGateway/Services/Http/Startup.cs index dfc6dc5e1..6f0779ebd 100755 --- a/src/InformaticsGateway/Services/Http/Startup.cs +++ b/src/InformaticsGateway/Services/Http/Startup.cs @@ -44,10 +44,8 @@ public Startup(IConfiguration configuration) public IConfiguration Configuration { get; } -#pragma warning disable CA1822 // Mark members as static public void ConfigureServices(IServiceCollection services) -#pragma warning restore CA1822 // Mark members as static { services.AddHttpContextAccessor(); services.AddControllers(opts => diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs index 411657c86..4946bc6ac 100755 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -112,7 +112,7 @@ public async Task HandleInstanceAsync(DicomCStoreRequest request, string _logger.InstanceIgnoredWIthMatchingSopClassUid(request.SOPClassUID.UID); return string.Empty; } - ExternalAppDetails? storedDetails = null; + ExternalAppDetails? storedDetails; diff --git a/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs b/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs new file mode 100755 index 000000000..c3b45c8f4 --- /dev/null +++ b/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs @@ -0,0 +1,39 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System.Reflection; +using HL7.Dotnetcore; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Test.PlugIns +{ + [PlugInName("TestInputHL7DataPlugInAddWorkflow")] + public class TestInputHL7DataPlugInAddWorkflow : IInputHL7DataPlugIn + { + public static readonly string TestString = "HOSPITAL changed!"; + + public string Name => GetType().GetCustomAttribute()?.Name ?? GetType().Name; + + public Task<(Message hl7Message, FileStorageMetadata fileMetadata)> ExecuteAsync(Message hl7File, FileStorageMetadata fileMetadata) + { + hl7File.SetValue("MSH.3", TestString); + hl7File = new Message(hl7File.SerializeMessage(false)); + hl7File.ParseMessage(); + fileMetadata.Workflows.Add(TestString); + return Task.FromResult((hl7File, fileMetadata)); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs new file mode 100755 index 000000000..47a56a735 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineFactoryTest.cs @@ -0,0 +1,69 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO.Abstractions; +using System.Linq; +using System.Reflection; +using System.Text.Json; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.SharedTest; +using Monai.Deploy.InformaticsGateway.Test.PlugIns; +using Moq; +using Xunit; +using Xunit.Abstractions; +namespace Monai.Deploy.InformaticsGateway.Test.Services.Common +{ + public class InputHL7DataPlugInEngineFactoryTest + { + private readonly Mock> _logger; + private readonly FileSystem _fileSystem; + private readonly ITestOutputHelper _output; + + public InputHL7DataPlugInEngineFactoryTest(ITestOutputHelper output) + { + _logger = new Mock>(); + _fileSystem = new FileSystem(); + _output = output; + + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public void RegisteredPlugIns_WhenCalled_ReturnsListOfPlugIns() + { + var factory = new InputHL7DataPlugInEngineFactory(_fileSystem, _logger.Object); + var result = factory.RegisteredPlugIns().OrderBy(p => p.Value).ToArray(); + + _output.WriteLine($"result now = {JsonSerializer.Serialize(result)}"); + + Assert.Collection(result, + p => VerifyPlugIn(p, typeof(TestInputHL7DataPlugInAddWorkflow))); + + _logger.VerifyLogging($"{typeof(IInputHL7DataPlugIn).Name} data plug-in found {typeof(TestInputHL7DataPlugInAddWorkflow).GetCustomAttribute()?.Name}: {typeof(TestInputHL7DataPlugInAddWorkflow).GetShortTypeAssemblyName()}.", LogLevel.Information, Times.Once()); + } + + private void VerifyPlugIn(KeyValuePair values, Type type) + { + Assert.Equal(values.Key, type.GetCustomAttribute()?.Name); + Assert.Equal(values.Value, type.GetShortTypeAssemblyName()); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs new file mode 100755 index 000000000..917cf5cf0 --- /dev/null +++ b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs @@ -0,0 +1,164 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using HL7.Dotnetcore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Common; +using Monai.Deploy.InformaticsGateway.Services.Common; +using Monai.Deploy.InformaticsGateway.Test.PlugIns; +using Monai.Deploy.Messaging.Events; +using Moq; +using Xunit; + +namespace Monai.Deploy.InformaticsGateway.Test.Services.Common +{ + public class InputHL7DataPlugInEngineTest + { + private readonly Mock> _logger; + private readonly Mock _serviceScopeFactory; + private readonly Mock _serviceScope; + private readonly ServiceProvider _serviceProvider; + + private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; + + public InputHL7DataPlugInEngineTest() + { + _logger = new Mock>(); + _serviceScopeFactory = new Mock(); + _serviceScope = new Mock(); + + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public void GivenAnInputHL7DataPlugInEngine_WhenInitialized_ExpectParametersToBeValidated() + { + Assert.Throws(() => new InputHL7DataPlugInEngine(null, null)); + Assert.Throws(() => new InputHL7DataPlugInEngine(_serviceProvider, null)); + + _ = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + } + + + [Fact] + public void GivenAnInputHL7DataPlugInEngine_WhenConfigureIsCalledWithBogusAssemblies_ThrowsException() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() { "SomeBogusAssemblye" }; + + var exceptions = Assert.Throws(() => pluginEngine.Configure(assemblies)); + + Assert.Single(exceptions.InnerExceptions); + Assert.True(exceptions.InnerException is PlugInLoadingException); + Assert.Contains("Error loading plug-in 'SomeBogusAssemblye'", exceptions.InnerException.Message); + } + + [Fact] + public void GivenAnInputHL7DataPlugInEngine_WhenConfigureIsCalledWithAValidAssembly_ExpectNoExceptions() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() { typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName }; + + pluginEngine.Configure(assemblies); + Assert.NotNull(pluginEngine); + } + + [Fact] + public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalledWithoutConfigure_ThrowsException() + { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() { typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName }; + + var config = new Hl7ApplicationConfigEntity() + { + PlugInAssemblies = assemblies, + DataMapping = new List() + { + new StringKeyValuePair() { Key = "MSH.3", Value = "MSH.3" }, + }, + }; + + var dicomInfo = new DicomFileStorageMetadata( + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + "StudyInstanceUID", + "SeriesInstanceUID", + "SOPInstanceUID", + DataService.DicomWeb, + "calling", + "called"); + + var message = new HL7.Dotnetcore.Message(SampleMessage); + message.ParseMessage(true); + + await Assert.ThrowsAsync(async () => await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, config)); + } + + [Fact] + public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalled_ExpectDataIsProcessedByPlugInAsync() + { + + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); + var assemblies = new List() + { + typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName, + }; + + var config = new Hl7ApplicationConfigEntity() + { + PlugInAssemblies = assemblies, + DataMapping = new List() + { + new StringKeyValuePair() { Key = "MSH.3", Value = "MSH.3" }, + }, + }; + + pluginEngine.Configure(assemblies); + + var dicomInfo = new DicomFileStorageMetadata( + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + "StudyInstanceUID", + "SeriesInstanceUID", + "SOPInstanceUID", + DataService.DicomWeb, + "calling", + "called"); + + var message = new HL7.Dotnetcore.Message(SampleMessage); + message.ParseMessage(true); + + var (Hl7Message, resultDicomInfo) = await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, config); + + Assert.NotEqual(Hl7Message, message); + Assert.Equal(resultDicomInfo, dicomInfo); + Assert.Equal(Hl7Message.GetValue("MSH.3"), TestInputHL7DataPlugInAddWorkflow.TestString); + } + } +} diff --git a/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs b/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs index 216709cbf..0897a68a2 100755 --- a/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs +++ b/src/InformaticsGateway/Test/Services/Export/ExportHl7ServiceTests.cs @@ -27,6 +27,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Api.Models; using Monai.Deploy.InformaticsGateway.Api.PlugIns; using Monai.Deploy.InformaticsGateway.Common; diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs index d8809e333..c9fba7e67 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -16,7 +16,6 @@ */ -using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; using System.Threading; using Moq; using Xunit; @@ -26,6 +25,7 @@ using System.Collections.Generic; using HL7.Dotnetcore; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Api.Storage; using System.Threading.Tasks; using Monai.Deploy.InformaticsGateway.Api.Models; @@ -75,13 +75,13 @@ public void ParseConfig_Should_Return_Correct_Item() var message = new Message(SampleMessage); var isParsed = message.ParseMessage(); - var config = MllpExtract.GetConfig(configs, message); + var config = _sut.GetConfig(configs, message); Assert.Equal(correctid, config?.Id); message = new Message(ABCDEMessage); isParsed = message.ParseMessage(); - config = MllpExtract.GetConfig(configs, message); + config = _sut.GetConfig(configs, message); Assert.Equal(azCorrectid, config?.Id); } @@ -117,7 +117,8 @@ public async Task Should_Set_MetaData_On_Hl7FileStorageMetadata_Object() var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; - await _sut.ExtractInfo(meatData, message); + var configItem = await _sut.GetConfigItem(message); + await _sut.ExtractInfo(meatData, message, configItem); Assert.Equal("WorkflowInstanceId2", meatData.WorkflowInstanceId); Assert.Equal("ExportTaskID2", meatData.TaskId); @@ -166,8 +167,8 @@ public async Task Should_Set_Original_Patient_And_Study_Uid() var meatData = new Hl7FileStorageMetadata { Id = "metaId", File = new StorageObjectMetadata("txt") }; - - message = await _sut.ExtractInfo(meatData, message); + var configItem = await _sut.GetConfigItem(message); + message = await _sut.ExtractInfo(meatData, message, configItem); Assert.Equal("PatentID", message.GetValue("OBR.3")); Assert.Equal("PatentID", message.GetValue("PID.2")); @@ -190,13 +191,13 @@ public void ParseConfig_Should_Return_Correct_Item_For_Vendor() var message = new Message(VendorMessage); var isParsed = message.ParseMessage(); - var config = MllpExtract.GetConfig(configs, message); + var config = _sut.GetConfig(configs, message); Assert.Equal(correctid, config?.Id); message = new Message(ABCDEMessage); isParsed = message.ParseMessage(); - config = MllpExtract.GetConfig(configs, message); + config = _sut.GetConfig(configs, message); Assert.Equal(azCorrectid, config?.Id); } } diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs index 033efea81..6eb272064 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs @@ -22,6 +22,7 @@ using System.Threading.Tasks; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; @@ -32,7 +33,7 @@ namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 { public class MllpClientTest { - private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; + private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r"; private readonly Mock _tcpClient; private readonly Hl7Configuration _config; diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 52757d6d0..1f2119bc6 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -29,13 +29,16 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; -using Monai.Deploy.InformaticsGateway.Services.HealthLevel7; +using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; using Monai.Deploy.Messaging.Events; using Moq; using xRetry; using Xunit; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.PlugIns; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 { @@ -57,6 +60,8 @@ public class MllpServiceTest private readonly IServiceProvider _serviceProvider; private readonly Mock _storageInfoProvider; private readonly Mock _mIIpExtract = new Mock(); + private readonly Mock _hl7DataPlugInEngine = new Mock(); + private readonly Mock _hl7ApplicationConfigRepository = new Mock(); public MllpServiceTest() { @@ -87,6 +92,8 @@ public MllpServiceTest() services.AddScoped(p => _fileSystem.Object); services.AddScoped(p => _storageInfoProvider.Object); services.AddScoped(p => _mIIpExtract.Object); + services.AddScoped(p => _hl7DataPlugInEngine.Object); + services.AddScoped(p => _hl7ApplicationConfigRepository.Object); _serviceProvider = services.BuildServiceProvider(); _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); @@ -276,8 +283,9 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT { var checkEvent = new ManualResetEventSlim(); var client = new Mock(); - _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny())) - .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg) => Msg); + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg, Hl7ApplicationConfigEntity configItem) => Msg); + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => { @@ -319,8 +327,11 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT var checkEvent = new ManualResetEventSlim(); var client = new Mock(); - _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny())) - .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg) => Msg); + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg, Hl7ApplicationConfigEntity configItem) => Msg); + + _mIIpExtract.Setup(e => e.GetConfigItem(It.IsAny())) + .ReturnsAsync((Message Msg) => new Hl7ApplicationConfigEntity()); _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => @@ -353,7 +364,7 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT Assert.True(checkEvent.Wait(3000)); await Task.Delay(500).ConfigureAwait(false); - _mIIpExtract.Verify(p => p.ExtractInfo(It.IsAny(), It.IsAny()), Times.Exactly(3)); + _mIIpExtract.Verify(p => p.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); } } } diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 5820049ac..0cbb69366 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -2085,6 +2085,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/InformaticsGateway/nlog.config b/src/InformaticsGateway/nlog.config index 4b106748b..8798fce06 100755 --- a/src/InformaticsGateway/nlog.config +++ b/src/InformaticsGateway/nlog.config @@ -51,6 +51,7 @@ limitations under the License. + diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index 630572169..1778d145c 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -1695,6 +1695,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 4d70f5c72..ac62dee73 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -149,6 +149,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1595,6 +1600,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index 5c4215fea..a171e527a 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -169,6 +169,11 @@ "System.Threading.Channels": "6.0.0" } }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.36.0", + "contentHash": "N1HLMeIqYuY+4O69ItgZJoDBnnpNkK5N2pClceTJ2nFJxsP48iCsA4iz3tm43Yszi4r/vaThoc3UoLBfGP3vKw==" + }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.8.26", @@ -589,6 +594,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", diff --git a/tests/Integration.Test/Common/DataProvider.cs b/tests/Integration.Test/Common/DataProvider.cs index cb609530b..2748a16a2 100755 --- a/tests/Integration.Test/Common/DataProvider.cs +++ b/tests/Integration.Test/Common/DataProvider.cs @@ -311,7 +311,8 @@ internal async Task GenerateHl7Messages(string version) var message = new HL7.Dotnetcore.Message(text); message.ParseMessage(); message.SetValue("MSH.10", file); - HL7Specs.Files[file] = message; + HL7Specs.Files[file] = new HL7.Dotnetcore.Message(message.SerializeMessage(false)); + HL7Specs.Files[file].ParseMessage(); } } } diff --git a/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs index be93a8bce..69887eff2 100755 --- a/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs @@ -219,7 +219,7 @@ public async Task ThenEnsureThatExportcompleteMessagesAreSentWithSuscess(string private async Task SendAcknowledgment(NetworkStream networkStream, HL7.Dotnetcore.Message message, CancellationToken cancellationToken) { if (message == null) { return; } - var ackMessage = message.GetACK(); + var ackMessage = message.GetACK(true); var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); { try diff --git a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs index 2e126327b..55e7137cf 100755 --- a/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/RemoteAppExecutionPlugInsStepDefinitions.cs @@ -25,7 +25,6 @@ using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Integration.Test.Common; using Monai.Deploy.InformaticsGateway.Integration.Test.Drivers; -//using Monai.Deploy.InformaticsGateway.PlugIns.Pseudonymisation; using Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution; using Monai.Deploy.Messaging.Events; using Monai.Deploy.Messaging.Messages; diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index e16ccb4b4..8e3d304b6 100755 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -5,6 +5,25 @@ "plugins": { "remoteApp": { "ReplaceTags": "AccessionNumber, StudyDescription, SeriesDescription, PatientAddress, PatientAge, PatientName" + }, + "Pseudonymise": { + "ConnectionString": "mongodb://root:rootpassword@localhost:27017", + "DatabaseName": "InformaticsGateway", + "EncriptionClientTimeoutSeconds": "900", + "ExpiresAfterDays": "1", + "ExternalAppTaskInboundKeepTags": "0020 000E, 0020 0010, 0020 00013, 0008 0018, 0020 000E", + "ImportantTags": "0010 0020, 0008 0018, 0008 0016, 0020 000D, 0020 000E, 0020 0010,0008 1155, 0008 0014, 0008 0050, 0008 0080, 0008 0081, 0008 0090, 0008 0092, 0008 0094, 0008 1010, 0008 1030, 0008 103E, 0008 1040, 0008 1048,0008 1050, 0008 1060, 0008 1070, 0008 1080, 0008 2111, 0010 0010, 0010 0030, 0010 0030, 0010 0032, 0010 0040, 0010 1000, 0010 1001, 0010 1001, 0010 1010, 0010 1020, 0010 1030, 0010 1090, 0010 2160, 0010 2180, 0010 21B0, 0010 4000, 0018 1000, 0018 1030, 0020 0052, 0020 0200, 0020 4000, 0040 0275, 0040 A124, 0040 A730, 0088 0140, 3006 0024, 3006 00C2", + "SecurityProfile": "\t\t\t\t0010,0020;K;;;;;;;;;;\r\n\t\t\t\t0008,0018;C;;;;;;;;;;\r\n\t\t\t\t0008,0016;K;;;;;;;;;;\r\n\t\t\t\t0020,000D;K;;;;;;;;;;\r\n\t\t\t\t0020,000E;C;;;;;;;;;;\r\n\t\t\t\t0020,0010;C;;;;;;;;;;\r\n\t\t\t\t0008,1155;C;;;;;;;;;;\r\n\t\t\t\t0008,0014;X;;;;;;;;;;\r\n\t\t\t\t0008,0050;K;;;;;;;;;;\r\n\t\t\t\t0008,0080;X;;;;;;;;;;\r\n\t\t\t\t0008,0081;X;;;;;;;;;;\r\n\t\t\t\t0008,0090;X;;;;;;;;;;\r\n\t\t\t\t0008,0092;X;;;;;;;;;;\r\n\t\t\t\t0008,0094;X;;;;;;;;;;\r\n\t\t\t\t0008,1010;X;;;;;;;;;;\r\n\t\t\t\t0008,1030;X;;;;;;;;;;\r\n\t\t\t\t0008,103E;X;;;;;;;;;;\r\n\t\t\t\t0008,1040;X;;;;;;;;;;\r\n\t\t\t\t0008,1048;X;;;;;;;;;;\r\n\t\t\t\t0008,1050;X;;;;;;;;;;\r\n\t\t\t\t0008,1060;X;;;;;;;;;;\r\n\t\t\t\t0008,1070;X;;;;;;;;;;\r\n\t\t\t\t0008,1080;X;;;;;;;;;;\r\n\t\t\t\t0008,2111;X;;;;;;;;;;\r\n\t\t\t\t0010,0010;X;;;;;;;;;;\r\n\t\t\t\t0010,0030;X;;;;;;;;;;\r\n\t\t\t\t0010,0030;X;;;;;;;;;;\r\n\t\t\t\t0010,0032;X;;;;;;;;;;\r\n\t\t\t\t0010,0040;X;;;;;;;;;;\r\n\t\t\t\t0010,1000;X;;;;;;;;;;\r\n\t\t\t\t0010,1001;X;;;;;;;;;;\r\n\t\t\t\t0010,1001;X;;;;;;;;;;\r\n\t\t\t\t0010,1010;X;;;;;;;;;;\r\n\t\t\t\t0010,1020;X;;;;;;;;;;\r\n\t\t\t\t0010,1030;X;;;;;;;;;;\r\n\t\t\t\t0010,1090;X;;;;;;;;;;\r\n\t\t\t\t0010,2160;X;;;;;;;;;;\r\n\t\t\t\t0010,2180;X;;;;;;;;;;\r\n\t\t\t\t0010,21B0;X;;;;;;;;;;\r\n\t\t\t\t0010,4000;X;;;;;;;;;;\r\n\t\t\t\t\r\n\t\t\t\t0018,1000;X;;;;;;;;;;\r\n\t\t\t\t0018,1030;X;;;;;;;;;;\r\n\t\t\t\t0020,0052;X;;;;;;;;;;\r\n\t\t\t\t0020,0200;X;;;;;;;;;;\r\n\t\t\t\t0020,4000;X;;;;;;;;;;\r\n\t\t\t\t0040,0275;X;;;;;;;;;;\r\n\t\t\t\t0040,A124;X;;;;;;;;;;\r\n\t\t\t\t0040,A730;X;;;;;;;;;;\r\n\t\t\t\t0088,0140;X;;;;;;;;;;\r\n\t\t\t\t3006,0024;X;;;;;;;;;;\r\n\t\t\t\t3006,00C2;X;;;;;;;;;;\r\n\t\t\t\t", + "KMS": { + "KeyVaultNamespace": "InformaticsGateway.KeyVault", + "AWS": { + "accessKeyId": "", + "arnKey": "", + "roleArnToAssume": "", + "region": "eu-west-2", + "secretAccessKey": "" + } + } } }, "ConnectionStrings": { diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index c3b9e5483..9a208b6ce 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -226,6 +226,16 @@ "resolved": "2.5.0", "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" }, + "AnswerDicomTools": { + "type": "Transitive", + "resolved": "0.1.1-rc0089", + "contentHash": "DgDBjo708kHmr0lUdUrYaRLjmaICrJMBh6w/Vd0E/r2SJ0DDiQuxMABJzIwXwrVFSzrrwpqPqWBQMTCY++9uPQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.1", + "MongoDB.Driver": "2.21.0", + "fo-dicom": "5.1.1" + } + }, "Ardalis.GuardClauses": { "type": "Transitive", "resolved": "4.1.1", @@ -413,6 +423,15 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", "resolved": "6.0.0", @@ -425,6 +444,17 @@ "Microsoft.Extensions.Primitives": "6.0.0" } }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", "resolved": "6.0.1", @@ -500,6 +530,34 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -542,6 +600,55 @@ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" } }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "6.0.0", @@ -1941,6 +2048,25 @@ "resolved": "0.6.2", "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" }, + "monai-deploy-informatics-gateway-pseudonymisation": { + "type": "Project", + "dependencies": { + "AnswerDicomTools": "[0.1.1-rc0089, )", + "Ardalis.GuardClauses": "[4.1.1, )", + "HL7-dotnetcore": "[2.36.0, )", + "Microsoft.EntityFrameworkCore": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Relational": "[6.0.25, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[6.0.25, )", + "Microsoft.Extensions.Configuration": "[6.0.1, )", + "Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )", + "Microsoft.Extensions.Configuration.Json": "[6.0.0, )", + "Microsoft.Extensions.Hosting": "[6.0.1, )", + "MongoDB.Driver": "[2.21.0, )", + "NLog": "[5.2.4, )", + "Polly": "[7.2.4, )", + "fo-dicom": "[5.1.1, )" + } + }, "monai.deploy.informaticsgateway": { "type": "Project", "dependencies": { @@ -1964,6 +2090,7 @@ "monai.deploy.informaticsgateway.api": { "type": "Project", "dependencies": { + "HL7-dotnetcore": "[2.36.0, )", "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[6.0.25, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", From 3e109c66c66e5eb23ab81507b3fa177f841afef7 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 15 Jan 2024 15:04:25 +0000 Subject: [PATCH 62/75] re-adding validation for tests Signed-off-by: Neil South --- .../Logging/Log.5000.DataPlugins.cs | 3 +++ .../Services/HealthLevel7/MllpClient.cs | 17 +++++++++++++++-- .../Services/HealthLevel7/MllpService.cs | 4 ++-- .../Services/HealthLevel7/MllpClientTest.cs | 4 +--- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs index 0dbfd93ff..60b3271fe 100755 --- a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs +++ b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs @@ -44,5 +44,8 @@ public static partial class Log [LoggerMessage(EventId = 5007, Level = LogLevel.Error, Message = "Error executing plug-in: {plugin}.")] public static partial void ErrorAddingOutputDataPlugIn(this ILogger logger, Exception d, string plugin); + + [LoggerMessage(EventId = 5008, Level = LogLevel.Trace, Message = "Import plugin executed: {pluginName}. now: {fileMetadata}")] + public static partial void InputDataPlugInEngineexecuted(this ILogger logger, string pluginName, string fileMetadata); } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index be1cf2c02..05dad8265 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -159,10 +159,23 @@ private async Task SendAcknowledgment(INetworkStream clientStream, Message messa if (ShouldSendAcknowledgment(message)) { - var ackMessage = message.GetACK(true); + Message ackMessage = message; + try + { + ackMessage = message.GetACK(false); + } + catch (Exception ex) + { + _logger.ErrorGeneratingHl7Acknowledgment(ex, message.HL7Message); + _exceptions.Add(ex); + return; + } + if (ackMessage is null) { - _logger.ErrorGeneratingHl7Acknowledgment(new Exception(), message.HL7Message); + var ex = new Exception("Error generating HL7 acknowledgment."); + _logger.ErrorGeneratingHl7Acknowledgment(ex, message.HL7Message); + _exceptions.Add(ex); return; } var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 0004d0636..d2016248f 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -284,7 +284,7 @@ public async Task SendMllp(IPAddress address, int port, string hl7Message, Cance catch (Exception ex) { _logger.Hl7SendException(ex); - throw new Hl7SendException("Send exception"); + throw new Hl7SendException($"Send exception: {ex.Message}"); } } @@ -340,7 +340,7 @@ private async Task EnsureAck(NetworkStream networkStream) foreach (var message in _rawHl7Messages) { var hl7Message = new Message(message); - hl7Message.ParseMessage(true); + hl7Message.ParseMessage(false); if (hl7Message.MessageStructure == "ACK") { return; diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs index 6eb272064..8c8b3fa68 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs @@ -134,10 +134,8 @@ public async Task ReceiveData_InvalidMessage() { await Task.Run(() => { - Assert.Empty(results.Messages); Assert.NotNull(results.AggregateException); - Assert.Single(results.AggregateException.InnerExceptions); - Assert.Contains("Failed to validate the message with error", results.AggregateException.InnerExceptions.First().Message); + Assert.Equal(2, results.AggregateException.InnerExceptions.Count); }); }); await client.Start(action, _cancellationTokenSource.Token); From 403271659d466ceee5e520117e94ae60521d89b7 Mon Sep 17 00:00:00 2001 From: Neil South Date: Mon, 15 Jan 2024 16:08:57 +0000 Subject: [PATCH 63/75] another test fix Signed-off-by: Neil South --- src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index 05dad8265..73e0dcc13 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -231,7 +231,7 @@ private bool CreateMessage(int startIndex, int endIndex, ref string data, out Me var text = data.Substring(messageStartIndex, endIndex - messageStartIndex); _logger.Hl7GenerateMessage(text.Length, text); message = new Message(text); - message.ParseMessage(true); + message.ParseMessage(false); data = data.Length > endIndex ? data.Substring(messageEndIndex) : string.Empty; return true; } From a7da1478a301095bd7cf371692521ac828e81321 Mon Sep 17 00:00:00 2001 From: Neil South Date: Wed, 17 Jan 2024 15:04:43 +0000 Subject: [PATCH 64/75] dockerfile changes to fix MongoEncryption:- libdl missing Signed-off-by: Neil South --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index f5ecd0807..63e83fdde 100755 --- a/Dockerfile +++ b/Dockerfile @@ -35,9 +35,12 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean \ && apt-get update \ && apt-get install -y --no-install-recommends \ + && apt install -y libc-dev \ # this is a workaround for Mongo encryption library curl \ && rm -rf /var/lib/apt/lists +RUN ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /app/libdl.so # part 2 of workaround for Mongo encryption library + WORKDIR /opt/monai/ig COPY --from=build /app/out . From 2d19bc6860f06c9c2dc165b91e0690f0af249b72 Mon Sep 17 00:00:00 2001 From: Neil South Date: Wed, 17 Jan 2024 15:32:29 +0000 Subject: [PATCH 65/75] fixup for missing licence Signed-off-by: Neil South --- Dockerfile | 11 ++++++----- doc/dependency_decisions.yml | 3 ++- src/Api/packages.lock.json | 6 +++--- src/CLI/packages.lock.json | 6 +++--- src/Client.Common/packages.lock.json | 6 +++--- src/Client/Test/packages.lock.json | 0 src/Client/packages.lock.json | 0 src/Common/packages.lock.json | 6 +++--- src/Configuration/packages.lock.json | 6 +++--- src/Database/Api/packages.lock.json | 0 src/Database/EntityFramework/Test/packages.lock.json | 0 .../MongoDB/Integration.Test/packages.lock.json | 0 src/Database/packages.lock.json | 0 src/DicomWebClient/CLI/packages.lock.json | 6 +++--- src/DicomWebClient/packages.lock.json | 6 +++--- src/InformaticsGateway/Test/packages.lock.json | 0 src/InformaticsGateway/packages.lock.json | 0 .../RemoteAppExecution/Test/packages.lock.json | 0 tests/Integration.Test/packages.lock.json | 0 19 files changed, 29 insertions(+), 27 deletions(-) mode change 100644 => 100755 src/CLI/packages.lock.json mode change 100644 => 100755 src/Client/Test/packages.lock.json mode change 100644 => 100755 src/Client/packages.lock.json mode change 100644 => 100755 src/Configuration/packages.lock.json mode change 100644 => 100755 src/Database/Api/packages.lock.json mode change 100644 => 100755 src/Database/EntityFramework/Test/packages.lock.json mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/packages.lock.json mode change 100644 => 100755 src/Database/packages.lock.json mode change 100644 => 100755 src/InformaticsGateway/Test/packages.lock.json mode change 100644 => 100755 src/InformaticsGateway/packages.lock.json mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/packages.lock.json mode change 100644 => 100755 tests/Integration.Test/packages.lock.json diff --git a/Dockerfile b/Dockerfile index 63e83fdde..a45cf8009 100755 --- a/Dockerfile +++ b/Dockerfile @@ -34,12 +34,11 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean \ && apt-get update \ - && apt-get install -y --no-install-recommends \ - && apt install -y libc-dev \ # this is a workaround for Mongo encryption library - curl \ - && rm -rf /var/lib/apt/lists + && apt-get install -y --no-install-recommends curl \ + && apt-get install -y libc-dev # this is a workaround for Mongo encryption library +RUN rm -rf /var/lib/apt/lists + -RUN ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /app/libdl.so # part 2 of workaround for Mongo encryption library WORKDIR /opt/monai/ig @@ -48,6 +47,8 @@ COPY --from=build /tools /opt/dotnetcore-tools COPY LICENSE ./ COPY docs/compliance/third-party-licenses.md ./ +RUN ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /opt/monai/ig/libdl.so # part 2 of workaround for Mongo encryption library + EXPOSE 104 EXPOSE 2575 EXPOSE 5000 diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 1f67b94a6..a5df96c6d 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -583,6 +583,7 @@ - Microsoft.NET.ILLink.Tasks - :versions: - 8.0.0 + - 8.0.1 :when: 2022-10-14T23:37:16.793Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -1775,4 +1776,4 @@ - 7.0.0 :when: 2023-08-10T20:50:14.759Z :who: mocsharp - :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) \ No newline at end of file + :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 6fe9b7213..9157d20a7 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -41,9 +41,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Monai.Deploy.Messaging": { "type": "Direct", diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json old mode 100644 new mode 100755 index bc6481d7b..99b5fa94b --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -35,9 +35,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "System.CommandLine.Hosting": { "type": "Direct", diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json index e066f8661..522b24810 100755 --- a/src/Client.Common/packages.lock.json +++ b/src/Client.Common/packages.lock.json @@ -10,9 +10,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" } } } diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json index 3c3551297..ae98eff94 100755 --- a/src/Common/packages.lock.json +++ b/src/Common/packages.lock.json @@ -10,9 +10,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "System.IO.Abstractions": { "type": "Direct", diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json old mode 100644 new mode 100755 index 9aef01cb9..0fd6efb84 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -4,9 +4,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json index 052d8cd8f..43be542c2 100755 --- a/src/DicomWebClient/CLI/packages.lock.json +++ b/src/DicomWebClient/CLI/packages.lock.json @@ -14,9 +14,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json index 47c71c842..1aa43eba1 100755 --- a/src/DicomWebClient/packages.lock.json +++ b/src/DicomWebClient/packages.lock.json @@ -23,9 +23,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json old mode 100644 new mode 100755 From 5dabf87491e35b45bcf534ce2b45268a5b7da8af Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 18 Jan 2024 16:25:18 +0000 Subject: [PATCH 66/75] minor refactoring Signed-off-by: Neil South --- Dockerfile | 10 +- doc/dependency_decisions.yml | 3 +- src/Api/HL7DestinationEntity.cs | 6 +- src/Api/Models/BaseApplicationEntity.cs | 10 +- .../Models/DestinationApplicationEntity.cs | 16 + src/Api/SourceApplicationEntity.cs | 15 + src/Api/Storage/Hl7FileStorageMetadata.cs | 2 +- src/Api/Storage/Payload.cs | 5 +- src/Api/Test/HL7DestinationEntityTest.cs | 15 +- ....cs => SourceBaseApplicationEntityTest.cs} | 7 +- src/Api/packages.lock.json | 6 +- src/CLI/packages.lock.json | 6 +- src/Client.Common/packages.lock.json | 6 +- src/Client/Test/packages.lock.json | 0 src/Client/packages.lock.json | 0 src/Common/packages.lock.json | 6 +- src/Configuration/ValidationExtensions.cs | 3 +- src/Configuration/packages.lock.json | 6 +- src/Database/Api/packages.lock.json | 0 .../HL7DestinationEntityConfiguration.cs | 3 +- .../EfDatabaseMigrationManager.cs | 2 +- ...240118154616_MinorModelChanges.Designer.cs | 514 ++++++++++++++++++ .../20240118154616_MinorModelChanges.cs | 60 ++ .../InformaticsGatewayContextModelSnapshot.cs | 51 +- .../HL7DestinationEntityRepositoryTest.cs | 15 +- .../Test/SqliteDatabaseFixture.cs | 10 +- .../EntityFramework/Test/packages.lock.json | 0 .../HL7DestinationEntityRepositoryTest.cs | 15 +- .../Integration.Test/MongoDatabaseFixture.cs | 10 +- .../Integration.Test/packages.lock.json | 0 .../HL7DestinationEntityRepository.cs | 1 - src/Database/packages.lock.json | 0 src/DicomWebClient/CLI/packages.lock.json | 6 +- src/DicomWebClient/packages.lock.json | 6 +- .../Logging/Log.800.Hl7Service.cs | 17 +- .../Logging/Log.8000.HttpServices.cs | 8 +- src/InformaticsGateway/Program.cs | 1 + .../Services/Common/InputDataPluginEngine.cs | 11 +- .../Common/InputHL7DataPlugInEngine.cs | 20 +- .../Services/Connectors/PayloadAssembler.cs | 12 +- .../PayloadNotificationActionHandler.cs | 3 + .../Services/Export/Hl7ExportService.cs | 3 +- .../Services/HealthLevel7/MllpClient.cs | 15 +- .../Services/HealthLevel7/MllpExtract.cs | 18 +- .../Services/HealthLevel7/MllpService.cs | 6 +- .../Services/Http/HL7DestinationController.cs | 16 +- .../Services/Http/MonaiAeTitleController.cs | 35 +- .../Test/Plug-ins/TestInputHL7DataPlugs.cs | 2 + .../Common/InputHL7DataPlugInEngineTest.cs | 33 +- .../Services/HealthLevel7/MllPExtractTests.cs | 8 +- .../Services/HealthLevel7/MllpClientTest.cs | 2 +- .../Test/packages.lock.json | 0 src/InformaticsGateway/nlog.config | 1 + src/InformaticsGateway/packages.lock.json | 0 .../EntityFramework/MigrationManager.cs | 2 +- .../Test/packages.lock.json | 0 tests/Integration.Test/Common/DataProvider.cs | 3 +- .../StepDefinitions/Hl7StepDefinitions.cs | 3 +- tests/Integration.Test/appsettings.json | 26 +- tests/Integration.Test/packages.lock.json | 0 60 files changed, 842 insertions(+), 218 deletions(-) mode change 100644 => 100755 src/Api/HL7DestinationEntity.cs mode change 100644 => 100755 src/Api/Test/HL7DestinationEntityTest.cs rename src/Api/Test/{BaseApplicationEntityTest.cs => SourceBaseApplicationEntityTest.cs} (87%) mode change 100644 => 100755 src/CLI/packages.lock.json mode change 100644 => 100755 src/Client/Test/packages.lock.json mode change 100644 => 100755 src/Client/packages.lock.json mode change 100644 => 100755 src/Configuration/packages.lock.json mode change 100644 => 100755 src/Database/Api/packages.lock.json mode change 100644 => 100755 src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs mode change 100644 => 100755 src/Database/EntityFramework/EfDatabaseMigrationManager.cs create mode 100755 src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.Designer.cs create mode 100755 src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/EntityFramework/Test/packages.lock.json mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs mode change 100644 => 100755 src/Database/MongoDB/Integration.Test/packages.lock.json mode change 100644 => 100755 src/Database/packages.lock.json mode change 100644 => 100755 src/InformaticsGateway/Logging/Log.8000.HttpServices.cs mode change 100644 => 100755 src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs mode change 100644 => 100755 src/InformaticsGateway/Test/packages.lock.json mode change 100644 => 100755 src/InformaticsGateway/packages.lock.json mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Database/EntityFramework/MigrationManager.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Test/packages.lock.json mode change 100644 => 100755 tests/Integration.Test/packages.lock.json diff --git a/Dockerfile b/Dockerfile index f5ecd0807..290786bc3 100755 --- a/Dockerfile +++ b/Dockerfile @@ -34,9 +34,11 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean \ && apt-get update \ - && apt-get install -y --no-install-recommends \ - curl \ - && rm -rf /var/lib/apt/lists + && apt-get install -y --no-install-recommends curl \ + && apt-get install -y libc6-dev=2.35-0ubuntu3.6 # this is a workaround for Mongo encryption library +RUN rm -rf /var/lib/apt/lists + + WORKDIR /opt/monai/ig @@ -45,6 +47,8 @@ COPY --from=build /tools /opt/dotnetcore-tools COPY LICENSE ./ COPY docs/compliance/third-party-licenses.md ./ +RUN ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /opt/monai/ig/libdl.so # part 2 of workaround for Mongo encryption library + EXPOSE 104 EXPOSE 2575 EXPOSE 5000 diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 1f67b94a6..08658c61e 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -583,6 +583,7 @@ - Microsoft.NET.ILLink.Tasks - :versions: - 8.0.0 + - 8.0.1 :when: 2022-10-14T23:37:16.793Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -1775,4 +1776,4 @@ - 7.0.0 :when: 2023-08-10T20:50:14.759Z :who: mocsharp - :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) \ No newline at end of file + :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) diff --git a/src/Api/HL7DestinationEntity.cs b/src/Api/HL7DestinationEntity.cs old mode 100644 new mode 100755 index 33655bdde..317585934 --- a/src/Api/HL7DestinationEntity.cs +++ b/src/Api/HL7DestinationEntity.cs @@ -25,7 +25,6 @@ namespace Monai.Deploy.InformaticsGateway.Api.Models /// { /// "name": "MYPACS", /// "hostIp": "10.20.100.200", - /// "aeTitle": "MONAIPACS", /// "port": 1104 /// } /// @@ -36,5 +35,10 @@ public class HL7DestinationEntity : BaseApplicationEntity /// Gets or sets the port to connect to. /// public int Port { get; set; } + + public override string ToString() + { + return $"Name: {Name}/Host: {HostIp}/Port: {Port}"; + } } } diff --git a/src/Api/Models/BaseApplicationEntity.cs b/src/Api/Models/BaseApplicationEntity.cs index 0de7a3e39..d9998795b 100755 --- a/src/Api/Models/BaseApplicationEntity.cs +++ b/src/Api/Models/BaseApplicationEntity.cs @@ -35,10 +35,6 @@ public class BaseApplicationEntity : MongoDBEntityBase /// public string Name { get; set; } = default!; - /// - /// Gets or sets the AE Title (AET) used to identify itself in a DICOM association. - /// - public string AeTitle { get; set; } = default!; /// /// Gets or set the host name or IP address of the AE Title. @@ -65,10 +61,8 @@ public BaseApplicationEntity() SetDefaultValues(); } - public void SetDefaultValues() + public virtual void SetDefaultValues() { - if (string.IsNullOrWhiteSpace(Name)) - Name = AeTitle; } public void SetAuthor(ClaimsPrincipal user, EditMode editMode) @@ -90,7 +84,7 @@ public void SetAuthor(ClaimsPrincipal user, EditMode editMode) public override string ToString() { - return $"Name: {Name}/AET: {AeTitle}/Host: {HostIp}"; + return $"Name: {Name} /Host: {HostIp}"; } } } diff --git a/src/Api/Models/DestinationApplicationEntity.cs b/src/Api/Models/DestinationApplicationEntity.cs index 4a7069edd..6ad00ac05 100755 --- a/src/Api/Models/DestinationApplicationEntity.cs +++ b/src/Api/Models/DestinationApplicationEntity.cs @@ -36,5 +36,21 @@ public class DestinationApplicationEntity : BaseApplicationEntity /// Gets or sets the port to connect to. /// public int Port { get; set; } + + /// + /// Gets or sets the AE Title (AET) used to identify itself in a DICOM association. + /// + public string AeTitle { get; set; } = default!; + + public override void SetDefaultValues() + { + if (string.IsNullOrWhiteSpace(Name)) + Name = AeTitle; + } + + public override string ToString() + { + return $"Name: {Name}/AET: {AeTitle}/Host: {HostIp}/Port: {Port}"; + } } } diff --git a/src/Api/SourceApplicationEntity.cs b/src/Api/SourceApplicationEntity.cs index b46a61b8c..09edd983f 100755 --- a/src/Api/SourceApplicationEntity.cs +++ b/src/Api/SourceApplicationEntity.cs @@ -33,5 +33,20 @@ namespace Monai.Deploy.InformaticsGateway.Api /// public class SourceApplicationEntity : BaseApplicationEntity { + /// + /// Gets or sets the AE Title (AET) used to identify itself in a DICOM association. + /// + public string AeTitle { get; set; } = default!; + + public override void SetDefaultValues() + { + if (string.IsNullOrWhiteSpace(Name)) + Name = AeTitle; + } + + public override string ToString() + { + return $"Name: {Name}/AET: {AeTitle}/Host: {HostIp}"; + } } } diff --git a/src/Api/Storage/Hl7FileStorageMetadata.cs b/src/Api/Storage/Hl7FileStorageMetadata.cs index 576f88ae3..b4e33aed3 100755 --- a/src/Api/Storage/Hl7FileStorageMetadata.cs +++ b/src/Api/Storage/Hl7FileStorageMetadata.cs @@ -27,7 +27,7 @@ namespace Monai.Deploy.InformaticsGateway.Api.Storage public sealed record Hl7FileStorageMetadata : FileStorageMetadata { public const string Hl7SubDirectoryName = "ehr"; - public const string FileExtension = ".txt"; + public const string FileExtension = ".hl7"; /// [JsonIgnore] diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs index c390625a1..b09575441 100755 --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -86,8 +86,6 @@ public TimeSpan Elapsed public int FilesFailedToUpload { get => Files.Count(p => p.IsUploadFailed); } - public string DestinationFolder { get; set; } = string.Empty; - public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); @@ -108,7 +106,7 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str DataTrigger = dataTrigger; } - public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null, string? DestinationFolder = null) : + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null) : this(key, correlationId, workflowInstanceId, taskId, dataTrigger, timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); @@ -121,7 +119,6 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str { PayloadId = Guid.Parse(payloadId); } - DestinationFolder ??= string.Empty; } public void Add(FileStorageMetadata value) diff --git a/src/Api/Test/HL7DestinationEntityTest.cs b/src/Api/Test/HL7DestinationEntityTest.cs old mode 100644 new mode 100755 index 181f1fd9e..1a3d1b027 --- a/src/Api/Test/HL7DestinationEntityTest.cs +++ b/src/Api/Test/HL7DestinationEntityTest.cs @@ -21,34 +21,23 @@ namespace Monai.Deploy.InformaticsGateway.Api.Test { public class HL7DestinationEntityTest { - [Fact] - public void GivenAMonaiApplicationEntity_WhenNameIsNotSet_ExepectSetDefaultValuesToBeUsed() - { - var entity = new HL7DestinationEntity - { - AeTitle = "AET", - }; - - entity.SetDefaultValues(); - Assert.Equal(entity.AeTitle, entity.Name); - } [Fact] public void GivenAMonaiApplicationEntity_WhenNameIsSet_ExepectSetDefaultValuesToNotOverwrite() { var entity = new HL7DestinationEntity { - AeTitle = "AET", + Port = 1104, HostIp = "IP", Name = "Name" }; entity.SetDefaultValues(); - Assert.Equal("AET", entity.AeTitle); Assert.Equal("IP", entity.HostIp); Assert.Equal("Name", entity.Name); + Assert.Equal(1104, entity.Port); } } } diff --git a/src/Api/Test/BaseApplicationEntityTest.cs b/src/Api/Test/SourceBaseApplicationEntityTest.cs similarity index 87% rename from src/Api/Test/BaseApplicationEntityTest.cs rename to src/Api/Test/SourceBaseApplicationEntityTest.cs index 6fcfd032c..801fc9049 100755 --- a/src/Api/Test/BaseApplicationEntityTest.cs +++ b/src/Api/Test/SourceBaseApplicationEntityTest.cs @@ -14,17 +14,16 @@ * limitations under the License. */ -using Monai.Deploy.InformaticsGateway.Api.Models; using Xunit; namespace Monai.Deploy.InformaticsGateway.Api.Test { - public class BaseApplicationEntityTest + public class SourceBaseApplicationEntityTest { [Fact] public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesToSetName() { - var entity = new BaseApplicationEntity + var entity = new SourceApplicationEntity { AeTitle = "AET", HostIp = "IP" @@ -38,7 +37,7 @@ public void GivenABaseApplicationEntity_WhenNameIsNotSet_ExpectSetDefaultValuesT [Fact] public void GivenABaseApplicationEntity_WhenNameIsSet_ExpectSetDefaultValuesToNotSetName() { - var entity = new BaseApplicationEntity + var entity = new SourceApplicationEntity { AeTitle = "AET", HostIp = "IP", diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 6fe9b7213..9157d20a7 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -41,9 +41,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Monai.Deploy.Messaging": { "type": "Direct", diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json old mode 100644 new mode 100755 index bc6481d7b..99b5fa94b --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -35,9 +35,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "System.CommandLine.Hosting": { "type": "Direct", diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json index e066f8661..522b24810 100755 --- a/src/Client.Common/packages.lock.json +++ b/src/Client.Common/packages.lock.json @@ -10,9 +10,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" } } } diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json index 3c3551297..ae98eff94 100755 --- a/src/Common/packages.lock.json +++ b/src/Common/packages.lock.json @@ -10,9 +10,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "System.IO.Abstractions": { "type": "Direct", diff --git a/src/Configuration/ValidationExtensions.cs b/src/Configuration/ValidationExtensions.cs index 09e7bc932..a326b6283 100755 --- a/src/Configuration/ValidationExtensions.cs +++ b/src/Configuration/ValidationExtensions.cs @@ -66,8 +66,7 @@ public static bool IsValid(this HL7DestinationEntity hl7destinationEntity, out I var valid = true; valid &= !string.IsNullOrWhiteSpace(hl7destinationEntity.Name); - valid &= IsAeTitleValid(hl7destinationEntity.GetType().Name, hl7destinationEntity.AeTitle, validationErrors); - valid &= IsValidHostNameIp(hl7destinationEntity.AeTitle, hl7destinationEntity.HostIp, validationErrors); + valid &= IsValidHostNameIp(hl7destinationEntity.Name, hl7destinationEntity.HostIp, validationErrors); valid &= IsPortValid(hl7destinationEntity.GetType().Name, hl7destinationEntity.Port, validationErrors); return valid; diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json old mode 100644 new mode 100755 index 9aef01cb9..0fd6efb84 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -4,9 +4,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs old mode 100644 new mode 100755 index 703dad6f3..8bffd2a6d --- a/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/HL7DestinationEntityConfiguration.cs @@ -26,7 +26,6 @@ internal class HL7DestinationEntityConfiguration : IEntityTypeConfiguration builder) { builder.HasKey(j => j.Name); - builder.Property(j => j.AeTitle).IsRequired(); builder.Property(j => j.Port).IsRequired(); builder.Property(j => j.HostIp).IsRequired(); builder.Property(j => j.CreatedBy).IsRequired(false); @@ -35,7 +34,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(j => j.DateTimeUpdated).IsRequired(false); builder.HasIndex(p => p.Name, "idx_destination_name").IsUnique(); - builder.HasIndex(p => new { p.Name, p.AeTitle, p.HostIp, p.Port }, "idx_source_all").IsUnique(); + builder.HasIndex(p => new { p.Name, p.HostIp, p.Port }, "idx_source_all").IsUnique(); builder.Ignore(p => p.Id); } diff --git a/src/Database/EntityFramework/EfDatabaseMigrationManager.cs b/src/Database/EntityFramework/EfDatabaseMigrationManager.cs old mode 100644 new mode 100755 index edbd87511..5c90d9199 --- a/src/Database/EntityFramework/EfDatabaseMigrationManager.cs +++ b/src/Database/EntityFramework/EfDatabaseMigrationManager.cs @@ -37,7 +37,7 @@ public IHost Migrate(IHost host) catch (Exception ex) { var logger = scope.ServiceProvider.GetService(); - logger?.Log(LogLevel.Critical, "Failed to migrate database", ex); + logger?.Log(LogLevel.Critical, message: "Failed to migrate database", exception: ex); throw; } } diff --git a/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.Designer.cs b/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.Designer.cs new file mode 100755 index 000000000..175ca28e4 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.Designer.cs @@ -0,0 +1,514 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20240118154616_MinorModelChanges")] + partial class MinorModelChanges + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("DataLink") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataMapping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SendingId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_hl7_name") + .IsUnique(); + + b.ToTable("Hl7ApplicationConfig"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.DicomAssociationInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CalledAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CallingAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeDisconnected") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("TEXT"); + + b.Property("Errors") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FileCount") + .HasColumnType("INTEGER"); + + b.Property("PayloadIds") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteHost") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemotePort") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("DicomAssociationHistories"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.ExternalAppDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DestinationFolder") + .HasColumnType("TEXT"); + + b.Property("ExportTaskID") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PatientIdOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StudyInstanceUidOutBound") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("ExternalAppDetails"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.HL7DestinationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique() + .HasDatabaseName("idx_destination_name1"); + + b.HasIndex(new[] { "Name", "HostIp", "Port" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.ToTable("HL7DestinationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Models.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "inputMetadata"); + + b.Property("InputResources") + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "inputResources"); + + b.Property("OutputResources") + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "outputResources"); + + b.Property("Priority") + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "priority"); + + b.Property("State") + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "state"); + + b.Property("Status") + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "status"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "transactionID"); + + b.Property("TryCount") + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "tryCount"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all2"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataOrigins") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DataTrigger") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("Files") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MachineName") + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("TaskId") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("WorkflowInstanceId") + .HasColumnType("TEXT"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.VirtualApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("CreatedBy") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("DateTimeUpdated") + .HasColumnType("TEXT"); + + b.Property("PlugInAssemblies") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdatedBy") + .HasColumnType("TEXT"); + + b.Property("VirtualAeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Workflows") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_virtualae_name") + .IsUnique(); + + b.ToTable("VirtualApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "correlationId"); + + b.Property("Identity") + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "identity"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "isUploaded"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "typeName"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "value"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs b/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs new file mode 100755 index 000000000..54c70839f --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs @@ -0,0 +1,60 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + /// + public partial class MinorModelChanges : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities"); + + migrationBuilder.DropColumn( + name: "DestinationFolder", + table: "Payloads"); + + migrationBuilder.DropColumn( + name: "AeTitle", + table: "HL7DestinationEntities"); + + migrationBuilder.CreateIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities", + columns: new[] { "Name", "HostIp", "Port" }, + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities"); + + migrationBuilder.AddColumn( + name: "DestinationFolder", + table: "Payloads", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "AeTitle", + table: "HL7DestinationEntities", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.CreateIndex( + name: "idx_source_all_HL7Destination", + table: "HL7DestinationEntities", + columns: new[] { "Name", "AeTitle", "HostIp", "Port" }, + unique: true); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs index 8eb10b0df..485e96b0a 100755 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -15,7 +15,7 @@ partial class InformaticsGatewayContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.25"); + modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Hl7ApplicationConfigEntity", b => { @@ -192,10 +192,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Name") .HasColumnType("TEXT"); - b.Property("AeTitle") - .IsRequired() - .HasColumnType("TEXT"); - b.Property("CreatedBy") .HasColumnType("TEXT"); @@ -221,7 +217,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsUnique() .HasDatabaseName("idx_destination_name1"); - b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + b.HasIndex(new[] { "Name", "HostIp", "Port" }, "idx_source_all") .IsUnique() .HasDatabaseName("idx_source_all1"); @@ -295,29 +291,37 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT"); b.Property("InputMetadata") - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "inputMetadata"); b.Property("InputResources") - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "inputResources"); b.Property("OutputResources") - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "outputResources"); b.Property("Priority") - .HasColumnType("INTEGER"); + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "priority"); b.Property("State") - .HasColumnType("INTEGER"); + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "state"); b.Property("Status") - .HasColumnType("INTEGER"); + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "status"); b.Property("TransactionId") .IsRequired() - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "transactionID"); b.Property("TryCount") - .HasColumnType("INTEGER"); + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "tryCount"); b.HasKey("InferenceRequestId"); @@ -390,10 +394,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("DateTimeCreated") .HasColumnType("TEXT"); - b.Property("DestinationFolder") - .IsRequired() - .HasColumnType("TEXT"); - b.Property("Files") .IsRequired() .HasColumnType("TEXT"); @@ -471,24 +471,29 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => { b.Property("CorrelationId") - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "correlationId"); b.Property("Identity") - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "identity"); b.Property("DateTimeCreated") .HasColumnType("TEXT"); b.Property("IsUploaded") - .HasColumnType("INTEGER"); + .HasColumnType("INTEGER") + .HasAnnotation("Relational:JsonPropertyName", "isUploaded"); b.Property("TypeName") .IsRequired() - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "typeName"); b.Property("Value") .IsRequired() - .HasColumnType("TEXT"); + .HasColumnType("TEXT") + .HasAnnotation("Relational:JsonPropertyName", "value"); b.HasKey("CorrelationId", "Identity"); diff --git a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs old mode 100644 new mode 100755 index 6a43a14b9..9a862e0ec --- a/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/HL7DestinationEntityRepositoryTest.cs @@ -55,21 +55,20 @@ public HL7DestinationEntityRepositoryTest(SqliteDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = [1, 1, 1]; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } [Fact] public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSaved() { - var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + var aet = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET" }; var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); - Assert.Equal(aet.AeTitle, actual!.AeTitle); Assert.Equal(aet.HostIp, actual!.HostIp); Assert.Equal(aet.Port, actual!.Port); Assert.Equal(aet.Name, actual!.Name); @@ -79,12 +78,7 @@ public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSa public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); - - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); @@ -99,7 +93,6 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); - Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("1.2.3.4", actual!.HostIp); Assert.Equal(114, actual!.Port); Assert.Equal("AET1", actual!.Name); @@ -142,7 +135,6 @@ public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - expected!.AeTitle = "AET100"; expected!.Port = 1000; expected!.HostIp = "loalhost"; @@ -151,7 +143,6 @@ public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); - Assert.Equal(expected.AeTitle, dbResult!.AeTitle); Assert.Equal(expected.HostIp, dbResult!.HostIp); Assert.Equal(expected.Port, dbResult!.Port); } diff --git a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs index 19219a3a3..0205695b7 100755 --- a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs @@ -62,11 +62,11 @@ public void InitDatabaseWithDestinationApplicationEntities() public void InitDatabaseWithHL7DestinationEntities() { - var aet1 = new HL7DestinationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1" }; - var aet2 = new HL7DestinationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2" }; - var aet3 = new HL7DestinationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3" }; - var aet4 = new HL7DestinationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4" }; - var aet5 = new HL7DestinationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5" }; + var aet1 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET1" }; + var aet2 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET2" }; + var aet3 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET3" }; + var aet4 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET4" }; + var aet5 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET5" }; var set = DatabaseContext.Set(); set.RemoveRange(set.ToList()); diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs old mode 100644 new mode 100755 index e48e004c4..a2a67f981 --- a/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs +++ b/src/Database/MongoDB/Integration.Test/HL7DestinationEntityRepositoryTest.cs @@ -58,14 +58,14 @@ public HL7DestinationEntityRepositoryTest(MongoDatabaseFixture databaseFixture) _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); - _options.Value.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _options.Value.Retries.DelaysMilliseconds = [1, 1, 1]; _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); } [Fact] public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSaved() { - var aet = new HL7DestinationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + var aet = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET" }; var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); await store.AddAsync(aet).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); @@ -74,7 +74,6 @@ public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSa var actual = await collection.Find(p => p.Name == aet.Name).FirstOrDefaultAsync().ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); - Assert.Equal(aet.AeTitle, actual!.AeTitle); Assert.Equal(aet.HostIp, actual!.HostIp); Assert.Equal(aet.Port, actual!.Port); Assert.Equal(aet.Name, actual!.Name); @@ -84,12 +83,7 @@ public async Task GivenAHL7DestinationEntity_WhenAddingToDatabase_ExpectItToBeSa public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() { var store = new HL7DestinationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options, _databaseFixture.Options); - - var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1")).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); - Assert.True(result); - result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + var result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.True(result); @@ -104,7 +98,6 @@ public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturn var actual = await store.FindByNameAsync("AET1").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(actual); - Assert.Equal("AET1", actual!.AeTitle); Assert.Equal("1.2.3.4", actual!.HostIp); Assert.Equal(114, actual!.Port); Assert.Equal("AET1", actual!.Name); @@ -149,7 +142,6 @@ public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved var expected = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(expected); - expected!.AeTitle = "AET100"; expected!.Port = 1000; expected!.HostIp = "loalhost"; @@ -158,7 +150,6 @@ public async Task GivenAHL7DestinationEntity_WhenUpdatedIsCalled_ExpectItToSaved var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); Assert.NotNull(dbResult); - Assert.Equal(expected.AeTitle, dbResult!.AeTitle); Assert.Equal(expected.HostIp, dbResult!.HostIp); Assert.Equal(expected.Port, dbResult!.Port); } diff --git a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs index f1d48885e..140ea64a8 100755 --- a/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs +++ b/src/Database/MongoDB/Integration.Test/MongoDatabaseFixture.cs @@ -69,11 +69,11 @@ public void InitDatabaseWithHL7DestinationEntities() { var collection = Database.GetCollection(nameof(HL7DestinationEntity)); Clear(collection); - var aet1 = new HL7DestinationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1", DateTimeCreated = DateTime.UtcNow }; - var aet2 = new HL7DestinationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2", DateTimeCreated = DateTime.UtcNow }; - var aet3 = new HL7DestinationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3", DateTimeCreated = DateTime.UtcNow }; - var aet4 = new HL7DestinationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4", DateTimeCreated = DateTime.UtcNow }; - var aet5 = new HL7DestinationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5", DateTimeCreated = DateTime.UtcNow }; + var aet1 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET1", DateTimeCreated = DateTime.UtcNow }; + var aet2 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET2", DateTimeCreated = DateTime.UtcNow }; + var aet3 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET3", DateTimeCreated = DateTime.UtcNow }; + var aet4 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET4", DateTimeCreated = DateTime.UtcNow }; + var aet5 = new HL7DestinationEntity { HostIp = "1.2.3.4", Port = 114, Name = "AET5", DateTimeCreated = DateTime.UtcNow }; collection.InsertOne(aet1); collection.InsertOne(aet2); diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs index feb428f09..de51c885f 100755 --- a/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs +++ b/src/Database/MongoDB/Repositories/HL7DestinationEntityRepository.cs @@ -74,7 +74,6 @@ private void CreateIndexes() var indexDefinitionAll = Builders.IndexKeys.Combine( Builders.IndexKeys.Ascending(_ => _.Name), - Builders.IndexKeys.Ascending(_ => _.AeTitle), Builders.IndexKeys.Ascending(_ => _.HostIp), Builders.IndexKeys.Ascending(_ => _.Port)); _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionAll, options)); diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json index 052d8cd8f..43be542c2 100755 --- a/src/DicomWebClient/CLI/packages.lock.json +++ b/src/DicomWebClient/CLI/packages.lock.json @@ -14,9 +14,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json index 47c71c842..1aa43eba1 100755 --- a/src/DicomWebClient/packages.lock.json +++ b/src/DicomWebClient/packages.lock.json @@ -23,9 +23,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs index 15694a8f5..b207d5f87 100755 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -51,14 +51,14 @@ public static partial class Log [LoggerMessage(EventId = 809, Level = LogLevel.Debug, Message = "Acknowledgment type={value}.")] public static partial void AcknowledgmentType(this ILogger logger, string value); - [LoggerMessage(EventId = 810, Level = LogLevel.Information, Message = "Acknowledgment sent: length={length}.")] - public static partial void AcknowledgmentSent(this ILogger logger, int length); + [LoggerMessage(EventId = 810, Level = LogLevel.Information, Message = "Acknowledgment sent message:{message} length:{length}.")] + public static partial void AcknowledgmentSent(this ILogger logger, string message, int length); [LoggerMessage(EventId = 811, Level = LogLevel.Debug, Message = "HL7 bytes received: {length}.")] public static partial void Hl7MessageBytesRead(this ILogger logger, int length); - [LoggerMessage(EventId = 812, Level = LogLevel.Debug, Message = "Parsing message with {length} bytes.")] - public static partial void Hl7GenerateMessage(this ILogger logger, int length); + [LoggerMessage(EventId = 812, Level = LogLevel.Debug, Message = "Parsing message with {length} bytes. {message}")] + public static partial void Hl7GenerateMessage(this ILogger logger, int length, string message); [LoggerMessage(EventId = 813, Level = LogLevel.Debug, Message = "Waiting for HL7 message.")] public static partial void HL7ReadingMessage(this ILogger logger); @@ -105,5 +105,14 @@ public static partial class Log [LoggerMessage(EventId = 827, Level = LogLevel.Warning, Message = "HL7 plugin loading exceptions")] public static partial void HL7PluginLoadingExceptions(this ILogger logger, Exception ex); + [LoggerMessage(EventId = 828, Level = LogLevel.Information, Message = "HL7 message recieved. {message}")] + public static partial void Hl7MessageReceieved(this ILogger logger, string message); + + [LoggerMessage(EventId = 829, Level = LogLevel.Trace, Message = "HL7 config Not matching message Id {senderId} configId {configID}")] + public static partial void Hl7NotMatchingConfig(this ILogger logger, string senderId, string configID); + + [LoggerMessage(EventId = 830, Level = LogLevel.Error, Message = "Error generating HL7 acknowledgment. for message {message}")] + public static partial void ErrorGeneratingHl7Acknowledgment(this ILogger logger, Exception ex, string message); + } } diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs old mode 100644 new mode 100755 index ec6d41ce8..bd706d8ce --- a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs +++ b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs @@ -188,8 +188,8 @@ public static partial class Log // HL7 Destination Controller - [LoggerMessage(EventId = 8401, Level = LogLevel.Information, Message = "HL7 destination added AE Title={aeTitle}, Host/IP={hostIp}.")] - public static partial void HL7DestinationEntityAdded(this ILogger logger, string aeTitle, string hostIp); + [LoggerMessage(EventId = 8401, Level = LogLevel.Information, Message = "HL7 destination added Name={name}, Host/IP={hostIp}.")] + public static partial void HL7DestinationEntityAdded(this ILogger logger, string name, string hostIp); [LoggerMessage(EventId = 8402, Level = LogLevel.Information, Message = "HL7 destination deleted {name}.")] public static partial void HL7DestinationEntityDeleted(this ILogger logger, string name); @@ -206,7 +206,7 @@ public static partial class Log [LoggerMessage(EventId = 8406, Level = LogLevel.Error, Message = "Error C-ECHO to HL7 destination {name}.")] public static partial void ErrorCEechoHL7DestinationEntity(this ILogger logger, string name, Exception ex); - [LoggerMessage(EventId = 8407, Level = LogLevel.Information, Message = "HL7 destination updated {name}: AE Title={aeTitle}, Host/IP={hostIp}, Port={port}.")] - public static partial void HL7DestinationEntityUpdated(this ILogger logger, string name, string aeTitle, string hostIp, int port); + [LoggerMessage(EventId = 8407, Level = LogLevel.Information, Message = "HL7 destination updated {name}: Host/IP={hostIp}, Port={port}.")] + public static partial void HL7DestinationEntityUpdated(this ILogger logger, string name, string hostIp, int port); } } diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 9a3da68e7..a3352862a 100755 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -182,6 +182,7 @@ private static NLog.Logger ConfigureNLog(string assemblyVersionNumber) ext.RegisterLayoutRenderer("servicename", logEvent => typeof(Program).Namespace); ext.RegisterLayoutRenderer("serviceversion", logEvent => assemblyVersionNumber); ext.RegisterLayoutRenderer("machinename", logEvent => Environment.MachineName); + ext.RegisterLayoutRenderer("appname", logEvent => "MIG"); }) .LoadConfigurationFromAppSettings() .GetCurrentClassLogger(); diff --git a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs old mode 100644 new mode 100755 index 3b0d177d2..ea77b42b3 --- a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json; using System.Threading.Tasks; using FellowOakDicom; using Microsoft.Extensions.Logging; @@ -31,7 +32,7 @@ internal class InputDataPlugInEngine : IInputDataPlugInEngine { private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; - private IReadOnlyList? _plugsins; + private IReadOnlyList? _plugins; public InputDataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) { @@ -41,20 +42,22 @@ public InputDataPlugInEngine(IServiceProvider serviceProvider, ILogger pluginAssemblies) { - _plugsins = LoadPlugIns(_serviceProvider, pluginAssemblies); + _plugins = LoadPlugIns(_serviceProvider, pluginAssemblies); } public async Task> ExecutePlugInsAsync(DicomFile dicomFile, FileStorageMetadata fileMetadata) { - if (_plugsins == null) + if (_plugins == null) { throw new PlugInInitializationException("InputDataPlugInEngine not configured, please call Configure() first."); } - foreach (var plugin in _plugsins) + foreach (var plugin in _plugins) { _logger.ExecutingInputDataPlugIn(plugin.Name); (dicomFile, fileMetadata) = await plugin.ExecuteAsync(dicomFile, fileMetadata).ConfigureAwait(false); + + _logger.LogTrace($"InputDataPlugInEngine: {plugin.Name} executed. fileMetadata now: {JsonSerializer.Serialize(fileMetadata)}"); } return new Tuple(dicomFile, fileMetadata); diff --git a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs index a4abac3f0..6f7f1d7bf 100755 --- a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs @@ -47,20 +47,22 @@ public void Configure(IReadOnlyList pluginAssemblies) public async Task> ExecutePlugInsAsync(Message hl7File, FileStorageMetadata fileMetadata, Hl7ApplicationConfigEntity? configItem) { - if (_plugsins == null) + if (configItem?.PlugInAssemblies is not null && configItem.PlugInAssemblies.Any()) { - throw new PlugInInitializationException("InputHL7DataPlugInEngine not configured, please call Configure() first."); - } + if (_plugsins == null) + { + throw new PlugInInitializationException("InputHL7DataPlugInEngine not configured, please call Configure() first."); + } - foreach (var plugin in _plugsins) - { - if (configItem is not null && configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) + foreach (var plugin in _plugsins) { - _logger.ExecutingInputDataPlugIn(plugin.Name); - (hl7File, fileMetadata) = await plugin.ExecuteAsync(hl7File, fileMetadata).ConfigureAwait(false); + if (configItem is not null && configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) + { + _logger.ExecutingInputDataPlugIn(plugin.Name); + (hl7File, fileMetadata) = await plugin.ExecuteAsync(hl7File, fileMetadata).ConfigureAwait(false); + } } } - return new Tuple(hl7File, fileMetadata); } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index bc784031f..5891fef24 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -114,7 +114,7 @@ public async Task Queue(string bucket, FileStorageMetadata file, DataOrigi using var _ = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", file.CorrelationId } }); - var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, file.PayloadId, cancellationToken).ConfigureAwait(false); + var payload = await CreateOrGetPayload(bucket, file.CorrelationId, file.WorkflowInstanceId, file.TaskId, dataOrigin, timeout, cancellationToken).ConfigureAwait(false); payload.Add(file); _logger.FileAddedToBucket(payload.Key, payload.Count, file.PayloadId ?? "null"); return payload.PayloadId; @@ -144,7 +144,7 @@ private async void OnTimedEvent(Object? source, System.Timers.ElapsedEventArgs e } foreach (var key in _payloads.Keys) { - var payload = await _payloads[key].WithCancellation(_tokenSource.Token); + var payload = await _payloads[key].WithCancellation(_tokenSource.Token).ConfigureAwait(false); using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", payload.CorrelationId } }); _logger.BucketElapsedTime(key, payload.Timeout, payload.ElapsedTime().TotalSeconds, payload.Files.Count, payload.FilesUploaded, payload.FilesFailedToUpload); @@ -211,17 +211,17 @@ private async Task QueueBucketForNotification(string key, Payload payload) } } - private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder = null, CancellationToken cancellationToken = default) + private async Task CreateOrGetPayload(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, CancellationToken cancellationToken = default) { - var payload = _payloads.GetOrAdd(key, x => new AsyncLazy((cancellationToken) => PayloadFactory(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, destinationFolder, cancellationToken))); + var payload = _payloads.GetOrAdd(key, x => new AsyncLazy((cancellationToken) => PayloadFactory(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, cancellationToken))); return await payload.WithCancellation(cancellationToken).ConfigureAwait(false); } - private async Task PayloadFactory(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, string? destinationFolder, CancellationToken cancellationToken) + private async Task PayloadFactory(string key, string correlationId, string? workflowInstanceId, string? taskId, Messaging.Events.DataOrigin dataOrigin, uint timeout, CancellationToken cancellationToken) { var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService(); - var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null, destinationFolder); + var newPayload = new Payload(key, correlationId, workflowInstanceId, taskId, dataOrigin, timeout, null); await repository.AddAsync(newPayload, cancellationToken).ConfigureAwait(false); _logger.BucketCreated(key, timeout); return newPayload; diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 1aa2a848a..cae010ecf 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -16,6 +16,7 @@ using System; using System.Linq; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; @@ -169,6 +170,8 @@ private async Task SendArtifactRecievedEvent(Payload payload) }; artifiactRecievedEvent.DataOrigins.AddRange(payload.DataOrigins); + _logger.LogTrace($"Adding files to ArtifactsReceivedEvent files {JsonSerializer.Serialize(payload)}"); + artifiactRecievedEvent.Artifacts = payload.Files.Select(f => new Artifact { Type = f.DataOrigin.ArtifactType, Path = f.File.UploadPath }).ToList(); var message = new JsonMessage( diff --git a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs index 0e39217d1..1acf2f17e 100755 --- a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs +++ b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs @@ -31,6 +31,7 @@ using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.Messaging.Common; using Polly; +using System.Linq; namespace Monai.Deploy.InformaticsGateway.Services.Export { @@ -119,7 +120,7 @@ private async Task ExecuteHl7Export( .ExecuteAsync(async () => { await _mllpService.SendMllp( - IPAddress.Parse(destination.HostIp), + Dns.GetHostAddresses(destination.HostIp).First(), destination.Port, Encoding.UTF8.GetString(exportRequestData.FileContent), cancellationToken ).ConfigureAwait(false); diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs index cc8a0c36d..183cae0ac 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -159,13 +159,18 @@ private async Task SendAcknowledgment(INetworkStream clientStream, Message messa if (ShouldSendAcknowledgment(message)) { - var ackMessage = message.GetACK(); + var ackMessage = message.GetACK(true); + if (ackMessage is null) + { + _logger.ErrorGeneratingHl7Acknowledgment(new Exception(), message.HL7Message); + return; + } var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); try { await clientStream.WriteAsync(ackData, cancellationToken).ConfigureAwait(false); await clientStream.FlushAsync(cancellationToken).ConfigureAwait(false); - _logger.AcknowledgmentSent(ackData.Length); + _logger.AcknowledgmentSent(ackMessage.HL7Message, ackData.Length); } catch (Exception ex) { @@ -181,7 +186,7 @@ private bool ShouldSendAcknowledgment(Message message) try { var value = message.DefaultSegment(Resources.MessageHeaderSegment).Fields(Resources.AcceptAcknowledgementType); - if (value is null) + if (value is null || string.IsNullOrWhiteSpace(value.Value)) { return true; } @@ -211,9 +216,9 @@ private bool CreateMessage(int startIndex, int endIndex, ref string data, out Me try { var text = data.Substring(messageStartIndex, endIndex - messageStartIndex); - _logger.Hl7GenerateMessage(text.Length); + _logger.Hl7GenerateMessage(text.Length, text); message = new Message(text); - message.ParseMessage(); + message.ParseMessage(false); data = data.Length > endIndex ? data.Substring(messageEndIndex) : string.Empty; return true; } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs index e579db251..184c4f2b8 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpExtract.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using FellowOakDicom; @@ -87,7 +88,7 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess _logger.Hl7NoConfig(); return null; } - _logger.Hl7ConfigLoaded($"Config: {config}"); + _logger.Hl7ConfigLoaded($"Config: {JsonSerializer.Serialize(config)}"); // get config for vendorId var configItem = GetConfig(config, message); if (configItem == null) @@ -115,15 +116,20 @@ public async Task ExtractInfo(Hl7FileStorageMetadata meta, Message mess throw new Exception($"Invalid DataLinkType: {type}"); } - internal static Hl7ApplicationConfigEntity? GetConfig(List config, Message message) + internal Hl7ApplicationConfigEntity? GetConfig(List config, Message message) { foreach (var item in config) { - var t = message.GetValue(item.SendingId.Key); - if (item.SendingId.Value == message.GetValue(item.SendingId.Key)) + var sendingId = message.GetValue(item.SendingId.Key); + if (item.SendingId.Value == sendingId) { + _logger.Hl7FoundMatchingConfig(sendingId, JsonSerializer.Serialize(item)); return item; } + else + { + _logger.Hl7NotMatchingConfig(sendingId, item.SendingId.Value); + } } return null; } @@ -143,7 +149,7 @@ private Message RepopulateMessage(Hl7ApplicationConfigEntity config, ExternalApp { var newMess = message.HL7Message.Replace(oldvalue, details.PatientId); message = new Message(newMess); - message.ParseMessage(); + message.ParseMessage(true); } } else if (tag == DicomTag.StudyInstanceUID) @@ -155,7 +161,7 @@ private Message RepopulateMessage(Hl7ApplicationConfigEntity config, ExternalApp { var newMess = message.HL7Message.Replace(oldvalue, details.StudyInstanceUid); message = new Message(newMess); - message.ParseMessage(); + message.ParseMessage(true); } } } diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index b105b58ec..1ee3d0a9b 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -192,8 +192,10 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) { await _inputHL7DataPlugInEngine.ExecutePlugInsAsync(message, hl7Filemetadata, configItem).ConfigureAwait(false); newMessage = await _mIIpExtract.ExtractInfo(hl7Filemetadata, message, configItem).ConfigureAwait(false); - } + _logger.LogTrace($"HL7 message after plug-in processing: {newMessage.HL7Message} correlationId: {hl7Filemetadata.CorrelationId}"); + } + _logger.Hl7MessageReceieved(newMessage.HL7Message); await hl7Filemetadata.SetDataStream(newMessage.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); var payloadId = await _payloadAssembler.Queue(client.ClientId.ToString(), hl7Filemetadata, new DataOrigin { DataService = DataService.HL7, Source = client.ClientIp, Destination = FileStorageMetadata.IpAddress() }).ConfigureAwait(false); hl7Filemetadata.PayloadId ??= payloadId.ToString(); @@ -338,7 +340,7 @@ private async Task EnsureAck(NetworkStream networkStream) foreach (var message in _rawHl7Messages) { var hl7Message = new Message(message); - hl7Message.ParseMessage(); + hl7Message.ParseMessage(false); if (hl7Message.MessageStructure == "ACK") { return; diff --git a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs index 194adb1ed..06ed7a20a 100755 --- a/src/InformaticsGateway/Services/Http/HL7DestinationController.cs +++ b/src/InformaticsGateway/Services/Http/HL7DestinationController.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net.Mime; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -119,7 +120,7 @@ public async Task> Create(HL7DestinationEntity item) await ValidateCreateAsync(item).ConfigureAwait(false); await _repository.AddAsync(item, HttpContext.RequestAborted).ConfigureAwait(false); - _logger.HL7DestinationEntityAdded(item.AeTitle, item.HostIp); + _logger.HL7DestinationEntityAdded(item.Name, item.HostIp); return CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item); } catch (ObjectExistsException ex) @@ -159,7 +160,6 @@ public async Task> Edit(HL7DestinationEntity? item.SetDefaultValues(); - hl7DestinationEntity.AeTitle = item.AeTitle; hl7DestinationEntity.HostIp = item.HostIp; hl7DestinationEntity.Port = item.Port; hl7DestinationEntity.SetAuthor(User, EditMode.Update); @@ -167,7 +167,7 @@ public async Task> Edit(HL7DestinationEntity? await ValidateUpdateAsync(hl7DestinationEntity).ConfigureAwait(false); _ = _repository.UpdateAsync(hl7DestinationEntity, HttpContext.RequestAborted); - _logger.HL7DestinationEntityUpdated(item.Name, item.AeTitle, item.HostIp, item.Port); + _logger.HL7DestinationEntityUpdated(item.Name, item.HostIp, item.Port); return Ok(hl7DestinationEntity); } catch (ConfigurationException ex) @@ -198,7 +198,7 @@ public async Task> Delete(string name) await _repository.RemoveAsync(hl7DestinationEntity, HttpContext.RequestAborted).ConfigureAwait(false); - _logger.HL7DestinationEntityDeleted(name.Substring(0, 10)); + _logger.HL7DestinationEntityDeleted(new string(name.Take(5).ToArray())); return Ok(hl7DestinationEntity); } catch (Exception ex) @@ -214,9 +214,9 @@ private async Task ValidateCreateAsync(HL7DestinationEntity item) { throw new ObjectExistsException($"A HL7 destination with the same name '{item.Name}' already exists."); } - if (await _repository.ContainsAsync(p => p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) + if (await _repository.ContainsAsync(p => p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) { - throw new ObjectExistsException($"A HL7 destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); + throw new ObjectExistsException($"A HL7 destination with the same, host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); } if (!item.IsValid(out var validationErrors)) { @@ -226,9 +226,9 @@ private async Task ValidateCreateAsync(HL7DestinationEntity item) private async Task ValidateUpdateAsync(HL7DestinationEntity item) { - if (await _repository.ContainsAsync(p => !p.Name.Equals(item.Name) && p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) + if (await _repository.ContainsAsync(p => !p.Name.Equals(item.Name) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) { - throw new ObjectExistsException($"A HL7 destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); + throw new ObjectExistsException($"A HL7 destination with the same, host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); } if (!item.IsValid(out var validationErrors)) { diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs index fd967c01a..fca6db392 100755 --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -16,7 +16,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net.Mime; using System.Threading.Tasks; using Ardalis.GuardClauses; @@ -37,24 +36,16 @@ namespace Monai.Deploy.InformaticsGateway.Services.Http { [ApiController] [Route("config/ae")] - public class MonaiAeTitleController : ControllerBase + public class MonaiAeTitleController( + ILogger logger, + IMonaiAeChangedNotificationService monaiAeChangedNotificationService, + IMonaiApplicationEntityRepository repository, + IDataPlugInEngineFactory inputDataPlugInEngineFactory) : ControllerBase { - private readonly ILogger _logger; - private readonly IMonaiApplicationEntityRepository _repository; - private readonly IDataPlugInEngineFactory _inputDataPlugInEngineFactory; - private readonly IMonaiAeChangedNotificationService _monaiAeChangedNotificationService; - - public MonaiAeTitleController( - ILogger logger, - IMonaiAeChangedNotificationService monaiAeChangedNotificationService, - IMonaiApplicationEntityRepository repository, - IDataPlugInEngineFactory inputDataPlugInEngineFactory) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - _inputDataPlugInEngineFactory = inputDataPlugInEngineFactory ?? throw new ArgumentNullException(nameof(inputDataPlugInEngineFactory)); - _monaiAeChangedNotificationService = monaiAeChangedNotificationService ?? throw new ArgumentNullException(nameof(monaiAeChangedNotificationService)); - } + private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + private readonly IMonaiApplicationEntityRepository _repository = repository ?? throw new ArgumentNullException(nameof(repository)); + private readonly IDataPlugInEngineFactory _inputDataPlugInEngineFactory = inputDataPlugInEngineFactory ?? throw new ArgumentNullException(nameof(inputDataPlugInEngineFactory)); + private readonly IMonaiAeChangedNotificationService _monaiAeChangedNotificationService = monaiAeChangedNotificationService ?? throw new ArgumentNullException(nameof(monaiAeChangedNotificationService)); [HttpGet] [Produces("application/json")] @@ -160,9 +151,9 @@ public async Task> Edit(MonaiApplicationEnt applicationEntity.AllowedSopClasses = item.AllowedSopClasses; applicationEntity.Grouping = item.Grouping; applicationEntity.Timeout = item.Timeout; - applicationEntity.IgnoredSopClasses = item.IgnoredSopClasses ?? new List(); - applicationEntity.Workflows = item.Workflows ?? new List(); - applicationEntity.PlugInAssemblies = item.PlugInAssemblies ?? new List(); + applicationEntity.IgnoredSopClasses = item.IgnoredSopClasses ?? []; + applicationEntity.Workflows = item.Workflows ?? []; + applicationEntity.PlugInAssemblies = item.PlugInAssemblies ?? []; applicationEntity.SetAuthor(User, EditMode.Update); await ValidateUpdateAsync(applicationEntity).ConfigureAwait(false); @@ -240,7 +231,7 @@ private async Task ValidateCreateAsync(MonaiApplicationEntity item) { throw new ObjectExistsException($"A MONAI Application Entity with the same AE Title '{item.AeTitle}' already exists."); } - if (item.IgnoredSopClasses.Any() && item.AllowedSopClasses.Any()) + if (item.IgnoredSopClasses.Count != 0 && item.AllowedSopClasses.Count != 0) { throw new ConfigurationException($"Cannot specify both allowed and ignored SOP classes at the same time, they are mutually exclusive."); } diff --git a/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs b/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs index c24e93270..c3b45c8f4 100755 --- a/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs +++ b/src/InformaticsGateway/Test/Plug-ins/TestInputHL7DataPlugs.cs @@ -30,6 +30,8 @@ public class TestInputHL7DataPlugInAddWorkflow : IInputHL7DataPlugIn public Task<(Message hl7Message, FileStorageMetadata fileMetadata)> ExecuteAsync(Message hl7File, FileStorageMetadata fileMetadata) { hl7File.SetValue("MSH.3", TestString); + hl7File = new Message(hl7File.SerializeMessage(false)); + hl7File.ParseMessage(); fileMetadata.Workflows.Add(TestString); return Task.FromResult((hl7File, fileMetadata)); } diff --git a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs index 295322227..917cf5cf0 100755 --- a/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs +++ b/src/InformaticsGateway/Test/Services/Common/InputHL7DataPlugInEngineTest.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright 2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using HL7.Dotnetcore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; @@ -94,6 +95,15 @@ public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalledWith var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); var assemblies = new List() { typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName }; + var config = new Hl7ApplicationConfigEntity() + { + PlugInAssemblies = assemblies, + DataMapping = new List() + { + new StringKeyValuePair() { Key = "MSH.3", Value = "MSH.3" }, + }, + }; + var dicomInfo = new DicomFileStorageMetadata( Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), @@ -105,20 +115,30 @@ public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalledWith "called"); var message = new HL7.Dotnetcore.Message(SampleMessage); - message.ParseMessage(); + message.ParseMessage(true); - await Assert.ThrowsAsync(async () => await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, null)); + await Assert.ThrowsAsync(async () => await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, config)); } [Fact] public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalled_ExpectDataIsProcessedByPlugInAsync() { + var pluginEngine = new InputHL7DataPlugInEngine(_serviceProvider, _logger.Object); var assemblies = new List() { typeof(TestInputHL7DataPlugInAddWorkflow).AssemblyQualifiedName, }; + var config = new Hl7ApplicationConfigEntity() + { + PlugInAssemblies = assemblies, + DataMapping = new List() + { + new StringKeyValuePair() { Key = "MSH.3", Value = "MSH.3" }, + }, + }; + pluginEngine.Configure(assemblies); var dicomInfo = new DicomFileStorageMetadata( @@ -132,12 +152,11 @@ public async Task GivenAnInputHL7DataPlugInEngine_WhenExecutePlugInsIsCalled_Exp "called"); var message = new HL7.Dotnetcore.Message(SampleMessage); - message.ParseMessage(); - var configItem = new Hl7ApplicationConfigEntity { PlugInAssemblies = new List { { "Monai.Deploy.InformaticsGateway.Test.PlugIns.TestInputHL7DataPlugInAddWorkflow" } } }; + message.ParseMessage(true); - var (Hl7Message, resultDicomInfo) = await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, configItem); + var (Hl7Message, resultDicomInfo) = await pluginEngine.ExecutePlugInsAsync(message, dicomInfo, config); - Assert.Equal(Hl7Message, message); + Assert.NotEqual(Hl7Message, message); Assert.Equal(resultDicomInfo, dicomInfo); Assert.Equal(Hl7Message.GetValue("MSH.3"), TestInputHL7DataPlugInAddWorkflow.TestString); } diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs index 0d9aa2541..c9fba7e67 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllPExtractTests.cs @@ -75,13 +75,13 @@ public void ParseConfig_Should_Return_Correct_Item() var message = new Message(SampleMessage); var isParsed = message.ParseMessage(); - var config = MllpExtract.GetConfig(configs, message); + var config = _sut.GetConfig(configs, message); Assert.Equal(correctid, config?.Id); message = new Message(ABCDEMessage); isParsed = message.ParseMessage(); - config = MllpExtract.GetConfig(configs, message); + config = _sut.GetConfig(configs, message); Assert.Equal(azCorrectid, config?.Id); } @@ -191,13 +191,13 @@ public void ParseConfig_Should_Return_Correct_Item_For_Vendor() var message = new Message(VendorMessage); var isParsed = message.ParseMessage(); - var config = MllpExtract.GetConfig(configs, message); + var config = _sut.GetConfig(configs, message); Assert.Equal(correctid, config?.Id); message = new Message(ABCDEMessage); isParsed = message.ParseMessage(); - config = MllpExtract.GetConfig(configs, message); + config = _sut.GetConfig(configs, message); Assert.Equal(azCorrectid, config?.Id); } } diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs index de8b363cd..6eb272064 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpClientTest.cs @@ -33,7 +33,7 @@ namespace Monai.Deploy.InformaticsGateway.Test.Services.HealthLevel7 { public class MllpClientTest { - private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r\n"; + private const string SampleMessage = "MSH|^~\\&|MD|MD HOSPITAL|MD Test|MONAI Deploy|202207130000|SECURITY|MD^A01^ADT_A01|MSG00001|P|2.8||||\r"; private readonly Mock _tcpClient; private readonly Hl7Configuration _config; diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/InformaticsGateway/nlog.config b/src/InformaticsGateway/nlog.config index 4b106748b..8798fce06 100755 --- a/src/InformaticsGateway/nlog.config +++ b/src/InformaticsGateway/nlog.config @@ -51,6 +51,7 @@ limitations under the License. + diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json old mode 100644 new mode 100755 diff --git a/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/MigrationManager.cs b/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/MigrationManager.cs old mode 100644 new mode 100755 index a8116c360..b5f617a8a --- a/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/MigrationManager.cs +++ b/src/Plug-ins/RemoteAppExecution/Database/EntityFramework/MigrationManager.cs @@ -37,7 +37,7 @@ public IHost Migrate(IHost host) catch (Exception ex) { var logger = scope.ServiceProvider.GetService(); - logger?.Log(LogLevel.Critical, "Failed to migrate database", ex); + logger?.Log(LogLevel.Critical, message: "Failed to migrate database", exception: ex); throw; } } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json old mode 100644 new mode 100755 diff --git a/tests/Integration.Test/Common/DataProvider.cs b/tests/Integration.Test/Common/DataProvider.cs index cb609530b..2748a16a2 100755 --- a/tests/Integration.Test/Common/DataProvider.cs +++ b/tests/Integration.Test/Common/DataProvider.cs @@ -311,7 +311,8 @@ internal async Task GenerateHl7Messages(string version) var message = new HL7.Dotnetcore.Message(text); message.ParseMessage(); message.SetValue("MSH.10", file); - HL7Specs.Files[file] = message; + HL7Specs.Files[file] = new HL7.Dotnetcore.Message(message.SerializeMessage(false)); + HL7Specs.Files[file].ParseMessage(); } } } diff --git a/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs index be93a8bce..43394a042 100755 --- a/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/Hl7StepDefinitions.cs @@ -90,7 +90,6 @@ public async Task GivenAHLMessageThatIsExportedToTheTestHost() destination = await _informaticsGatewayClient.HL7Destinations.Create(new HL7DestinationEntity { Name = _dicomServer.FeatureScpAeTitle, - AeTitle = _dicomServer.FeatureScpAeTitle, HostIp = _hl7SendAddress, Port = _hl7Port }, CancellationToken.None); @@ -219,7 +218,7 @@ public async Task ThenEnsureThatExportcompleteMessagesAreSentWithSuscess(string private async Task SendAcknowledgment(NetworkStream networkStream, HL7.Dotnetcore.Message message, CancellationToken cancellationToken) { if (message == null) { return; } - var ackMessage = message.GetACK(); + var ackMessage = message.GetACK(true); var ackData = new ReadOnlyMemory(ackMessage.GetMLLP()); { try diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index 8e3d304b6..fd766a497 100755 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -27,18 +27,20 @@ } }, "ConnectionStrings": { - "Type": "mongodb", - "InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", - "DatabaseOptions": { - "DatabaseName": "InformaticsGateway", - "retries": { - "delays": [ - "750", - "1201", - "2500" - ] - } - } + //"Type": "mongodb", + //"InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", + //"DatabaseOptions": { + // "DatabaseName": "InformaticsGateway", + // "retries": { + // "delays": [ + // "750", + // "1201", + // "2500" + // ] + // } + //}, + "Type": "sqlite", + "InformaticsGatewayDatabase": "Data Source=./mig.db" }, "InformaticsGateway": { "dicom": { diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json old mode 100644 new mode 100755 From 8236618ed9d9427078e6b623e61fff97ea477249 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 18 Jan 2024 16:34:02 +0000 Subject: [PATCH 67/75] revert appsettings Signed-off-by: Neil South --- tests/Integration.Test/appsettings.json | 26 ++++++++++++------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index fd766a497..8e3d304b6 100755 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -27,20 +27,18 @@ } }, "ConnectionStrings": { - //"Type": "mongodb", - //"InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", - //"DatabaseOptions": { - // "DatabaseName": "InformaticsGateway", - // "retries": { - // "delays": [ - // "750", - // "1201", - // "2500" - // ] - // } - //}, - "Type": "sqlite", - "InformaticsGatewayDatabase": "Data Source=./mig.db" + "Type": "mongodb", + "InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", + "DatabaseOptions": { + "DatabaseName": "InformaticsGateway", + "retries": { + "delays": [ + "750", + "1201", + "2500" + ] + } + } }, "InformaticsGateway": { "dicom": { From 2e19fec05efbe1135e702fe1f1d8b6667a9fe3d9 Mon Sep 17 00:00:00 2001 From: Neil South Date: Thu, 18 Jan 2024 17:11:07 +0000 Subject: [PATCH 68/75] clean up roslyn warnings Signed-off-by: Neil South --- src/Api/Models/BaseApplicationEntity.cs | 1 - .../Models/DestinationApplicationEntity.cs | 5 +++++ src/Api/SourceApplicationEntity.cs | 5 +++++ src/Api/Storage/Payload.cs | 2 +- src/Database/DatabaseMigrationManager.cs | 2 +- .../Migrations/20221116172042_R3_0.3.4.cs | 7 +++++-- .../20231204113501_Hl7DEstinationAndConfig.cs | 4 +++- .../20240118154616_MinorModelChanges.cs | 7 +++++-- .../Logging/Log.5000.DataPlugins.cs | 4 ++++ .../Logging/Log.700.PayloadService.cs | 3 +++ .../Logging/Log.800.Hl7Service.cs | 3 +++ .../Services/Common/InputDataPluginEngine.cs | 19 ++++++----------- .../Common/InputHL7DataPlugInEngine.cs | 21 +++++++------------ .../PayloadNotificationActionHandler.cs | 2 +- .../Services/Export/Hl7ExportService.cs | 3 +-- .../Services/HealthLevel7/MllpService.cs | 11 ++++------ .../Migrations/20230818161328_R4_0.4.0.cs | 7 +++++-- 17 files changed, 59 insertions(+), 47 deletions(-) mode change 100644 => 100755 src/Database/EntityFramework/Migrations/20221116172042_R3_0.3.4.cs mode change 100644 => 100755 src/Plug-ins/RemoteAppExecution/Migrations/20230818161328_R4_0.4.0.cs diff --git a/src/Api/Models/BaseApplicationEntity.cs b/src/Api/Models/BaseApplicationEntity.cs index d9998795b..71e01fb52 100755 --- a/src/Api/Models/BaseApplicationEntity.cs +++ b/src/Api/Models/BaseApplicationEntity.cs @@ -58,7 +58,6 @@ public class BaseApplicationEntity : MongoDBEntityBase public BaseApplicationEntity() { - SetDefaultValues(); } public virtual void SetDefaultValues() diff --git a/src/Api/Models/DestinationApplicationEntity.cs b/src/Api/Models/DestinationApplicationEntity.cs index 6ad00ac05..f1fefd3b7 100755 --- a/src/Api/Models/DestinationApplicationEntity.cs +++ b/src/Api/Models/DestinationApplicationEntity.cs @@ -32,6 +32,11 @@ namespace Monai.Deploy.InformaticsGateway.Api.Models /// public class DestinationApplicationEntity : BaseApplicationEntity { + public DestinationApplicationEntity() : base() + { + SetDefaultValues(); + } + /// /// Gets or sets the port to connect to. /// diff --git a/src/Api/SourceApplicationEntity.cs b/src/Api/SourceApplicationEntity.cs index 09edd983f..360854848 100755 --- a/src/Api/SourceApplicationEntity.cs +++ b/src/Api/SourceApplicationEntity.cs @@ -33,6 +33,11 @@ namespace Monai.Deploy.InformaticsGateway.Api /// public class SourceApplicationEntity : BaseApplicationEntity { + public SourceApplicationEntity() : base() + { + SetDefaultValues(); + } + /// /// Gets or sets the AE Title (AET) used to identify itself in a DICOM association. /// diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs index b09575441..46115f63e 100755 --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -106,7 +106,7 @@ public Payload(string key, string correlationId, string? workflowInstanceId, str DataTrigger = dataTrigger; } - public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId = null) : + public Payload(string key, string correlationId, string? workflowInstanceId, string? taskId, DataOrigin dataTrigger, uint timeout, string? payloadId) : this(key, correlationId, workflowInstanceId, taskId, dataTrigger, timeout) { Guard.Against.NullOrWhiteSpace(key, nameof(key)); diff --git a/src/Database/DatabaseMigrationManager.cs b/src/Database/DatabaseMigrationManager.cs index 72acb2cd8..2a81aa1e5 100755 --- a/src/Database/DatabaseMigrationManager.cs +++ b/src/Database/DatabaseMigrationManager.cs @@ -68,7 +68,7 @@ private static Type[] FindMatchingTypesFromAssemblies(Assembly[] assemblies) } } - return matchingTypes.ToArray(); + return [.. matchingTypes]; } } } diff --git a/src/Database/EntityFramework/Migrations/20221116172042_R3_0.3.4.cs b/src/Database/EntityFramework/Migrations/20221116172042_R3_0.3.4.cs old mode 100644 new mode 100755 index f3159c1ce..edb12d348 --- a/src/Database/EntityFramework/Migrations/20221116172042_R3_0.3.4.cs +++ b/src/Database/EntityFramework/Migrations/20221116172042_R3_0.3.4.cs @@ -6,6 +6,9 @@ namespace Monai.Deploy.InformaticsGateway.Database.Migrations { public partial class R3_034 : Migration { + private static readonly string[] StorageMetadataWrapperEntitiesColumns = ["CorrelationId", "Identity"]; + private static readonly string[] StorageMetadataWrapperColumns = ["CorrelationId", "Identity"]; + protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( @@ -87,7 +90,7 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_storagemetadata_ids", table: "StorageMetadataWrapperEntities", - columns: new[] { "CorrelationId", "Identity" }); + columns: StorageMetadataWrapperEntitiesColumns); migrationBuilder.CreateIndex( name: "idx_storagemetadata_uploaded", @@ -166,7 +169,7 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_storagemetadata_ids", table: "StorageMetadataWrapper", - columns: new[] { "CorrelationId", "Identity" }); + columns: StorageMetadataWrapperColumns); migrationBuilder.CreateIndex( name: "idx_storagemetadata_uploaded", diff --git a/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs index d23d89c28..988279f07 100755 --- a/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs +++ b/src/Database/EntityFramework/Migrations/20231204113501_Hl7DEstinationAndConfig.cs @@ -7,6 +7,8 @@ namespace Monai.Deploy.InformaticsGateway.Database.Migrations { public partial class Hl7DEstinationAndConfig : Migration { + private static readonly string[] HL7DestinationEntitiesColumns = ["Name", "AeTitle", "HostIp", "Port"]; + protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( @@ -58,7 +60,7 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_source_all_HL7Destination", table: "HL7DestinationEntities", - columns: new[] { "Name", "AeTitle", "HostIp", "Port" }, + columns: HL7DestinationEntitiesColumns, unique: true); } diff --git a/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs b/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs index 54c70839f..87b516469 100755 --- a/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs +++ b/src/Database/EntityFramework/Migrations/20240118154616_MinorModelChanges.cs @@ -25,10 +25,13 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_source_all_HL7Destination", table: "HL7DestinationEntities", - columns: new[] { "Name", "HostIp", "Port" }, + columns: NewColumns, unique: true); } + private static readonly string[] OldColumns = ["Name", "AeTitle", "HostIp", "Port"]; + private static readonly string[] NewColumns = ["Name", "HostIp", "Port"]; + /// protected override void Down(MigrationBuilder migrationBuilder) { @@ -53,7 +56,7 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_source_all_HL7Destination", table: "HL7DestinationEntities", - columns: new[] { "Name", "AeTitle", "HostIp", "Port" }, + columns: OldColumns, unique: true); } } diff --git a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs index 0dbfd93ff..ecf6589d3 100755 --- a/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs +++ b/src/InformaticsGateway/Logging/Log.5000.DataPlugins.cs @@ -44,5 +44,9 @@ public static partial class Log [LoggerMessage(EventId = 5007, Level = LogLevel.Error, Message = "Error executing plug-in: {plugin}.")] public static partial void ErrorAddingOutputDataPlugIn(this ILogger logger, Exception d, string plugin); + + [LoggerMessage(EventId = 5008, Level = LogLevel.Trace, Message = "InputDataPlugInEngine: {pluginName} executed. fileMetadata now: {fileMetadata}")] + public static partial void ExecutedInputDataPlugIn(this ILogger logger, string pluginName, string fileMetadata); + } } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs index 0b926a413..37b1e5cc0 100755 --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -163,5 +163,8 @@ public static partial class Log [LoggerMessage(EventId = 752, Level = LogLevel.Debug, Message = "Payload in Notification handler {payloadId}.")] public static partial void PayloadNotifyAsync(this ILogger logger, string payloadId); + + [LoggerMessage(EventId = 753, Level = LogLevel.Trace, Message = "Adding files to ArtifactsReceivedEvent files {payload}")] + public static partial void AddingFilesToArtifactsReceivedEvent(this ILogger logger, string payload); } } diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs index b207d5f87..bc7ef1cdd 100755 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -114,5 +114,8 @@ public static partial class Log [LoggerMessage(EventId = 830, Level = LogLevel.Error, Message = "Error generating HL7 acknowledgment. for message {message}")] public static partial void ErrorGeneratingHl7Acknowledgment(this ILogger logger, Exception ex, string message); + [LoggerMessage(EventId = 831, Level = LogLevel.Trace, Message = "HL7 message after plug-in processing: {message} correlationId: {CorrelationId}")] + public static partial void HL7MessageAfterPluginProcessing(this ILogger logger, string message, string CorrelationId); + } } diff --git a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs index ea77b42b3..cbc93711c 100755 --- a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs @@ -16,7 +16,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text.Json; using System.Threading.Tasks; using FellowOakDicom; @@ -28,18 +27,12 @@ namespace Monai.Deploy.InformaticsGateway.Services.Common { - internal class InputDataPlugInEngine : IInputDataPlugInEngine + internal class InputDataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) : IInputDataPlugInEngine { - private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); + private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); private IReadOnlyList? _plugins; - public InputDataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) - { - _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - public void Configure(IReadOnlyList pluginAssemblies) { _plugins = LoadPlugIns(_serviceProvider, pluginAssemblies); @@ -57,13 +50,13 @@ public async Task> ExecutePlugInsAsync(Dic _logger.ExecutingInputDataPlugIn(plugin.Name); (dicomFile, fileMetadata) = await plugin.ExecuteAsync(dicomFile, fileMetadata).ConfigureAwait(false); - _logger.LogTrace($"InputDataPlugInEngine: {plugin.Name} executed. fileMetadata now: {JsonSerializer.Serialize(fileMetadata)}"); + _logger.ExecutedInputDataPlugIn(plugin.Name, JsonSerializer.Serialize(fileMetadata)); } return new Tuple(dicomFile, fileMetadata); } - private IReadOnlyList LoadPlugIns(IServiceProvider serviceProvider, IReadOnlyList pluginAssemblies) + private List LoadPlugIns(IServiceProvider serviceProvider, IReadOnlyList pluginAssemblies) { var exceptions = new List(); var list = new List(); @@ -80,7 +73,7 @@ private IReadOnlyList LoadPlugIns(IServiceProvider serviceProv } } - if (exceptions.Any()) + if (exceptions.Count is not 0) { throw new AggregateException("Error loading plug-in(s).", exceptions); } diff --git a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs index 6f7f1d7bf..afd858c9d 100755 --- a/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs +++ b/src/InformaticsGateway/Services/Common/InputHL7DataPlugInEngine.cs @@ -16,7 +16,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using HL7.Dotnetcore; using Microsoft.Extensions.Logging; @@ -28,18 +27,12 @@ namespace Monai.Deploy.InformaticsGateway.Services.Common { - public class InputHL7DataPlugInEngine : IInputHL7DataPlugInEngine + public class InputHL7DataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) : IInputHL7DataPlugInEngine { - private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); + private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); private IReadOnlyList? _plugsins; - public InputHL7DataPlugInEngine(IServiceProvider serviceProvider, ILogger logger) - { - _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - public void Configure(IReadOnlyList pluginAssemblies) { _plugsins = LoadPlugIns(_serviceProvider, pluginAssemblies); @@ -47,7 +40,7 @@ public void Configure(IReadOnlyList pluginAssemblies) public async Task> ExecutePlugInsAsync(Message hl7File, FileStorageMetadata fileMetadata, Hl7ApplicationConfigEntity? configItem) { - if (configItem?.PlugInAssemblies is not null && configItem.PlugInAssemblies.Any()) + if (configItem?.PlugInAssemblies is not null && configItem.PlugInAssemblies.Count is not 0) { if (_plugsins == null) { @@ -56,7 +49,7 @@ public async Task> ExecutePlugInsAsync(Messa foreach (var plugin in _plugsins) { - if (configItem is not null && configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) + if (configItem.PlugInAssemblies.Exists(a => a.StartsWith(plugin.ToString()!))) { _logger.ExecutingInputDataPlugIn(plugin.Name); (hl7File, fileMetadata) = await plugin.ExecuteAsync(hl7File, fileMetadata).ConfigureAwait(false); @@ -66,7 +59,7 @@ public async Task> ExecutePlugInsAsync(Messa return new Tuple(hl7File, fileMetadata); } - private IReadOnlyList LoadPlugIns(IServiceProvider serviceProvider, IReadOnlyList pluginAssemblies) + private List LoadPlugIns(IServiceProvider serviceProvider, IReadOnlyList pluginAssemblies) { var exceptions = new List(); var list = new List(); @@ -83,7 +76,7 @@ private IReadOnlyList LoadPlugIns(IServiceProvider serviceP } } - if (exceptions.Any()) + if (exceptions.Count is not 0) { throw new AggregateException("Error loading plug-in(s).", exceptions); } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index cae010ecf..76d021175 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -170,7 +170,7 @@ private async Task SendArtifactRecievedEvent(Payload payload) }; artifiactRecievedEvent.DataOrigins.AddRange(payload.DataOrigins); - _logger.LogTrace($"Adding files to ArtifactsReceivedEvent files {JsonSerializer.Serialize(payload)}"); + _logger.AddingFilesToArtifactsReceivedEvent(JsonSerializer.Serialize(payload)); artifiactRecievedEvent.Artifacts = payload.Files.Select(f => new Artifact { Type = f.DataOrigin.ArtifactType, Path = f.File.UploadPath }).ToList(); diff --git a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs index 1acf2f17e..4e6e7ba47 100755 --- a/src/InformaticsGateway/Services/Export/Hl7ExportService.cs +++ b/src/InformaticsGateway/Services/Export/Hl7ExportService.cs @@ -31,7 +31,6 @@ using Monai.Deploy.InformaticsGateway.Api.Mllp; using Monai.Deploy.Messaging.Common; using Polly; -using System.Linq; namespace Monai.Deploy.InformaticsGateway.Services.Export { @@ -120,7 +119,7 @@ private async Task ExecuteHl7Export( .ExecuteAsync(async () => { await _mllpService.SendMllp( - Dns.GetHostAddresses(destination.HostIp).First(), + Dns.GetHostAddresses(destination.HostIp)[0], destination.Port, Encoding.UTF8.GetString(exportRequestData.FileContent), cancellationToken ).ConfigureAwait(false); diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 1ee3d0a9b..5adcf2b0e 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -79,10 +79,7 @@ public int ActiveConnections public MllpService(IServiceScopeFactory serviceScopeFactory, IOptions configuration) { - if (serviceScopeFactory is null) - { - throw new ArgumentNullException(nameof(serviceScopeFactory)); - } + ArgumentNullException.ThrowIfNull(serviceScopeFactory, nameof(serviceScopeFactory)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); @@ -193,7 +190,7 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) await _inputHL7DataPlugInEngine.ExecutePlugInsAsync(message, hl7Filemetadata, configItem).ConfigureAwait(false); newMessage = await _mIIpExtract.ExtractInfo(hl7Filemetadata, message, configItem).ConfigureAwait(false); - _logger.LogTrace($"HL7 message after plug-in processing: {newMessage.HL7Message} correlationId: {hl7Filemetadata.CorrelationId}"); + _logger.HL7MessageAfterPluginProcessing(newMessage.HL7Message, hl7Filemetadata.CorrelationId); } _logger.Hl7MessageReceieved(newMessage.HL7Message); await hl7Filemetadata.SetDataStream(newMessage.HL7Message, _configuration.Value.Storage.TemporaryDataStorage, _fileSystem, _configuration.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); @@ -217,7 +214,7 @@ private async Task OnDisconnect(IMllpClient client, MllpClientResult result) private async Task ConfigurePlugInEngine() { var configs = await _hl7ApplicationConfigRepository.GetAllAsync().ConfigureAwait(false); - if (configs is not null && configs.Any() && configs.Max(c => c.LastModified) > _lastConfigRead) + if (configs is not null && configs.Count is not 0 && configs.Max(c => c.LastModified) > _lastConfigRead) { var pluginAssemblies = new List(); foreach (var config in configs.Where(p => p.PlugInAssemblies?.Count > 0)) @@ -231,7 +228,7 @@ private async Task ConfigurePlugInEngine() _logger.HL7PluginLoadingExceptions(ex); } } - if (pluginAssemblies.Any()) + if (pluginAssemblies.Count is not 0) { _inputHL7DataPlugInEngine.Configure(pluginAssemblies); } diff --git a/src/Plug-ins/RemoteAppExecution/Migrations/20230818161328_R4_0.4.0.cs b/src/Plug-ins/RemoteAppExecution/Migrations/20230818161328_R4_0.4.0.cs old mode 100644 new mode 100755 index 1ff6d3487..60d1e7d4e --- a/src/Plug-ins/RemoteAppExecution/Migrations/20230818161328_R4_0.4.0.cs +++ b/src/Plug-ins/RemoteAppExecution/Migrations/20230818161328_R4_0.4.0.cs @@ -6,6 +6,9 @@ namespace Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.Migrations { public partial class R4_040 : Migration { + private static readonly string[] Columns = ["WorkflowInstanceId", "ExportTaskId", "StudyInstanceUid"]; + private static readonly string[] StudyColumns = ["WorkflowInstanceId", "ExportTaskId", "StudyInstanceUid", "SeriesInstanceUid"]; + protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( @@ -30,7 +33,7 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_remoteapp_all", table: "RemoteAppExecutions", - columns: new[] { "WorkflowInstanceId", "ExportTaskId", "StudyInstanceUid", "SeriesInstanceUid" }); + columns: StudyColumns); migrationBuilder.CreateIndex( name: "idx_remoteapp_instance", @@ -40,7 +43,7 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.CreateIndex( name: "idx_remoteapp_study", table: "RemoteAppExecutions", - columns: new[] { "WorkflowInstanceId", "ExportTaskId", "StudyInstanceUid" }); + columns: Columns); } protected override void Down(MigrationBuilder migrationBuilder) From ff173a0cf354372b7c8ac05749c4119345f00dd4 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 19 Jan 2024 15:01:20 +0000 Subject: [PATCH 69/75] improve consistancy Signed-off-by: Neil South --- src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs index fca6db392..bc871763f 100755 --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -231,7 +231,7 @@ private async Task ValidateCreateAsync(MonaiApplicationEntity item) { throw new ObjectExistsException($"A MONAI Application Entity with the same AE Title '{item.AeTitle}' already exists."); } - if (item.IgnoredSopClasses.Count != 0 && item.AllowedSopClasses.Count != 0) + if (item.IgnoredSopClasses.Count != 0 && item.AllowedSopClasses.Count is not 0) { throw new ConfigurationException($"Cannot specify both allowed and ignored SOP classes at the same time, they are mutually exclusive."); } From a8a0be6f8f0ab848fd53399a69de3349e7c28b6b Mon Sep 17 00:00:00 2001 From: Neil South Date: Wed, 13 Mar 2024 09:24:49 +0000 Subject: [PATCH 70/75] update messaging packages and package scanning Signed-off-by: Neil South --- .dockleignore | 17 ++++++++++ .github/workflows/ci.yml | 25 +++++++++++---- Dockerfile | 10 ++++-- doc/dependency_decisions.yml | 6 ++-- ...Monai.Deploy.InformaticsGateway.Api.csproj | 4 +-- src/Api/Test/packages.lock.json | 26 +++++++-------- src/Api/packages.lock.json | 32 +++++++++---------- src/CLI/Test/packages.lock.json | 26 +++++++-------- src/CLI/packages.lock.json | 32 +++++++++---------- src/Client.Common/packages.lock.json | 6 ++-- src/Client/Test/packages.lock.json | 18 +++++------ src/Client/packages.lock.json | 26 +++++++-------- src/Common/packages.lock.json | 6 ++-- src/Configuration/Test/packages.lock.json | 26 +++++++-------- src/Configuration/packages.lock.json | 32 +++++++++---------- src/Database/Api/Test/packages.lock.json | 26 +++++++-------- src/Database/Api/packages.lock.json | 26 +++++++-------- .../EntityFramework/Test/packages.lock.json | 16 +++++----- .../EntityFramework/packages.lock.json | 16 +++++----- .../Integration.Test/packages.lock.json | 16 +++++----- src/Database/MongoDB/packages.lock.json | 16 +++++----- src/Database/packages.lock.json | 16 +++++----- src/DicomWebClient/CLI/packages.lock.json | 6 ++-- src/DicomWebClient/packages.lock.json | 6 ++-- .../Monai.Deploy.InformaticsGateway.csproj | 2 +- .../Test/packages.lock.json | 18 +++++------ src/InformaticsGateway/appsettings.json | 3 +- src/InformaticsGateway/packages.lock.json | 18 +++++------ .../Test/packages.lock.json | 16 +++++----- .../RemoteAppExecution/packages.lock.json | 16 +++++----- ...InformaticsGateway.Integration.Test.csproj | 2 +- tests/Integration.Test/packages.lock.json | 20 ++++++------ 32 files changed, 285 insertions(+), 246 deletions(-) create mode 100755 .dockleignore diff --git a/.dockleignore b/.dockleignore new file mode 100755 index 000000000..6f539e2d0 --- /dev/null +++ b/.dockleignore @@ -0,0 +1,17 @@ +# Copyright 2023 MONAI Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Checked and no actual secrets found in dockerfile, just some environment variables for compatibility +CIS-DI-0010 + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02f541a49..f050fd358 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -433,13 +433,26 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - - name: Scan image with Azure Container Scan - env: - TRIVY_TIMEOUT_SEC: 360s - uses: Azure/container-scan@v0.1 + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master if: ${{ (matrix.os == 'ubuntu-latest') }} with: - image-name: ${{ fromJSON(steps.meta.outputs.json).tags[0] }} + image-ref: ${{ fromJSON(steps.meta.outputs.json).tags[0] }} + format: 'table' + exit-code: '1' + ignore-unfixed: true + vuln-type: 'os,library' + severity: 'CRITICAL' + + - name: Run dockle scan + id: dockle-scan + uses: goodwithtech/dockle-action@main + if: ${{ (matrix.os == 'ubuntu-latest') }} + with: + image: ${{ fromJSON(steps.meta.outputs.json).tags[0] }} + format: 'list' + exit-code: '1' + exit-level: 'warn' - name: Anchore container scan id: anchore-scan @@ -450,7 +463,7 @@ jobs: fail-build: true severity-cutoff: critical - - name: Upload Anchore scan SARIF report + - name: Upload scan SARIF report uses: github/codeql-action/upload-sarif@v2 if: ${{ (matrix.os == 'ubuntu-latest') }} with: diff --git a/Dockerfile b/Dockerfile index 290786bc3..92d6088cc 100755 --- a/Dockerfile +++ b/Dockerfile @@ -27,6 +27,7 @@ RUN dotnet publish -c Release -o out --nologo src/InformaticsGateway/Monai.Deplo # Build runtime image FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy +RUN adduser --system --group --no-create-home appuser # Enable elastic client compatibility mode ENV ELASTIC_CLIENT_APIVERSIONING=true @@ -35,13 +36,16 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean \ && apt-get update \ && apt-get install -y --no-install-recommends curl \ - && apt-get install -y libc6-dev=2.35-0ubuntu3.6 # this is a workaround for Mongo encryption library -RUN rm -rf /var/lib/apt/lists + && apt-get install -y libc6-dev=2.35-0ubuntu3.6 \ + && rm -rf /var/lib/apt/lists # this is a workaround for Mongo encryption library + WORKDIR /opt/monai/ig +RUN chown -R appuser:appuser /opt/monai/ig + COPY --from=build /app/out . COPY --from=build /tools /opt/dotnetcore-tools COPY LICENSE ./ @@ -58,4 +62,6 @@ HEALTHCHECK --interval=10s --retries=10 CMD curl --fail http://localhost:5000/he RUN ls -lR /opt/monai/ig ENV PATH="/opt/dotnetcore-tools:${PATH}" +USER appuser + ENTRYPOINT ["/opt/monai/ig/Monai.Deploy.InformaticsGateway"] diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 08658c61e..73898a2b2 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -584,6 +584,8 @@ - :versions: - 8.0.0 - 8.0.1 + - 8.0.2 + - 8.0.3 :when: 2022-10-14T23:37:16.793Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -660,14 +662,14 @@ - - :approve - Monai.Deploy.Messaging - :versions: - - 2.0.0 + - 2.0.2 :when: 2023-10-13T18:06:21.511Z :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) - - :approve - Monai.Deploy.Messaging.RabbitMQ - :versions: - - 2.0.0 + - 2.0.2 :when: 2023-10-13T18:06:21.511Z :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index decb9f648..8757d6ee4 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -51,8 +51,8 @@ - - + + diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json index 9cef73554..e451e3e12 100755 --- a/src/Api/Test/packages.lock.json +++ b/src/Api/Test/packages.lock.json @@ -266,8 +266,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -277,11 +277,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -368,16 +368,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -1326,8 +1326,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 9157d20a7..9f802a733 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -41,15 +41,15 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" }, "Monai.Deploy.Messaging": { "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "requested": "[2.0.2, )", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -59,12 +59,12 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "requested": "[2.0.2, )", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -231,16 +231,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json index f9112e2b8..ae04501b2 100755 --- a/src/CLI/Test/packages.lock.json +++ b/src/CLI/Test/packages.lock.json @@ -523,8 +523,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -534,11 +534,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -625,16 +625,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -1618,8 +1618,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 99b5fa94b..6e50dd3f1 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -35,9 +35,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" }, "System.CommandLine.Hosting": { "type": "Direct", @@ -431,8 +431,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -442,11 +442,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -477,16 +477,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -599,8 +599,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json index 522b24810..6e81c4471 100755 --- a/src/Client.Common/packages.lock.json +++ b/src/Client.Common/packages.lock.json @@ -10,9 +10,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" } } } diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json index caa8320da..2b0f99af8 100755 --- a/src/Client/Test/packages.lock.json +++ b/src/Client/Test/packages.lock.json @@ -630,8 +630,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -641,11 +641,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -1964,7 +1964,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Security": "[1.0.0, )", "Monai.Deploy.Storage.MinIO": "[1.0.0, )", "NLog.Web.AspNetCore": "[5.3.8, )", @@ -1978,8 +1978,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json index c63fe30fe..40fad1c86 100755 --- a/src/Client/packages.lock.json +++ b/src/Client/packages.lock.json @@ -172,8 +172,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -183,11 +183,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -218,16 +218,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -317,8 +317,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json index ae98eff94..404c566b1 100755 --- a/src/Common/packages.lock.json +++ b/src/Common/packages.lock.json @@ -10,9 +10,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" }, "System.IO.Abstractions": { "type": "Direct", diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json index 6fc0fc65b..4d5d0efc7 100755 --- a/src/Configuration/Test/packages.lock.json +++ b/src/Configuration/Test/packages.lock.json @@ -274,8 +274,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -285,11 +285,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -376,16 +376,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -1339,8 +1339,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index 0fd6efb84..23da4756f 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -4,9 +4,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" }, "Ardalis.GuardClauses": { "type": "Transitive", @@ -178,8 +178,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -189,11 +189,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -224,16 +224,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -323,8 +323,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json index c5dc274b1..140900d6f 100755 --- a/src/Database/Api/Test/packages.lock.json +++ b/src/Database/Api/Test/packages.lock.json @@ -248,8 +248,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -259,11 +259,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -355,16 +355,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -1304,8 +1304,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json index b607ea4df..c70d0ce4b 100755 --- a/src/Database/Api/packages.lock.json +++ b/src/Database/Api/packages.lock.json @@ -178,8 +178,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -189,11 +189,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -224,16 +224,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==" + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==" }, "RabbitMQ.Client": { "type": "Transitive", @@ -323,8 +323,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json index 077ca41d7..c172f5f6b 100755 --- a/src/Database/EntityFramework/Test/packages.lock.json +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -466,8 +466,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -477,11 +477,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -1630,8 +1630,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json index 11432aa9c..b037416b6 100755 --- a/src/Database/EntityFramework/packages.lock.json +++ b/src/Database/EntityFramework/packages.lock.json @@ -378,8 +378,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -389,11 +389,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -628,8 +628,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/MongoDB/Integration.Test/packages.lock.json b/src/Database/MongoDB/Integration.Test/packages.lock.json index d0d9f2827..ddfcb6d4c 100755 --- a/src/Database/MongoDB/Integration.Test/packages.lock.json +++ b/src/Database/MongoDB/Integration.Test/packages.lock.json @@ -291,8 +291,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -302,11 +302,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -1435,8 +1435,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json index db32e7c3b..3febb5c82 100755 --- a/src/Database/MongoDB/packages.lock.json +++ b/src/Database/MongoDB/packages.lock.json @@ -215,8 +215,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -226,11 +226,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -416,8 +416,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json index 69b309a28..b30153eae 100755 --- a/src/Database/packages.lock.json +++ b/src/Database/packages.lock.json @@ -437,8 +437,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -448,11 +448,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -765,8 +765,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json index 43be542c2..d760f67b2 100755 --- a/src/DicomWebClient/CLI/packages.lock.json +++ b/src/DicomWebClient/CLI/packages.lock.json @@ -14,9 +14,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json index 1aa43eba1..42d25d4bf 100755 --- a/src/DicomWebClient/packages.lock.json +++ b/src/DicomWebClient/packages.lock.json @@ -23,9 +23,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "ADdJXuKNjwZDfBmybMnpvwd5CK3gp92WkWqqeQhW4W+q4MO3Qaa9QyW2DcFLAvCDMcCWxT5hRXqGdv13oon7nA==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index be9a5f7f0..f9718d6a5 100755 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -35,7 +35,7 @@ - + diff --git a/src/InformaticsGateway/Test/packages.lock.json b/src/InformaticsGateway/Test/packages.lock.json index 4fd6571e0..d93c12041 100755 --- a/src/InformaticsGateway/Test/packages.lock.json +++ b/src/InformaticsGateway/Test/packages.lock.json @@ -648,8 +648,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -659,11 +659,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -1991,7 +1991,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Security": "[1.0.0, )", "Monai.Deploy.Storage.MinIO": "[1.0.0, )", "NLog.Web.AspNetCore": "[5.3.8, )", @@ -2005,8 +2005,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/InformaticsGateway/appsettings.json b/src/InformaticsGateway/appsettings.json index 61dc5b0dc..d2ff91fc9 100755 --- a/src/InformaticsGateway/appsettings.json +++ b/src/InformaticsGateway/appsettings.json @@ -85,7 +85,8 @@ "exchange": "monaideploy", "deadLetterExchange": "monaideploy-dead-letter", "deliveryLimit": 3, - "requeueDelay": 30 + "requeueDelay": 3, + "prefetchCount": "5" }, "topics": { "externalAppRequest": "md.externalapp.request", diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json index fa41553f7..777567aae 100755 --- a/src/InformaticsGateway/packages.lock.json +++ b/src/InformaticsGateway/packages.lock.json @@ -33,12 +33,12 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "requested": "[2.0.2, )", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -603,8 +603,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -971,8 +971,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json index 993b5cab1..376f4f8ae 100755 --- a/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/Test/packages.lock.json @@ -523,8 +523,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -534,11 +534,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -1766,8 +1766,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json index a6edc2064..889bd59e1 100755 --- a/src/Plug-ins/RemoteAppExecution/packages.lock.json +++ b/src/Plug-ins/RemoteAppExecution/packages.lock.json @@ -441,8 +441,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -452,11 +452,11 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -745,8 +745,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index 1ee43297f..403d1b3db 100755 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -29,7 +29,7 @@ - + diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json index 9561bfb0d..768674565 100755 --- a/tests/Integration.Test/packages.lock.json +++ b/tests/Integration.Test/packages.lock.json @@ -131,12 +131,12 @@ }, "Monai.Deploy.Messaging.RabbitMQ": { "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "J5dXjOBqA59irTcFbfwxIQnLxUXGcMCA/cuk1+TJgscMeb2WTVks3esZmcs3pOY2OIBmOROvBl/6KaL9cYFPmg==", + "requested": "[2.0.2, )", + "resolved": "2.0.2", + "contentHash": "nrMwCJloWpOpPJaYvKJzZIWb3B0B5+Ktz4SP2NApbmreiEI88m9Gab+Q6GuwNvFB+nrtJFDAl/gtdHwV251rcw==", "dependencies": { - "Monai.Deploy.Messaging": "2.0.0", - "Polly": "8.2.0", + "Monai.Deploy.Messaging": "2.0.2", + "Polly": "8.2.1", "RabbitMQ.Client": "6.8.1" } }, @@ -740,8 +740,8 @@ }, "Monai.Deploy.Messaging": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "LcerCeHWDSB3Q1Vw0La9pYvXdNNDu4nGUie2bvVlL8lCkxbVNx+rtDorV5cA8KSKW9GZd/RD6SAsIzcjMXqP6Q==", + "resolved": "2.0.2", + "contentHash": "iQsD13BAnpbkv1xIVS4cRT2ZXjtcvHJFXlzvTaXjSEEtgGRR7f/IW/9smM2mZlPAyjmRdzk6hyye2vw6rl/tTw==", "dependencies": { "Ardalis.GuardClauses": "4.3.0", "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.0", @@ -2110,7 +2110,7 @@ "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "[1.0.0, )", "Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution": "[1.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Security": "[1.0.0, )", "Monai.Deploy.Storage.MinIO": "[1.0.0, )", "NLog.Web.AspNetCore": "[5.3.8, )", @@ -2124,8 +2124,8 @@ "Macross.Json.Extensions": "[3.0.0, )", "Microsoft.EntityFrameworkCore.Abstractions": "[8.0.0, )", "Monai.Deploy.InformaticsGateway.Common": "[1.0.0, )", - "Monai.Deploy.Messaging": "[2.0.0, )", - "Monai.Deploy.Messaging.RabbitMQ": "[2.0.0, )", + "Monai.Deploy.Messaging": "[2.0.2, )", + "Monai.Deploy.Messaging.RabbitMQ": "[2.0.2, )", "Monai.Deploy.Storage": "[1.0.0, )", "fo-dicom": "[5.1.2, )" } From e04840b104fd13dad72eb536120824157b66abe0 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 17 May 2024 09:24:13 +0100 Subject: [PATCH 71/75] fix for where hl7Config plugin is blank Signed-off-by: Neil South --- src/Api/packages.lock.json | 6 +-- src/CLI/packages.lock.json | 6 +-- src/Configuration/packages.lock.json | 6 +-- .../Services/HealthLevel7/MllpService.cs | 2 +- .../Services/HealthLevel7/MllpServiceTest.cs | 44 +++++++++++++++++++ 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json index 9f802a733..47fd15d1a 100755 --- a/src/Api/packages.lock.json +++ b/src/Api/packages.lock.json @@ -41,9 +41,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "0kwNg0LBIvVTx9A2mo9Mnw4wLGtaeQgjSz5P13bOOwdWPPLe9HzI+XTkwiMhS7iQCM6X4LAbFR76xScaMw0MrA==" }, "Monai.Deploy.Messaging": { "type": "Direct", diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json index 6e50dd3f1..845d522b5 100755 --- a/src/CLI/packages.lock.json +++ b/src/CLI/packages.lock.json @@ -35,9 +35,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "0kwNg0LBIvVTx9A2mo9Mnw4wLGtaeQgjSz5P13bOOwdWPPLe9HzI+XTkwiMhS7iQCM6X4LAbFR76xScaMw0MrA==" }, "System.CommandLine.Hosting": { "type": "Direct", diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json index 23da4756f..8706b6a3a 100755 --- a/src/Configuration/packages.lock.json +++ b/src/Configuration/packages.lock.json @@ -4,9 +4,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "hKTrehpfVzOhAz0mreaTAZgbz0DrMEbWq4n3hAo8Ks6WdxdqQhNPvzOqn9VygKuWf1bmxPdraqzTaXriO/sn0A==" + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "0kwNg0LBIvVTx9A2mo9Mnw4wLGtaeQgjSz5P13bOOwdWPPLe9HzI+XTkwiMhS7iQCM6X4LAbFR76xScaMw0MrA==" }, "Ardalis.GuardClauses": { "type": "Transitive", diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index 85a21aa72..c8163d6dc 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -220,7 +220,7 @@ private async Task ConfigurePlugInEngine() { try { - pluginAssemblies.AddRange(config.PlugInAssemblies.Where(p => pluginAssemblies.Contains(p) is false)); + pluginAssemblies.AddRange(config.PlugInAssemblies.Where(p => string.IsNullOrWhiteSpace(p) is false && pluginAssemblies.Contains(p) is false)); } catch (Exception ex) { diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 7c94b55e0..371e7ab69 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -366,5 +366,49 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _mIIpExtract.Verify(p => p.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(3)); } + + [RetryFact(10, 250)] + public async Task GivenATcpClientWithHl7Messages_ShouldntAdddBlankPlugin() + { + var checkEvent = new ManualResetEventSlim(); + var client = new Mock(); + _mIIpExtract.Setup(e => e.ExtractInfo(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync((Hl7FileStorageMetadata meta, Message Msg, Hl7ApplicationConfigEntity configItem) => Msg); + + _hl7ApplicationConfigRepository.Setup(p => p.GetAllAsync(It.IsAny())) + .ReturnsAsync(new List { new Hl7ApplicationConfigEntity { + PlugInAssemblies = [""] + } }); + + _mllpClientFactory.Setup(p => p.CreateClient(It.IsAny(), It.IsAny(), It.IsAny>())) + .Returns(() => + { + client.Setup(p => p.Start(It.IsAny>(), It.IsAny())) + .Callback, CancellationToken>((action, cancellationToken) => + { + var results = new MllpClientResult( + new List + { + new("") + }, null); + action(client.Object, results); + checkEvent.Set(); + _cancellationTokenSource.Cancel(); + }); + client.Setup(p => p.Dispose()); + client.SetupGet(p => p.ClientId).Returns(Guid.NewGuid()); + return client.Object; + }); + + _tcpListener.Setup(p => p.AcceptTcpClientAsync(It.IsAny())) + .Returns(ValueTask.FromResult((new Mock()).Object)); + + var service = new MllpService(_serviceScopeFactory.Object, _options); + _ = service.StartAsync(_cancellationTokenSource.Token); + + Assert.True(checkEvent.Wait(3000)); + await Task.Delay(500).ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext); + _hl7DataPlugInEngine.Verify(p => p.Configure(It.IsAny>()), Times.Never()); + } } } From 56f069a476338eba03dbe4070db9aa920a86e791 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 17 May 2024 09:53:07 +0100 Subject: [PATCH 72/75] update libc6-dev dependancy Signed-off-by: Neil South --- Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 92d6088cc..5101990be 100755 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy as build +FROM mcr.microsoft.com/dotnet/sdk:6.0-jammy as build # Install the tools RUN dotnet tool install --tool-path /tools dotnet-trace @@ -36,12 +36,9 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean \ && apt-get update \ && apt-get install -y --no-install-recommends curl \ - && apt-get install -y libc6-dev=2.35-0ubuntu3.6 \ + && apt-get install -y libc6-dev=2.35-0ubuntu3.7 \ && rm -rf /var/lib/apt/lists # this is a workaround for Mongo encryption library - - - WORKDIR /opt/monai/ig RUN chown -R appuser:appuser /opt/monai/ig From 15ffda8e1af07640927384e02d3230a38665f8b4 Mon Sep 17 00:00:00 2001 From: Neil South Date: Fri, 17 May 2024 11:38:20 +0100 Subject: [PATCH 73/75] fix up licence and dockerfile Signed-off-by: Neil South --- Dockerfile | 2 +- doc/dependency_decisions.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5101990be..49e657bd3 100755 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM mcr.microsoft.com/dotnet/sdk:6.0-jammy as build +FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy as build # Install the tools RUN dotnet tool install --tool-path /tools dotnet-trace diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 73898a2b2..d462230fd 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -586,6 +586,7 @@ - 8.0.1 - 8.0.2 - 8.0.3 + - 8.0.5 :when: 2022-10-14T23:37:16.793Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) From 9bc789b8d49d2cfd48062eadd03a0a6e8c076760 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 12 Jun 2024 13:20:09 -0700 Subject: [PATCH 74/75] Update dependencies (#513) * Update dependencies Signed-off-by: Victor Chang * Update licenses Signed-off-by: Victor Chang * Copy plug-ins for test Signed-off-by: Victor Chang * Remove windows-latest build Signed-off-by: Victor Chang * Fix Dockerfile dependency version Signed-off-by: Victor Chang * Revert back to skywalking-eyes 0.4.0 Signed-off-by: Victor Chang --------- Signed-off-by: Victor Chang --- .github/workflows/ci.yml | 34 +- Dockerfile | 2 +- doc/dependency_decisions.yml | 126 +- docker-compose/docker-compose.yml | 6 +- docs/changelog.md | 6 + docs/compliance/third-party-licenses.md | 1853 ++++++++++++++--- ...Monai.Deploy.InformaticsGateway.Api.csproj | 12 +- ....Deploy.InformaticsGateway.Api.Test.csproj | 10 +- src/Api/Test/packages.lock.json | 1094 +--------- src/Api/packages.lock.json | 128 +- ....Deploy.InformaticsGateway.CLI.Test.csproj | 12 +- src/CLI/Test/packages.lock.json | 1086 +--------- src/CLI/packages.lock.json | 130 +- ...oy.InformaticsGateway.Client.Common.csproj | 2 +- ...formaticsGateway.Client.Common.Test.csproj | 10 +- src/Client.Common/Test/packages.lock.json | 988 +-------- src/Client.Common/packages.lock.json | 12 +- ...ploy.InformaticsGateway.Client.Test.csproj | 8 +- src/Client/Test/packages.lock.json | 1297 ++---------- src/Client/packages.lock.json | 124 +- ...ai.Deploy.InformaticsGateway.Common.csproj | 4 +- ...ploy.InformaticsGateway.Common.Test.csproj | 12 +- src/Common/Test/packages.lock.json | 1024 +-------- src/Common/packages.lock.json | 32 +- ...formaticsGateway.Configuration.Test.csproj | 12 +- src/Configuration/Test/packages.lock.json | 1094 +--------- src/Configuration/packages.lock.json | 128 +- ...loy.InformaticsGateway.Database.Api.csproj | 2 +- ...nformaticsGateway.Database.Api.Test.csproj | 8 +- src/Database/Api/Test/packages.lock.json | 1084 +--------- src/Database/Api/packages.lock.json | 128 +- ...icsGateway.Database.EntityFramework.csproj | 8 +- ...teway.Database.EntityFramework.Test.csproj | 10 +- .../EntityFramework/Test/packages.lock.json | 1142 ++-------- .../EntityFramework/packages.lock.json | 178 +- ....Deploy.InformaticsGateway.Database.csproj | 6 +- ...y.Database.MongoDB.Integration.Test.csproj | 8 +- .../Integration.Test/packages.lock.json | 1109 ++-------- ...InformaticsGateway.Database.MongoDB.csproj | 4 +- src/Database/MongoDB/packages.lock.json | 158 +- src/Database/packages.lock.json | 234 +-- src/DicomWebClient/CLI/packages.lock.json | 12 +- ...rmaticsGateway.DicomWeb.Client.Test.csproj | 10 +- src/DicomWebClient/Test/packages.lock.json | 964 +-------- src/DicomWebClient/packages.lock.json | 12 +- .../Monai.Deploy.InformaticsGateway.csproj | 12 +- ...onai.Deploy.InformaticsGateway.Test.csproj | 12 +- .../Test/packages.lock.json | 1313 ++---------- src/InformaticsGateway/packages.lock.json | 346 +-- ...sGateway.PlugIns.RemoteAppExecution.csproj | 14 +- ...way.PlugIns.RemoteAppExecution.Test.csproj | 16 +- .../Test/packages.lock.json | 1189 ++--------- .../RemoteAppExecution/packages.lock.json | 210 +- ...InformaticsGateway.Integration.Test.csproj | 22 +- tests/Integration.Test/packages.lock.json | 780 ++----- 55 files changed, 4336 insertions(+), 13901 deletions(-) mode change 100755 => 100644 src/Api/Test/packages.lock.json mode change 100755 => 100644 src/Api/packages.lock.json mode change 100755 => 100644 src/CLI/Test/packages.lock.json mode change 100755 => 100644 src/CLI/packages.lock.json mode change 100755 => 100644 src/Client.Common/Test/packages.lock.json mode change 100755 => 100644 src/Client.Common/packages.lock.json mode change 100755 => 100644 src/Client/Test/packages.lock.json mode change 100755 => 100644 src/Client/packages.lock.json mode change 100755 => 100644 src/Common/Test/packages.lock.json mode change 100755 => 100644 src/Common/packages.lock.json mode change 100755 => 100644 src/Configuration/Test/packages.lock.json mode change 100755 => 100644 src/Configuration/packages.lock.json mode change 100755 => 100644 src/Database/Api/Test/packages.lock.json mode change 100755 => 100644 src/Database/Api/packages.lock.json mode change 100755 => 100644 src/Database/EntityFramework/Test/packages.lock.json mode change 100755 => 100644 src/Database/EntityFramework/packages.lock.json mode change 100755 => 100644 src/Database/MongoDB/Integration.Test/packages.lock.json mode change 100755 => 100644 src/Database/MongoDB/packages.lock.json mode change 100755 => 100644 src/Database/packages.lock.json mode change 100755 => 100644 src/DicomWebClient/CLI/packages.lock.json mode change 100755 => 100644 src/DicomWebClient/Test/packages.lock.json mode change 100755 => 100644 src/DicomWebClient/packages.lock.json mode change 100755 => 100644 src/InformaticsGateway/Test/packages.lock.json mode change 100755 => 100644 src/InformaticsGateway/packages.lock.json mode change 100755 => 100644 src/Plug-ins/RemoteAppExecution/Test/packages.lock.json mode change 100755 => 100644 src/Plug-ins/RemoteAppExecution/packages.lock.json mode change 100755 => 100644 tests/Integration.Test/packages.lock.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f050fd358..47ed9b252 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,7 +42,7 @@ jobs: nuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -82,7 +82,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -91,7 +91,7 @@ jobs: dotnet-version: "8.0.x" - name: Enable NuGet cache - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -123,7 +123,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -135,13 +135,13 @@ jobs: run: echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH - name: Install License Finder tool with Homebrew - uses: tecoli-com/actions-use-homebrew-tools@v1.1 + uses: tecoli-com/actions-use-homebrew-tools@v1.2 with: tools: licensefinder cache: yes - name: Enable NuGet cache - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -194,14 +194,14 @@ jobs: dotnet-version: "8.0.x" - name: Enable NuGet cache - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} restore-keys: | ${{ runner.os }}-nuget - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -264,7 +264,7 @@ jobs: DOTNET_TEST: ${{ matrix.database }} steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -273,7 +273,7 @@ jobs: dotnet-version: "8.0.x" - name: Enable NuGet cache - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -315,7 +315,7 @@ jobs: MAJORMINORPATCH: ${{ needs.calc-version.outputs.majorMinorPatch }} strategy: matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest] fail-fast: true outputs: @@ -329,7 +329,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -338,7 +338,7 @@ jobs: dotnet-version: "8.0.x" - name: Enable NuGet cache - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -481,7 +481,7 @@ jobs: env: SEMVER: ${{ needs.calc-version.outputs.semVer }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -490,7 +490,7 @@ jobs: dotnet-version: "8.0.x" - name: Enable NuGet cache - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -498,7 +498,7 @@ jobs: ${{ runner.os }}-nuget - name: Setup DocFX - uses: crazy-max/ghaction-chocolatey@v2 + uses: crazy-max/ghaction-chocolatey@v3 with: args: install docfx @@ -568,7 +568,7 @@ jobs: MAJORMINORPATCH: ${{ needs.calc-version.outputs.majorMinorPatch }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/Dockerfile b/Dockerfile index 49e657bd3..a92d87df0 100755 --- a/Dockerfile +++ b/Dockerfile @@ -36,7 +36,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean \ && apt-get update \ && apt-get install -y --no-install-recommends curl \ - && apt-get install -y libc6-dev=2.35-0ubuntu3.7 \ + && apt-get install -y libc6-dev=2.35-0ubuntu3.8 \ && rm -rf /var/lib/apt/lists # this is a workaround for Mongo encryption library WORKDIR /opt/monai/ig diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index d462230fd..d9608f850 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -2,7 +2,7 @@ - - :approve - AWSSDK.Core - :versions: - - 3.7.300.29 + - 3.7.304.15 :when: 2022-08-29T18:11:12.923Z :who: mocsharp :why: Apache-2.0 (https://github.com/aws/aws-sdk-net/raw/master/License.txt) @@ -16,21 +16,21 @@ - - :approve - AWSSDK.SecurityToken - :versions: - - 3.7.300.30 + - 3.7.300.105 :when: 2022-08-16T18:11:13.781Z :who: mocsharp :why: Apache-2.0 (https://github.com/aws/aws-sdk-net/raw/master/License.txt) - - :approve - Ardalis.GuardClauses - :versions: - - 4.3.0 + - 4.5.0 :when: 2022-08-16T21:39:30.077Z :who: mocsharp :why: MIT (https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) - - :approve - AspNetCore.HealthChecks.MongoDb - :versions: - - 8.0.0 + - 8.0.1 :when: 2022-12-08T23:37:56.206Z :who: mocsharp :why: Apache-2.0 (https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/raw/master/LICENSE) @@ -86,14 +86,14 @@ - - :approve - DotNext - :versions: - - 4.15.2 + - 5.3.1 :when: 2022-09-01T23:05:32.857Z :who: mocsharp :why: MIT (https://github.com/dotnet/dotNext/raw/master/LICENSE) - - :approve - DotNext.Threading - :versions: - - 4.15.2 + - 5.5.0 :when: 2022-09-01T23:05:33.298Z :who: mocsharp :why: MIT (https://github.com/dotnet/dotNext/raw/master/LICENSE) @@ -124,7 +124,7 @@ - 2.14.1 :when: 2022-08-16T23:05:35.500Z :who: mocsharp - :why: MIT (https://github.com/Humanizr/Humanizer/raw/main/LICENSE) + :why: MIT (https://raw.githubusercontent.com/Humanizr/Humanizer/v2.14.1/LICENSE) - - :approve - Macross.Json.Extensions - :versions: @@ -205,77 +205,77 @@ - - :approve - Microsoft.CodeCoverage - :versions: - - 17.8.0 + - 17.10.0 :when: 2023-08-16T16:49:26.950Z :who: woodheadio :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) - - :approve - Microsoft.Data.Sqlite.Core - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:49.698Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:50.137Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Abstractions - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:51.008Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Analyzers - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:51.445Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Design - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:51.922Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.InMemory - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:52.375Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Relational - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:52.828Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Tools - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:52.828Z :who: ndsouth :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Sqlite - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:53.270Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) - - :approve - Microsoft.EntityFrameworkCore.Sqlite.Core - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-16T23:05:53.706Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -322,6 +322,7 @@ - :versions: - 6.0.0 - 8.0.0 + - 8.0.1 :when: 2022-08-16T23:05:56.869Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -376,7 +377,7 @@ - Microsoft.Extensions.DependencyInjection.Abstractions - :versions: - 6.0.0 - - 8.0.0 + - 8.0.1 :when: 2022-08-16T21:39:41.552Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -404,21 +405,21 @@ - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks - :versions: - - 8.0.0 + - 8.0.6 :when: 2023-08-16T16:49:26.950Z :who: woodheadio :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions - :versions: - - 8.0.0 + - 8.0.6 :when: 2023-08-16T16:49:26.950Z :who: woodheadio :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore - :versions: - - 8.0.0 + - 8.0.6 :when: 2022-08-29T18:11:22.090Z :who: mocsharp :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -474,7 +475,7 @@ - Microsoft.Extensions.Logging.Abstractions - :versions: - 6.0.0 - - 8.0.0 + - 8.0.1 :when: 2022-08-16T21:39:44.471Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -525,7 +526,7 @@ - Microsoft.Extensions.Options - :versions: - 6.0.0 - - 8.0.0 + - 8.0.2 :when: 2022-08-16T21:39:46.980Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -586,14 +587,14 @@ - 8.0.1 - 8.0.2 - 8.0.3 - - 8.0.5 + - 8.0.6 :when: 2022-10-14T23:37:16.793Z :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) - - :approve - Microsoft.NET.Test.Sdk - :versions: - - 17.8.0 + - 17.10.0 :when: 2023-08-16T16:49:26.950Z :who: woodheadio :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) @@ -607,7 +608,7 @@ - - :approve - Microsoft.OpenApi - :versions: - - 1.2.3 + - 1.6.14 :when: 2022-08-16T23:06:15.708Z :who: mocsharp :why: MIT ( https://raw.githubusercontent.com/Microsoft/OpenAPI.NET/master/LICENSE) @@ -635,14 +636,14 @@ - - :approve - Microsoft.TestPlatform.ObjectModel - :versions: - - 17.8.0 + - 17.10.0 :when: 2023-08-16T16:49:26.950Z :who: woodheadio :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) - - :approve - Microsoft.TestPlatform.TestHost - :versions: - - 17.8.0 + - 17.10.0 :when: 2023-08-16T16:49:26.950Z :who: woodheadio :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) @@ -656,42 +657,42 @@ - - :approve - Minio - :versions: - - 6.0.1 + - 6.0.2 :when: 2022-08-16T18:11:34.443Z :who: mocsharp :why: Apache-2.0 (https://github.com/minio/minio-dotnet/raw/master/LICENSE) - - :approve - Monai.Deploy.Messaging - :versions: - - 2.0.2 + - 2.0.3 :when: 2023-10-13T18:06:21.511Z :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) - - :approve - Monai.Deploy.Messaging.RabbitMQ - :versions: - - 2.0.2 + - 2.0.3 :when: 2023-10-13T18:06:21.511Z :who: neilsouth :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) - - :approve - Monai.Deploy.Storage - :versions: - - 1.0.0 + - 1.0.1 :when: 2022-08-16T23:06:21.988Z :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) - - :approve - Monai.Deploy.Storage.MinIO - :versions: - - 1.0.0 + - 1.0.1 :when: 2022-08-16T23:06:22.426Z :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) - - :approve - Monai.Deploy.Storage.S3Policy - :versions: - - 1.0.0 + - 1.0.1 :when: 2022-08-16T23:06:22.881Z :who: mocsharp :why: Apache-2.0 (https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -705,14 +706,14 @@ - - :approve - MongoDB.Bson - :versions: - - 2.23.1 + - 2.25.0 :when: 2022-11-16T23:38:53.891Z :who: mocsharp :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - - :approve - MongoDB.Driver - :versions: - - 2.23.1 + - 2.25.0 :when: 2022-11-16T23:38:54.213Z :who: mocsharp :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) @@ -727,14 +728,14 @@ - - :approve - MongoDB.Driver.Core - :versions: - - 2.23.1 + - 2.25.0 :when: 2022-11-16T23:38:54.553Z :who: mocsharp :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) - - :approve - MongoDB.Libmongocrypt - :versions: - - 1.8.0 + - 1.8.2 :when: 2022-11-16T23:38:54.863Z :who: mocsharp :why: Apache-2.0 (https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) @@ -755,21 +756,21 @@ - - :approve - NLog - :versions: - - 5.2.8 + - 5.3.2 :when: 2022-10-12T03:14:06.538Z :who: mocsharp :why: BSD 3-Clause License (https://github.com/NLog/NLog/raw/dev/LICENSE.txt) - - :approve - NLog.Extensions.Logging - :versions: - - 5.3.8 + - 5.3.11 :when: 2022-10-12T03:14:06.964Z :who: mocsharp :why: BSD 2-Clause Simplified License (https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) - - :approve - NLog.Web.AspNetCore - :versions: - - 5.3.8 + - 5.3.11 :when: 2022-10-12T03:14:07.396Z :who: mocsharp :why: BSD 3-Clause License (https://github.com/NLog/NLog.Web/raw/master/LICENSE) @@ -868,28 +869,28 @@ - - :approve - Swashbuckle.AspNetCore - :versions: - - 6.5.0 + - 6.6.2 :when: 2022-08-16T23:06:33.817Z :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - - :approve - Swashbuckle.AspNetCore.Swagger - :versions: - - 6.5.0 + - 6.6.2 :when: 2022-08-16T23:06:34.264Z :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - - :approve - Swashbuckle.AspNetCore.SwaggerGen - :versions: - - 6.5.0 + - 6.6.2 :when: 2022-08-16T23:06:34.716Z :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) - - :approve - Swashbuckle.AspNetCore.SwaggerUI - :versions: - - 6.5.0 + - 6.6.2 :when: 2022-08-16T23:06:35.164Z :who: mocsharp :why: MIT (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) @@ -904,7 +905,7 @@ - Polly - :versions: - 8.2.0 - - 8.2.1 + - 8.4.0 :when: 2022-11-09T18:57:32.294Z :who: mocsharp :why: MIT ( https://licenses.nuget.org/MIT) @@ -912,7 +913,7 @@ - Polly.Core - :versions: - 8.2.0 - - 8.2.1 + - 8.4.0 :when: 2022-11-09T18:57:32.294Z :who: mocsharp :why: MIT ( https://licenses.nuget.org/MIT) @@ -1069,14 +1070,14 @@ - - :approve - System.IO.Abstractions - :versions: - - 20.0.4 + - 21.0.2 :when: 2022-12-14T12:28:00.728Z :who: samrooke :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - - :approve - System.IO.Abstractions.TestingHelpers - :versions: - - 20.0.4 + - 21.0.2 :when: 2022-12-14T12:28:00.728Z :who: samrooke :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -1441,6 +1442,7 @@ - :versions: - 6.0.0 - 7.0.0 + - 8.0.0 :when: 2022-08-16T21:40:19.306Z :who: mocsharp :why: MIT ( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) @@ -1490,21 +1492,21 @@ - - :approve - TestableIO.System.IO.Abstractions - :versions: - - 20.0.4 + - 21.0.2 :when: 2022-08-16T21:40:21.430Z :who: mocsharp :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - - :approve - TestableIO.System.IO.Abstractions.TestingHelpers - :versions: - - 20.0.4 + - 21.0.2 :when: 2022-08-16T21:40:21.430Z :who: mocsharp :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) - - :approve - TestableIO.System.IO.Abstractions.Wrappers - :versions: - - 20.0.4 + - 21.0.2 :when: 2022-08-16T21:40:21.430Z :who: mocsharp :why: MIT (https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -1518,7 +1520,7 @@ - - :approve - coverlet.collector - :versions: - - 6.0.0 + - 6.0.2 :when: 2022-08-16T21:40:21.855Z :who: mocsharp :why: MIT (https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) @@ -1663,7 +1665,7 @@ - - :approve - xunit - :versions: - - 2.6.5 + - 2.8.1 :when: 2022-08-16T21:40:29.166Z :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -1677,42 +1679,42 @@ - - :approve - xunit.analyzers - :versions: - - 1.9.0 + - 1.14.0 :when: 2022-08-16T21:40:30.047Z :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit.analyzers/master/LICENSE) - - :approve - xunit.assert - :versions: - - 2.6.5 + - 2.8.1 :when: 2022-08-16T21:40:30.526Z :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - xunit.core - :versions: - - 2.6.5 + - 2.8.1 :when: 2022-08-16T21:40:30.973Z :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - xunit.extensibility.core - :versions: - - 2.6.5 + - 2.8.1 :when: 2022-08-16T21:40:31.401Z :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - xunit.extensibility.execution - :versions: - - 2.6.5 + - 2.8.1 :when: 2022-08-16T21:40:31.845Z :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) - - :approve - xunit.runner.visualstudio - :versions: - - 2.5.6 + - 2.8.1 :when: 2022-08-16T21:40:32.294Z :who: mocsharp :why: MIT ( https://licenses.nuget.org/MIT) @@ -1776,7 +1778,7 @@ - - :approve - System.IO.Hashing - :versions: - - 7.0.0 + - 8.0.0 :when: 2023-08-10T20:50:14.759Z :who: mocsharp :why: MIT (https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index fda72734a..d0c2fd7e7 100755 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -15,7 +15,7 @@ version: "3.9" services: rabbitmq: - image: rabbitmq:3.10-management + image: rabbitmq:3.13-management hostname: rabbitmq ports: - 5672:5672 @@ -35,7 +35,7 @@ services: - monaideploy minio: - image: "minio/minio:RELEASE.2023-10-16T04-13-43Z" + image: "minio/minio:RELEASE.2024-06-11T03-13-30Z" command: server --console-address ":9001" /data hostname: minio volumes: @@ -75,7 +75,7 @@ services: start_period: 40s orthanc: - image: osimis/orthanc:22.9.0 + image: osimis/orthanc:24.1.2-full hostname: orthanc volumes: - ./configs/orthanc.json:/etc/orthanc/orthanc.json diff --git a/docs/changelog.md b/docs/changelog.md index 68d61ce7f..1ad6348f0 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -17,6 +17,12 @@ # Changelog +## 0.5.0 +[GitHub Milestone 0.5.0](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/4) + +- gh-506 Updated Informatics Gateway to .NET 8.0 +- Improve logging + ## 0.4.0 [GitHub Milestone 0.4.0](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/5) diff --git a/docs/compliance/third-party-licenses.md b/docs/compliance/third-party-licenses.md index 843dacd96..04d8e8592 100644 --- a/docs/compliance/third-party-licenses.md +++ b/docs/compliance/third-party-licenses.md @@ -60,15 +60,15 @@ SOFTWARE.
-AWSSDK.Core 3.7.300.29 +AWSSDK.Core 3.7.304.15 ## AWSSDK.Core -- Version: 3.7.300.29 +- Version: 3.7.304.15 - Authors: Amazon Web Services - Owners: Amazon Web Services - Project URL: https://github.com/aws/aws-sdk-net/ -- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.Core/3.7.300.29) +- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.Core/3.7.304.15) - License: [Apache-2.0](https://github.com/aws/aws-sdk-net/raw/master/License.txt) @@ -206,15 +206,15 @@ END OF TERMS AND CONDITIONS
-AWSSDK.SecurityToken 3.7.300.30 +AWSSDK.SecurityToken 3.7.300.105 ## AWSSDK.SecurityToken -- Version: 3.7.300.30 +- Version: 3.7.300.105 - Authors: Amazon Web Services - Owners: Amazon Web Services - Project URL: https://github.com/aws/aws-sdk-net/ -- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.SecurityToken/3.7.300.30) +- Source: [NuGet](https://www.nuget.org/packages/AWSSDK.SecurityToken/3.7.300.105) - License: [Apache-2.0](https://github.com/aws/aws-sdk-net/raw/master/License.txt) @@ -279,14 +279,14 @@ END OF TERMS AND CONDITIONS
-Ardalis.GuardClauses 4.3.0 +Ardalis.GuardClauses 4.5.0 ## Ardalis.GuardClauses -- Version: 4.3.0 +- Version: 4.5.0 - Authors: Steve Smith (@ardalis) - Project URL: https://github.com/ardalis/guardclauses -- Source: [NuGet](https://www.nuget.org/packages/Ardalis.GuardClauses/4.3.0) +- Source: [NuGet](https://www.nuget.org/packages/Ardalis.GuardClauses/4.5.0) - License: [MIT](https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) @@ -318,14 +318,14 @@ SOFTWARE.
-AspNetCore.HealthChecks.MongoDb 8.0.0 +AspNetCore.HealthChecks.MongoDb 8.0.1 ## AspNetCore.HealthChecks.MongoDb -- Version: 8.0.0 +- Version: 8.0.1 - Authors: Xabaril Contributors - Project URL: https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks -- Source: [NuGet](https://www.nuget.org/packages/AspNetCore.HealthChecks.MongoDb/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/AspNetCore.HealthChecks.MongoDb/8.0.1) - License: [Apache-2.0](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/raw/master/LICENSE) @@ -1144,14 +1144,14 @@ SOFTWARE.
-DotNext 4.15.2 +DotNext 5.3.1 ## DotNext -- Version: 4.15.2 +- Version: 5.3.1 - Authors: .NET Foundation and Contributors - Project URL: https://dotnet.github.io/dotNext/ -- Source: [NuGet](https://www.nuget.org/packages/DotNext/4.15.2) +- Source: [NuGet](https://www.nuget.org/packages/DotNext/5.3.1) - License: [MIT](https://github.com/dotnet/dotNext/raw/master/LICENSE) @@ -1183,14 +1183,14 @@ SOFTWARE.
-DotNext.Threading 4.15.2 +DotNext.Threading 5.5.0 ## DotNext.Threading -- Version: 4.15.2 +- Version: 5.5.0 - Authors: .NET Foundation and Contributors - Project URL: https://dotnet.github.io/dotNext/ -- Source: [NuGet](https://www.nuget.org/packages/DotNext.Threading/4.15.2) +- Source: [NuGet](https://www.nuget.org/packages/DotNext.Threading/5.5.0) - License: [MIT](https://github.com/dotnet/dotNext/raw/master/LICENSE) @@ -1443,9 +1443,9 @@ third-party archives. ``` -The MIT License (MIT) +MIT License -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant +Copyright (c) M.P. Korstanje Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1454,16 +1454,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ```
@@ -1517,7 +1517,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Authors: Mehdi Khalili, Claire Novotny - Project URL: https://github.com/Humanizr/Humanizer - Source: [NuGet](https://www.nuget.org/packages/Humanizer.Core/2.14.1) -- License: [MIT](https://github.com/Humanizr/Humanizer/raw/main/LICENSE) +- License: [MIT](https://raw.githubusercontent.com/Humanizr/Humanizer/v2.14.1/LICENSE) ``` @@ -2028,14 +2028,14 @@ SOFTWARE.
-Microsoft.CodeCoverage 17.8.0 +Microsoft.CodeCoverage 17.10.0 ## Microsoft.CodeCoverage -- Version: 17.8.0 +- Version: 17.10.0 - Authors: Microsoft - Project URL: https://github.com/microsoft/vstest -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.8.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.10.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) @@ -2065,14 +2065,14 @@ SOFTWARE.
-Microsoft.Data.Sqlite.Core 8.0.0 +Microsoft.Data.Sqlite.Core 8.0.6 ## Microsoft.Data.Sqlite.Core -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/dotnet/standard/data/sqlite/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2106,14 +2106,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore 8.0.0 +Microsoft.EntityFrameworkCore 8.0.6 ## Microsoft.EntityFrameworkCore -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2147,14 +2147,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Abstractions 8.0.0 +Microsoft.EntityFrameworkCore.Abstractions 8.0.6 ## Microsoft.EntityFrameworkCore.Abstractions -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Abstractions/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Abstractions/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2188,14 +2188,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Analyzers 8.0.0 +Microsoft.EntityFrameworkCore.Analyzers 8.0.6 ## Microsoft.EntityFrameworkCore.Analyzers -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Analyzers/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Analyzers/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2229,14 +2229,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Design 8.0.0 +Microsoft.EntityFrameworkCore.Design 8.0.6 ## Microsoft.EntityFrameworkCore.Design -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2270,14 +2270,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.InMemory 8.0.0 +Microsoft.EntityFrameworkCore.InMemory 8.0.6 ## Microsoft.EntityFrameworkCore.InMemory -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2311,14 +2311,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Relational 8.0.0 +Microsoft.EntityFrameworkCore.Relational 8.0.6 ## Microsoft.EntityFrameworkCore.Relational -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2352,14 +2352,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Sqlite 8.0.0 +Microsoft.EntityFrameworkCore.Sqlite 8.0.6 ## Microsoft.EntityFrameworkCore.Sqlite -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2393,14 +2393,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Sqlite.Core 8.0.0 +Microsoft.EntityFrameworkCore.Sqlite.Core 8.0.6 ## Microsoft.EntityFrameworkCore.Sqlite.Core -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite.Core/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite.Core/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2434,14 +2434,14 @@ SOFTWARE.
-Microsoft.EntityFrameworkCore.Tools 8.0.0 +Microsoft.EntityFrameworkCore.Tools 8.0.6 ## Microsoft.EntityFrameworkCore.Tools -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://docs.microsoft.com/ef/core/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/8.0.6) - License: [MIT](https://raw.githubusercontent.com/dotnet/efcore/release/6.0/LICENSE.txt) @@ -2884,6 +2884,47 @@ SOFTWARE.
+
+Microsoft.Extensions.Configuration.Binder 8.0.1 + +## Microsoft.Extensions.Configuration.Binder + +- Version: 8.0.1 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Binder/8.0.1) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ +
Microsoft.Extensions.Configuration.CommandLine 6.0.0 @@ -3377,14 +3418,14 @@ SOFTWARE.
-Microsoft.Extensions.DependencyInjection.Abstractions 8.0.0 +Microsoft.Extensions.DependencyInjection.Abstractions 8.0.1 ## Microsoft.Extensions.DependencyInjection.Abstractions -- Version: 8.0.0 +- Version: 8.0.1 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.1) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -3541,14 +3582,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks 8.0.0 +Microsoft.Extensions.Diagnostics.HealthChecks 8.0.6 ## Microsoft.Extensions.Diagnostics.HealthChecks -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/8.0.6) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -3582,14 +3623,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 8.0.0 +Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 8.0.6 ## Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/8.0.6) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -3623,14 +3664,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 8.0.0 +Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 8.0.6 ## Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore -- Version: 8.0.0 +- Version: 8.0.6 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore/8.0.6) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -4238,14 +4279,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Abstractions 8.0.0 +Microsoft.Extensions.Logging.Abstractions 8.0.1 ## Microsoft.Extensions.Logging.Abstractions -- Version: 8.0.0 +- Version: 8.0.1 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/8.0.1) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -4566,14 +4607,14 @@ SOFTWARE.
-Microsoft.Extensions.Options 8.0.0 +Microsoft.Extensions.Options 8.0.2 ## Microsoft.Extensions.Options -- Version: 8.0.0 +- Version: 8.0.2 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options/8.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Options/8.0.2) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -5046,14 +5087,178 @@ SOFTWARE.
-Microsoft.NET.Test.Sdk 17.8.0 +Microsoft.NET.ILLink.Tasks 8.0.1 + +## Microsoft.NET.ILLink.Tasks + +- Version: 8.0.1 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.ILLink.Tasks/8.0.1) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+Microsoft.NET.ILLink.Tasks 8.0.2 + +## Microsoft.NET.ILLink.Tasks + +- Version: 8.0.2 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.ILLink.Tasks/8.0.2) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+Microsoft.NET.ILLink.Tasks 8.0.3 + +## Microsoft.NET.ILLink.Tasks + +- Version: 8.0.3 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.ILLink.Tasks/8.0.3) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+Microsoft.NET.ILLink.Tasks 8.0.6 + +## Microsoft.NET.ILLink.Tasks + +- Version: 8.0.6 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.ILLink.Tasks/8.0.6) +- License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) + + +``` +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +
+ + +
+Microsoft.NET.Test.Sdk 17.10.0 ## Microsoft.NET.Test.Sdk -- Version: 17.8.0 +- Version: 17.10.0 - Authors: Microsoft - Project URL: https://github.com/microsoft/vstest -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.8.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.10.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) @@ -5535,14 +5740,14 @@ consequential or other damages.
-Microsoft.OpenApi 1.2.3 +Microsoft.OpenApi 1.6.14 ## Microsoft.OpenApi -- Version: 1.2.3 +- Version: 1.6.14 - Authors: Microsoft - Project URL: https://github.com/Microsoft/OpenAPI.NET -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.OpenApi/1.2.3) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.OpenApi/1.6.14) - License: [MIT]( https://raw.githubusercontent.com/Microsoft/OpenAPI.NET/master/LICENSE) @@ -5574,14 +5779,14 @@ SOFTWARE.
-Microsoft.TestPlatform.ObjectModel 17.8.0 +Microsoft.TestPlatform.ObjectModel 17.10.0 ## Microsoft.TestPlatform.ObjectModel -- Version: 17.8.0 +- Version: 17.10.0 - Authors: Microsoft - Project URL: https://github.com/microsoft/vstest -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.8.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.10.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) @@ -5611,14 +5816,14 @@ SOFTWARE.
-Microsoft.TestPlatform.TestHost 17.8.0 +Microsoft.TestPlatform.TestHost 17.10.0 ## Microsoft.TestPlatform.TestHost -- Version: 17.8.0 +- Version: 17.10.0 - Authors: Microsoft - Project URL: https://github.com/microsoft/vstest -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.8.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.10.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) @@ -5895,14 +6100,14 @@ SOFTWARE.
-Minio 6.0.1 +Minio 6.0.2 ## Minio -- Version: 6.0.1 +- Version: 6.0.2 - Authors: MinIO, Inc. - Project URL: https://github.com/minio/minio-dotnet -- Source: [NuGet](https://www.nuget.org/packages/Minio/6.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Minio/6.0.2) - License: [Apache-2.0](https://github.com/minio/minio-dotnet/raw/master/LICENSE) @@ -6114,14 +6319,14 @@ Apache License
-Monai.Deploy.Messaging 2.0.0 +Monai.Deploy.Messaging 2.0.3 ## Monai.Deploy.Messaging -- Version: 2.0.0 +- Version: 2.0.3 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-messaging -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging/2.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging/2.0.3) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) @@ -6342,14 +6547,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Messaging.RabbitMQ 2.0.0 +Monai.Deploy.Messaging.RabbitMQ 2.0.3 ## Monai.Deploy.Messaging.RabbitMQ -- Version: 2.0.0 +- Version: 2.0.3 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-messaging -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging.RabbitMQ/2.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Messaging.RabbitMQ/2.0.3) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-messaging/raw/main/LICENSE) @@ -6798,14 +7003,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Storage 1.0.0 +Monai.Deploy.Storage 1.0.1 ## Monai.Deploy.Storage -- Version: 1.0.0 +- Version: 1.0.1 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-storage -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage/1.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage/1.0.1) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -7026,14 +7231,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Storage.MinIO 1.0.0 +Monai.Deploy.Storage.MinIO 1.0.1 ## Monai.Deploy.Storage.MinIO -- Version: 1.0.0 +- Version: 1.0.1 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-storage -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.MinIO/1.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.MinIO/1.0.1) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -7254,14 +7459,14 @@ By downloading this software, you agree to the license terms & all licenses list
-Monai.Deploy.Storage.S3Policy 1.0.0 +Monai.Deploy.Storage.S3Policy 1.0.1 ## Monai.Deploy.Storage.S3Policy -- Version: 1.0.0 +- Version: 1.0.1 - Authors: MONAI Consortium - Project URL: https://github.com/Project-MONAI/monai-deploy-storage -- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.S3Policy/1.0.0) +- Source: [NuGet](https://www.nuget.org/packages/Monai.Deploy.Storage.S3Policy/1.0.1) - License: [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-storage/raw/main/LICENSE) @@ -7482,14 +7687,14 @@ By downloading this software, you agree to the license terms & all licenses list
-MongoDB.Bson 2.23.1 +MongoDB.Bson 2.25.0 ## MongoDB.Bson -- Version: 2.23.1 +- Version: 2.25.0 - Authors: MongoDB Inc. - Project URL: https://www.mongodb.com/docs/drivers/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Bson/2.23.1) +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Bson/2.25.0) - License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) @@ -7701,14 +7906,14 @@ Apache License
-MongoDB.Driver 2.23.1 +MongoDB.Driver 2.25.0 ## MongoDB.Driver -- Version: 2.23.1 +- Version: 2.25.0 - Authors: MongoDB Inc. - Project URL: https://www.mongodb.com/docs/drivers/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver/2.23.1) +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver/2.25.0) - License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) @@ -7920,14 +8125,14 @@ Apache License
-MongoDB.Driver.Core 2.23.1 +MongoDB.Driver.Core 2.25.0 ## MongoDB.Driver.Core -- Version: 2.23.1 +- Version: 2.25.0 - Authors: MongoDB Inc. - Project URL: https://www.mongodb.com/docs/drivers/csharp/ -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver.Core/2.23.1) +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Driver.Core/2.25.0) - License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) @@ -8139,14 +8344,14 @@ Apache License
-MongoDB.Libmongocrypt 1.8.0 +MongoDB.Libmongocrypt 1.8.2 ## MongoDB.Libmongocrypt -- Version: 1.8.0 +- Version: 1.8.2 - Authors: MongoDB Inc. - Project URL: http://www.mongodb.org/display/DOCS/CSharp+Language+Center -- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Libmongocrypt/1.8.0) +- Source: [NuGet](https://www.nuget.org/packages/MongoDB.Libmongocrypt/1.8.2) - License: [Apache-2.0](https://raw.githubusercontent.com/mongodb/mongo-csharp-driver/master/LICENSE.md) @@ -8652,14 +8857,14 @@ consequential or other damages.
-NLog 5.2.8 +NLog 5.3.2 ## NLog -- Version: 5.2.8 +- Version: 5.3.2 - Authors: Jarek Kowalski,Kim Christensen,Julian Verdurmen - Project URL: https://nlog-project.org/ -- Source: [NuGet](https://www.nuget.org/packages/NLog/5.2.8) +- Source: [NuGet](https://www.nuget.org/packages/NLog/5.3.2) - License: [BSD 3-Clause License](https://github.com/NLog/NLog/raw/dev/LICENSE.txt) @@ -8700,14 +8905,14 @@ THE POSSIBILITY OF SUCH DAMAGE.
-NLog.Extensions.Logging 5.3.8 +NLog.Extensions.Logging 5.3.11 ## NLog.Extensions.Logging -- Version: 5.3.8 +- Version: 5.3.11 - Authors: Microsoft,Julian Verdurmen - Project URL: https://github.com/NLog/NLog.Extensions.Logging -- Source: [NuGet](https://www.nuget.org/packages/NLog.Extensions.Logging/5.3.8) +- Source: [NuGet](https://www.nuget.org/packages/NLog.Extensions.Logging/5.3.11) - License: [BSD 2-Clause Simplified License](https://github.com/NLog/NLog.Extensions.Logging/raw/master/LICENSE) @@ -8741,14 +8946,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-NLog.Web.AspNetCore 5.3.8 +NLog.Web.AspNetCore 5.3.11 ## NLog.Web.AspNetCore -- Version: 5.3.8 +- Version: 5.3.11 - Authors: Julian Verdurmen - Project URL: https://github.com/NLog/NLog.Web -- Source: [NuGet](https://www.nuget.org/packages/NLog.Web.AspNetCore/5.3.8) +- Source: [NuGet](https://www.nuget.org/packages/NLog.Web.AspNetCore/5.3.11) - License: [BSD 3-Clause License](https://github.com/NLog/NLog.Web/raw/master/LICENSE) @@ -8897,14 +9102,14 @@ specific language governing permissions and limitations under the License.
-Polly 8.2.1 +Polly 8.2.0 ## Polly -- Version: 8.2.1 +- Version: 8.2.0 - Authors: Michael Wolfenden, App vNext - Project URL: https://github.com/App-vNext/Polly -- Source: [NuGet](https://www.nuget.org/packages/Polly/8.2.1) +- Source: [NuGet](https://www.nuget.org/packages/Polly/8.2.0) - License: [MIT]( https://licenses.nuget.org/MIT) @@ -8952,14 +9157,14 @@ Data pulled from spdx/license-list-data on February 9, 2023.
-Polly.Core 8.2.1 +Polly 8.4.0 -## Polly.Core +## Polly -- Version: 8.2.1 +- Version: 8.4.0 - Authors: Michael Wolfenden, App vNext - Project URL: https://github.com/App-vNext/Polly -- Source: [NuGet](https://www.nuget.org/packages/Polly.Core/8.2.1) +- Source: [NuGet](https://www.nuget.org/packages/Polly/8.4.0) - License: [MIT]( https://licenses.nuget.org/MIT) @@ -9007,35 +9212,145 @@ Data pulled from spdx/license-list-data on February 9, 2023.
-RabbitMQ.Client 6.8.1 +Polly.Core 8.2.0 -## RabbitMQ.Client +## Polly.Core -- Version: 6.8.1 -- Authors: VMware -- Project URL: https://www.rabbitmq.com/dotnet.html -- Source: [NuGet](https://www.nuget.org/packages/RabbitMQ.Client/6.8.1) -- License: [Apache-2.0](https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) +- Version: 8.2.0 +- Authors: Michael Wolfenden, App vNext +- Project URL: https://github.com/App-vNext/Polly +- Source: [NuGet](https://www.nuget.org/packages/Polly.Core/8.2.0) +- License: [MIT]( https://licenses.nuget.org/MIT) ``` -Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ +'MIT' reference - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +MIT License +SPDX identifier +MIT +License text - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +MIT License - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, + +Copyright (c) + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: +The above copyright notice and this permission notice + (including the next paragraph) + shall be included in all copies or substantial + portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +SPDX web page + +https://spdx.org/licenses/MIT.html + +Notice +This license content is provided by the SPDX project. For more information about licenses.nuget.org, see our documentation. + +Data pulled from spdx/license-list-data on February 9, 2023. +``` + +
+ + +
+Polly.Core 8.4.0 + +## Polly.Core + +- Version: 8.4.0 +- Authors: Michael Wolfenden, App vNext +- Project URL: https://github.com/App-vNext/Polly +- Source: [NuGet](https://www.nuget.org/packages/Polly.Core/8.4.0) +- License: [MIT]( https://licenses.nuget.org/MIT) + + +``` +'MIT' reference + + + +MIT License +SPDX identifier +MIT +License text + +MIT License + + +Copyright (c) + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: +The above copyright notice and this permission notice + (including the next paragraph) + shall be included in all copies or substantial + portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +SPDX web page + +https://spdx.org/licenses/MIT.html + +Notice +This license content is provided by the SPDX project. For more information about licenses.nuget.org, see our documentation. + +Data pulled from spdx/license-list-data on February 9, 2023. +``` + +
+ + +
+RabbitMQ.Client 6.8.1 + +## RabbitMQ.Client + +- Version: 6.8.1 +- Authors: VMware +- Project URL: https://www.rabbitmq.com/dotnet.html +- Source: [NuGet](https://www.nuget.org/packages/RabbitMQ.Client/6.8.1) +- License: [Apache-2.0](https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) + + +``` +Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the @@ -10438,15 +10753,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-Swashbuckle.AspNetCore 6.5.0 +Swashbuckle.AspNetCore 6.6.2 ## Swashbuckle.AspNetCore -- Version: 6.5.0 -- Authors: Swashbuckle.AspNetCore -- Owners: Swashbuckle.AspNetCore +- Version: 6.6.2 +- Authors: domaindrivendev +- Owners: domaindrivendev - Project URL: https://github.com/domaindrivendev/Swashbuckle.AspNetCore -- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore/6.5.0) +- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore/6.6.2) - License: [MIT](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) @@ -10478,14 +10793,14 @@ SOFTWARE.
-Swashbuckle.AspNetCore.Swagger 6.5.0 +Swashbuckle.AspNetCore.Swagger 6.6.2 ## Swashbuckle.AspNetCore.Swagger -- Version: 6.5.0 -- Authors: Swashbuckle.AspNetCore.Swagger +- Version: 6.6.2 +- Authors: domaindrivendev - Project URL: https://github.com/domaindrivendev/Swashbuckle.AspNetCore -- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore.Swagger/6.5.0) +- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore.Swagger/6.6.2) - License: [MIT](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) @@ -10517,14 +10832,14 @@ SOFTWARE.
-Swashbuckle.AspNetCore.SwaggerGen 6.5.0 +Swashbuckle.AspNetCore.SwaggerGen 6.6.2 ## Swashbuckle.AspNetCore.SwaggerGen -- Version: 6.5.0 -- Authors: Swashbuckle.AspNetCore.SwaggerGen +- Version: 6.6.2 +- Authors: domaindrivendev - Project URL: https://github.com/domaindrivendev/Swashbuckle.AspNetCore -- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore.SwaggerGen/6.5.0) +- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore.SwaggerGen/6.6.2) - License: [MIT](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) @@ -10556,14 +10871,14 @@ SOFTWARE.
-Swashbuckle.AspNetCore.SwaggerUI 6.5.0 +Swashbuckle.AspNetCore.SwaggerUI 6.6.2 ## Swashbuckle.AspNetCore.SwaggerUI -- Version: 6.5.0 -- Authors: Swashbuckle.AspNetCore.SwaggerUI +- Version: 6.6.2 +- Authors: domaindrivendev - Project URL: https://github.com/domaindrivendev/Swashbuckle.AspNetCore -- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore.SwaggerUI/6.5.0) +- Source: [NuGet](https://www.nuget.org/packages/Swashbuckle.AspNetCore.SwaggerUI/6.6.2) - License: [MIT](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/raw/master/LICENSE) @@ -14002,14 +14317,14 @@ consequential or other damages.
-System.IO.Abstractions 20.0.4 +System.IO.Abstractions 21.0.2 ## System.IO.Abstractions -- Version: 20.0.4 +- Version: 21.0.2 - Authors: Tatham Oddie & friends - Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions/20.0.4) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions/21.0.2) - License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -14043,14 +14358,14 @@ SOFTWARE.
-System.IO.Abstractions.TestingHelpers 20.0.4 +System.IO.Abstractions.TestingHelpers 21.0.2 ## System.IO.Abstractions.TestingHelpers -- Version: 20.0.4 +- Version: 21.0.2 - Authors: Tatham Oddie & friends - Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions.TestingHelpers/20.0.4) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Abstractions.TestingHelpers/21.0.2) - License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -14904,14 +15219,14 @@ consequential or other damages.
-System.IO.Hashing 7.0.0 +System.IO.Hashing 8.0.0 ## System.IO.Hashing -- Version: 7.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.IO.Hashing/7.0.0) +- Source: [NuGet](https://www.nuget.org/packages/System.IO.Hashing/8.0.0) - License: [MIT](https://raw.githubusercontent.com/dotnet/runtime/main/LICENSE.TXT) @@ -22494,14 +22809,916 @@ consequential or other damages.
-System.Threading.Channels 6.0.0 +System.Threading.Channels 6.0.0 + +## System.Threading.Channels + +- Version: 6.0.0 +- Authors: Microsoft +- Project URL: https://dot.net/ +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/6.0.0) +- License: [MIT]( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) + + +``` +corefx/LICENSE.TXT at master · dotnet/corefx · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + + + + + + + + + + +Navigation Menu + +Toggle navigation + + + + + + + + + + + Sign in + + + + + + + + + + + + + + + + + + Product + + + + + + + + + + + + + +Actions + Automate any workflow + + + + + + + + +Packages + Host and manage packages + + + + + + + + +Security + Find and fix vulnerabilities + + + + + + + + +Codespaces + Instant dev environments + + + + + + + + +GitHub Copilot + Write better code with AI + + + + + + + + +Code review + Manage code changes + + + + + + + + +Issues + Plan and track work + + + + + + + + +Discussions + Collaborate outside of code + + + + + +Explore + + + + All features + + + + + + Documentation + + + + + + + + GitHub Skills + + + + + + + + Blog + + + + + + + + + + + + Solutions + + + + + + +For + + + + Enterprise + + + + + + Teams + + + + + + Startups + + + + + + Education + + + + + + + + +By Solution + + + + CI/CD & Automation + + + + + + DevOps + + + + + + DevSecOps + + + + + + + + +Resources + + + + Learning Pathways + + + + + + + + White papers, Ebooks, Webinars + + + + + + + + Customer Stories + + + + + + Partners + + + + + + + + + + + + Open Source + + + + + + + + + + +GitHub Sponsors + Fund open source developers + + + + + + + + + +The ReadME Project + GitHub community articles + + + + + +Repositories + + + + Topics + + + + + + Trending + + + + + + Collections + + + + + + + + + + Enterprise + + + + + + + + + + + + + +Enterprise platform + AI-powered developer platform + + + + + +Available add-ons + + + + + + + +Advanced Security + Enterprise-grade security features + + + + + + + + +GitHub Copilot + Enterprise-grade AI features + + + + + + + + +Premium Support + Enterprise-grade 24/7 support + + + + + + + +Pricing + + + + + + + + + + + + +Search or jump to... + + + + + + + +Search code, repositories, users, issues, pull requests... + + + + + + + Search + + + + + + + + + + + + + + +Clear + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search syntax tips + + + + + + + + + + + + + + + + Provide feedback + + + + + + + + + + + +We read every piece of feedback, and take your input very seriously. + + +Include my email address so I can be contacted + + + Cancel + + Submit feedback + + + + + + + + + + + Saved searches + +Use saved searches to filter your results more quickly + + + + + + + + + + + + + + + +Name + + + + + + +Query + + + + To see all available qualifiers, see our documentation. + + + + + + + + Cancel + + Create saved search + + + + + + + + + Sign in + + + + Sign up + + + + + + + + + + +You signed in with another tab or window. Reload to refresh your session. +You signed out in another tab or window. Reload to refresh your session. +You switched accounts on another tab or window. Reload to refresh your session. + + + +Dismiss alert + + + + + + + + + + + + This repository has been archived by the owner on Jan 23, 2023. It is now read-only. + + + + + + + + + + + dotnet + +/ + +corefx + +Public archive + + + + + + + +Notifications + You must be signed in to change notification settings + + + + +Fork + 5k + + + + + + + + Star + 17.7k + + + + + + + + + + + + + + + + + + + +Code + + + + + + + +Pull requests +0 + + + + + + +Security + + + + + + + +Insights + + + + + + + + +Additional navigation options + + + + + + + + + + + + + + Code + + + + + + + + + + + Pull requests + + + + + + + + + + + Security + + + + + + + + + + + Insights + + + + + + + + + + + + + + + + + + + + + + +Footer + + + + + + + + + © 2024 GitHub, Inc. + + + +Footer navigation + + +Terms + + +Privacy + + +Security + + +Status + + +Docs + + +Contact + + + + + Manage cookies + + + + + + + Do not share my personal information + + + + + + + + + + + + + + + + + + You can’t perform that action at this time. +``` + +
+ + +
+System.Threading.Channels 7.0.0 ## System.Threading.Channels -- Version: 6.0.0 +- Version: 7.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/7.0.0) - License: [MIT]( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) @@ -22548,9 +23765,6 @@ corefx/LICENSE.TXT at master · dotnet/corefx · GitHub - - - @@ -22568,6 +23782,7 @@ Skip to content +Navigation Menu Toggle navigation @@ -22652,7 +23867,7 @@ Codespaces -Copilot +GitHub Copilot Write better code with AI @@ -22781,8 +23996,6 @@ By Solution - - DevSecOps @@ -22884,6 +24097,65 @@ Repositories + + Enterprise + + + + + + + + + + + + + +Enterprise platform + AI-powered developer platform + + + + + +Available add-ons + + + + + + + +Advanced Security + Enterprise-grade security features + + + + + + + + +GitHub Copilot + Enterprise-grade AI features + + + + + + + + +Premium Support + Enterprise-grade 24/7 support + + + + + + + Pricing @@ -22940,6 +24212,26 @@ Clear + + + + + + + + + + + + + + + + + + + + @@ -23089,7 +24381,6 @@ Dismiss alert - This repository has been archived by the owner on Jan 23, 2023. It is now read-only. @@ -23116,13 +24407,13 @@ Public archive Notifications - + You must be signed in to change notification settings Fork - 5.1k + 5k @@ -23131,7 +24422,7 @@ Fork Star - 17.8k + 17.7k @@ -23149,6 +24440,8 @@ Fork + + Code @@ -23195,6 +24488,7 @@ Additional navigation options + Code @@ -23260,7 +24554,7 @@ Footer - © 2024 GitHub, Inc. + © 2024 GitHub, Inc. @@ -23319,14 +24613,14 @@ Contact
-System.Threading.Channels 7.0.0 +System.Threading.Channels 8.0.0 ## System.Threading.Channels -- Version: 7.0.0 +- Version: 8.0.0 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/7.0.0) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/8.0.0) - License: [MIT]( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) @@ -23373,9 +24667,6 @@ corefx/LICENSE.TXT at master · dotnet/corefx · GitHub - - - @@ -23393,6 +24684,7 @@ Skip to content +Navigation Menu Toggle navigation @@ -23477,7 +24769,7 @@ Codespaces -Copilot +GitHub Copilot Write better code with AI @@ -23606,8 +24898,6 @@ By Solution - - DevSecOps @@ -23709,6 +24999,65 @@ Repositories + + Enterprise + + + + + + + + + + + + + +Enterprise platform + AI-powered developer platform + + + + + +Available add-ons + + + + + + + +Advanced Security + Enterprise-grade security features + + + + + + + + +GitHub Copilot + Enterprise-grade AI features + + + + + + + + +Premium Support + Enterprise-grade 24/7 support + + + + + + + Pricing @@ -23765,6 +25114,26 @@ Clear + + + + + + + + + + + + + + + + + + + + @@ -23914,7 +25283,6 @@ Dismiss alert - This repository has been archived by the owner on Jan 23, 2023. It is now read-only. @@ -23941,13 +25309,13 @@ Public archive Notifications - + You must be signed in to change notification settings Fork - 5.1k + 5k @@ -23956,7 +25324,7 @@ Fork Star - 17.8k + 17.7k @@ -23974,6 +25342,8 @@ Fork + + Code @@ -24020,6 +25390,7 @@ Additional navigation options + Code @@ -24085,7 +25456,7 @@ Footer - © 2024 GitHub, Inc. + © 2024 GitHub, Inc. @@ -25374,14 +26745,14 @@ consequential or other damages.
-TestableIO.System.IO.Abstractions 20.0.4 +TestableIO.System.IO.Abstractions 21.0.2 ## TestableIO.System.IO.Abstractions -- Version: 20.0.4 +- Version: 21.0.2 - Authors: Tatham Oddie & friends - Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions/20.0.4) +- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions/21.0.2) - License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -25415,14 +26786,14 @@ SOFTWARE.
-TestableIO.System.IO.Abstractions.TestingHelpers 20.0.4 +TestableIO.System.IO.Abstractions.TestingHelpers 21.0.2 ## TestableIO.System.IO.Abstractions.TestingHelpers -- Version: 20.0.4 +- Version: 21.0.2 - Authors: Tatham Oddie & friends - Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions.TestingHelpers/20.0.4) +- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions.TestingHelpers/21.0.2) - License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -25456,14 +26827,14 @@ SOFTWARE.
-TestableIO.System.IO.Abstractions.Wrappers 20.0.4 +TestableIO.System.IO.Abstractions.Wrappers 21.0.2 ## TestableIO.System.IO.Abstractions.Wrappers -- Version: 20.0.4 +- Version: 21.0.2 - Authors: Tatham Oddie & friends - Project URL: https://github.com/TestableIO/System.IO.Abstractions -- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions.Wrappers/20.0.4) +- Source: [NuGet](https://www.nuget.org/packages/TestableIO.System.IO.Abstractions.Wrappers/21.0.2) - License: [MIT](https://github.com/TestableIO/System.IO.Abstractions/raw/main/LICENSE) @@ -25618,14 +26989,14 @@ SOFTWARE.
-coverlet.collector 6.0.0 +coverlet.collector 6.0.2 ## coverlet.collector -- Version: 6.0.0 +- Version: 6.0.2 - Authors: tonerdo - Project URL: https://github.com/coverlet-coverage/coverlet -- Source: [NuGet](https://www.nuget.org/packages/coverlet.collector/6.0.0) +- Source: [NuGet](https://www.nuget.org/packages/coverlet.collector/6.0.2) - License: [MIT](https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) @@ -31717,7 +33088,7 @@ consequential or other damages. ``` MIT License -Copyright (c) 2019-2023 Josh Keegan +Copyright (c) 2019-2024 Josh Keegan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -31742,13 +33113,13 @@ SOFTWARE.
-xunit 2.6.5 +xunit 2.8.1 ## xunit -- Version: 2.6.5 +- Version: 2.8.1 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit/2.6.5) +- Source: [NuGet](https://www.nuget.org/packages/xunit/2.8.1) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -31874,13 +33245,13 @@ Both sets of code are covered by the following license:
-xunit.analyzers 1.9.0 +xunit.analyzers 1.14.0 ## xunit.analyzers -- Version: 1.9.0 +- Version: 1.14.0 - Authors: jnewkirk,bradwilson,marcind -- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/1.9.0) +- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/1.14.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit.analyzers/master/LICENSE) @@ -31905,13 +33276,13 @@ limitations under the License.
-xunit.assert 2.6.5 +xunit.assert 2.8.1 ## xunit.assert -- Version: 2.6.5 +- Version: 2.8.1 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.6.5) +- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.8.1) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -31970,13 +33341,13 @@ Both sets of code are covered by the following license:
-xunit.core 2.6.5 +xunit.core 2.8.1 ## xunit.core -- Version: 2.6.5 +- Version: 2.8.1 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.6.5) +- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.8.1) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -32035,13 +33406,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.core 2.6.5 +xunit.extensibility.core 2.8.1 ## xunit.extensibility.core -- Version: 2.6.5 +- Version: 2.8.1 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.6.5) +- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.8.1) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -32100,13 +33471,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.execution 2.6.5 +xunit.extensibility.execution 2.8.1 ## xunit.extensibility.execution -- Version: 2.6.5 +- Version: 2.8.1 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.6.5) +- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.8.1) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -32165,13 +33536,13 @@ Both sets of code are covered by the following license:
-xunit.runner.visualstudio 2.5.6 +xunit.runner.visualstudio 2.8.1 ## xunit.runner.visualstudio -- Version: 2.5.6 +- Version: 2.8.1 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.5.6) +- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.8.1) - License: [MIT]( https://licenses.nuget.org/MIT) diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index 8757d6ee4..b471101d9 100755 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -1,4 +1,4 @@ -