diff --git a/.github/.gitversion.yml b/.github/.gitversion.yml index ae6015301..6486d5775 100644 --- a/.github/.gitversion.yml +++ b/.github/.gitversion.yml @@ -29,4 +29,4 @@ branches: ignore: sha: [] merge-message-formats: {} -next-version: 0.3.14 +next-version: 0.3.17 diff --git a/docs/api/rest/config.md b/docs/api/rest/config.md index e4c3cd5af..ad760d1cf 100644 --- a/docs/api/rest/config.md +++ b/docs/api/rest/config.md @@ -287,7 +287,7 @@ curl --location --request DELETE 'http://localhost:5000/config/ae/breast-tumor' ## GET /config/ae/plug-ins -Returns a list of data input plug-ins that can be used with SCP Application Entity. +Returns a list of data input plug-ins that can be used with the SCP Application Entity. ### Parameters @@ -295,11 +295,12 @@ N/A ### Responses -Response Content Type: JSON - An object containing zero or more key-value pairs where the key is the name of the plug-in and the value is the fully qualified assembly type name of the plug-in. +Response Content Type: JSON - An object containing zero or more key-value pairs, where the key is the name of the plug-in and +the value is the fully qualified assembly type name of the plug-in. | Code | Description | | ---- | --------------------------------------------------------------------------------------------------------------------------------------- | -| 200 | Plug-ins retrieved successfully. | +| 200 | Plug-ins retrieved successfully. | | 500 | Server error. The response will be a [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) object with server error details. | ### Example Request @@ -807,7 +808,7 @@ curl --location --request DELETE 'http://localhost:5000/config/destination/USEAS ## GET /config/destination/plug-ins -Returns a list of data output plug-ins that can be used with SCP Application Entity. +Returns a list of data output plug-ins that can be used with the SCP Application Entity. ### Parameters @@ -815,11 +816,12 @@ N/A ### Responses -Response Content Type: JSON - An object containing zero or more key-value pairs where the key is the name of the plug-in and the value is the fully qualified assembly type name of the plug-in. +Response Content Type: JSON - An object containing zero or more key-value pairs, where the key is the name of the plug-in +and the value is the fully qualified assembly type name of the plug-in. | Code | Description | | ---- | --------------------------------------------------------------------------------------------------------------------------------------- | -| 200 | Plug-ins retrieved successfully. | +| 200 | Plug-ins retrieved successfully. | | 500 | Server error. The response will be a [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) object with server error details. | ### Example Request diff --git a/docs/api/rest/dicomweb-stow.md b/docs/api/rest/dicomweb-stow.md index 01fb772b6..1b870c031 100644 --- a/docs/api/rest/dicomweb-stow.md +++ b/docs/api/rest/dicomweb-stow.md @@ -41,7 +41,7 @@ Triggers a new workflow request with the uploaded DICOM dataset. | Name | Type | Description | | ------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| study-instance-uid | string | (Optional) Associate the DICOM dataset with a StudyInstanceUID. Note that the service records any mismatch between the StudyInstanceUID header and the provided value in the response as `Warning Reason (0008,1196)` = `B007`. | +| study-instance-uid | string | (Optional) Associate the DICOM dataset with a StudyInstanceUID. Note that the service records any mismatch between the StudyInstanceUID header and the provided value in the response as `Warning Reason (0008,1196) = B007`. | #### Request Body @@ -85,7 +85,7 @@ Triggers the specified workflow with the uploaded DICOM dataset. | Name | Type | Description | | ------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | workflow-id | string | The unique identifier of the workflow registered with the Workflow Manager. | -| study-instance-uid | string | (Optional) Associate the DICOM dataset with a StudyInstanceUID. Note that the service records any mismatch between the StudyInstanceUID header and the provided value in the response as `Warning Reason (0008,1196)` = `B007`. | +| study-instance-uid | string | (Optional) Associate the DICOM dataset with a StudyInstanceUID. Note that the service records any mismatch between the StudyInstanceUID header and the provided value in the response as `Warning Reason (0008,1196) = B007`. | #### Request Body @@ -101,12 +101,12 @@ Response Content Type: `JSON` | Code | Data Type | Description | | ---- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | 200 | [DicomDataset](https://github.com/fo-dicom/fo-dicom/blob/development/FO-DICOM.Core/DicomDataset.cs) | All instances are received and stored successfully. | -| 202 | [DicomDataset](https://github.com/fo-dicom/fo-dicom/blob/development/FO-DICOM.Core/DicomDataset.cs) | All instances are received and stored with warnings (e.g. for a mismatched StudyInstanceUID. | +| 202 | [DicomDataset](https://github.com/fo-dicom/fo-dicom/blob/development/FO-DICOM.Core/DicomDataset.cs) | All instances are received and stored with warnings (e.g. for a mismatched StudyInstanceUID).| | 204 | `none` | No data is provided. | | 400 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Request contains invalid values. | -| 415 | `none` | Unsupported media type. | -| 500 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Server error. | -| 507 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Insufficient storage. | +| 415 | `none` | Unsupported media type | +| 500 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Server error | +| 507 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Insufficient storage | --- @@ -133,9 +133,9 @@ takes precedence when specified. | Name | Type | Description | | ------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| aet | string | A registered Virtual Application Entity. | -| workflow-id | string | The unique identifier of the workflow registered with the Workflow Manager. | -| study-instance-uid | string | (Optional) Associate the DICOM dataset with a StudyInstanceUID. Note that the service records any mismatch between the StudyInstanceUID header and the provided value in the response as `Warning Reason (0008,1196)` = `B007`. | +| aet | string | A registered Virtual Application Entity | +| workflow-id | string | The unique identifier of the workflow registered with the Workflow Manager | +| study-instance-uid | string | (Optional) A StudyInstanceUID to associate the DICOM dataset with. Note that the service records any mismatch between the StudyInstanceUID header and the provided value in the response as `Warning Reason (0008,1196) = B007`.| #### Request Body @@ -154,6 +154,6 @@ Response Content Type: `JSON` | 202 | [DicomDataset](https://github.com/fo-dicom/fo-dicom/blob/development/FO-DICOM.Core/DicomDataset.cs) | All instances are received and stored with warnings (e.g. for a mismatched StudyInstanceUID. | | 204 | `none` | No data is provided. | | 400 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Request contains invalid values. | -| 415 | `none` | Unsupported media type. | -| 500 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Server error. | -| 507 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Insufficient storage. | +| 415 | `none` | Unsupported media type | +| 500 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Server error | +| 507 | [Problem details](https://datatracker.ietf.org/doc/html/rfc7807) | Insufficient storage | diff --git a/docs/changelog.md b/docs/changelog.md index fe843f619..68d61ce7f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -22,7 +22,7 @@ [GitHub Milestone 0.4.0](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/5) - gh-435 Fix CLI to read log dir path from NLog config file. -- gh-425 New Virtual Application Entity support for DICOMWeb STOW-RS APIs to enable dynamic endpoints. +- gh-425 New Virtual Application Entity support for DICOMWeb STOW-RS APIs to enable dynamic endpoints - gh-421 Integrate updated Workflow Request data structure to support multiple sources. - New data [plug-ins](./plug-ins/overview.md) feature to manipulate incoming outgoing data. @@ -31,7 +31,7 @@ [GitHub Milestone 0.3.21](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/26) -- Remove the need to double copy files to storage service. +- Remove the need to double-copy files to storage service. ## 0.3.20 @@ -43,26 +43,26 @@ [GitHub Milestone 0.3.19](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/24) -- gh-392 Fix GET /config/aetitle URL. +- gh-392 Fix GET `/config/aetitle` URL. ## 0.3.18 [GitHub Milestone 0.3.18](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/23) -- gh-390 New API to retrieve registered source AETs. +- gh-390 New API to retrieve registered source AETs ## 0.3.11 [GitHub Milestone 0.3.17](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/22) -- gh-385 Resets ActionBlock if faulted or cancelled in Payload assembler pipeline. +- gh-385 Resets ActionBlock if faulted or cancelled in the Payload assembler pipeline. ## 0.3.16 [GitHub Milestone 0.3.16](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/milestone/21) -- gh-347 Set time limit when calling Storage List/Verify APIs +- gh-347 Set time limit when calling Storage List/Verify APIs. ## 0.3.15 diff --git a/docs/index.md b/docs/index.md index 4b6f8b9d0..c9c5ce24d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,7 +47,7 @@ Licensed under the [Apache-2.0](https://github.com/Project-MONAI/monai-deploy-in This software uses the Microsoft .NET 6.0 library, and the use of this software is subject to the [Microsoft software license terms](https://dotnet.microsoft.com/en-us/dotnet_library_license.htm). -By downloading this software, you agree to the license terms & all licenses listed on the [third-party licenses](./compliance/third-party-licenses.md) page. +By downloading this software, you agree to the license terms and all licenses listed on the [third-party licenses](./compliance/third-party-licenses.md) page. ## Links diff --git a/docs/plug-ins/overview.md b/docs/plug-ins/overview.md index 4488b1089..198197a7b 100644 --- a/docs/plug-ins/overview.md +++ b/docs/plug-ins/overview.md @@ -22,12 +22,14 @@ Data plug-ins enable manipulation of incoming data before they are saved to the The Informatics Gateway allows you to configure data plug-ins in the following services: -- (DIMSE) MONAI Deploy DICOM Listener: configure each listening AE Title with zero or more data plug-ins via the [CLI](../setup/cli.md) or via the [Configuration API](../api/rest/config.md). -- (DIMSE) DICOM Export: configure the `PluginAssemblies` with one or more data plug-ins in the [ExportRequestEvent](https://github.com/Project-MONAI/monai-deploy-messaging/blob/main/src/Messaging/Events/ExportRequestEvent.cs#L85). +- (DIMSE) MONAI Deploy DICOM Listener: Configure each listening AE Title with zero or more data plug-ins via the + [CLI](../setup/cli.md) or via the [Configuration API](../api/rest/config.md). +- (DIMSE) DICOM Export: configure the `Plug-inAssemblies` with one or more data plug-ins in the [ExportRequestEvent](https://github.com/Project-MONAI/monai-deploy-messaging/blob/main/src/Messaging/Events/ExportRequestEvent.cs#L85). - (DICOMWeb) STOW-RS: - - The Virtual AE endpoints (`/dicomweb/vae/...`) can be configured similarly to the DICOM listener by using the [DICOMWeb STOW API](../api/rest/dicomweb-stow.md##post-dicomwebvaeaetworkflow-idstudiesstudy-instance-uid). - - For the default `/dicomweb/...` endpoints, set zero or more plug-ins under `InformaticsGateway>dicomWeb>plug-ins` in the `appsettings.json` [configuration](../setup/schema.md) file. -- (DICOMWeb) Export: configure the `PluginAssemblies` with one or more data plug-ins in the [ExportRequestEvent](https://github.com/Project-MONAI/monai-deploy-messaging/blob/main/src/Messaging/Events/ExportRequestEvent.cs#L85). + - The Virtual AE endpoints (`/dicomweb/vae/...`) can be configured similarly to the DICOM listener using the [DICOMWeb STOW API](../api/rest/dicomweb-stow.md##post-dicomwebvaeaetworkflow-idstudiesstudy-instance-uid). + - For the default `/dicomweb/...` endpoints, set zero or more plug-ins under `InformaticsGateway>dicomWeb>plug-ins` in the + `appsettings.json` [configuration](../setup/schema.md) file. +- (DICOMWeb) Export: configure the `Plug-inAssemblies` with one or more data plug-ins in the [ExportRequestEvent](https://github.com/Project-MONAI/monai-deploy-messaging/blob/main/src/Messaging/Events/ExportRequestEvent.cs#L85). > [!Note] > When one or more plug-ins are defined, the plug-ins are executed in the order as they are listed. @@ -42,34 +44,41 @@ The following plug-ins are available: | [DicomReidentifier](./remote-app.md) | A plug-in to be used together with the `DicomDeidentifier` plug-in to restore the original DICOM metadata. | `Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution.DicomReidentifier, Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution` | -## Writing Your Plug-ins +## Creating a Plug-in -To write an input data plug-in, implement the [IInputDataPlugin](xref:Monai.Deploy.InformaticsGateway.Api.PlugIns.IInputDataPlugIn) interface and +To create an input data plug-in, implement the [IInputDataPlugin](xref:Monai.Deploy.InformaticsGateway.Api.PlugIns.IInputDataPlugIn) interface and put the [dynamic link library](https://learn.microsoft.com/en-us/troubleshoot/windows-client/deployment/dynamic-link-library) (DLL) in -the `plug-ins/` directories. Similarly, for output data plug-ins, implement the [IOutputDataPlugin](xref:Monai.Deploy.InformaticsGateway.Api.PlugIns.IOutputDataPlugIn) interface. +the `plug-ins/` directories. Similarly, for output data plug-ins, implement the [IOutputDataPlugin](xref:Monai.Deploy.InformaticsGateway.Api.PlugIns.IOutputDataPlugIn) +interface. -Refer to the [Configuration API](../api/rest/config.md) page to retrieve available [input](../api/rest/config.md#get-configaeplug-ins) and [output](../api/rest/config.md#get-configdestinationplug-ins) data plug-ins. +Refer to the [Configuration API](../api/rest/config.md) page to retrieve available [input](../api/rest/config.md#get-configaeplug-ins) and +[output](../api/rest/config.md#get-configdestinationplug-ins) data plug-ins. ### Database Extensions -If a plug-in requires to persist data to the database, extend the [DatabaseRegistrationBase](xref:Monai.Deploy.InformaticsGateway.Database.Api.DatabaseRegistrationBase) class to register your database context and repositories. +If a plug-in requires presistent data in the database, extend the [DatabaseRegistrationBase](xref:Monai.Deploy.InformaticsGateway.Database.Api.DatabaseRegistrationBase) +class to register your database context and repositories. -Refer to the _Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution_ plug-in as a reference. +Refer to the `Monai.Deploy.InformaticsGateway.PlugIns.RemoteAppExecution` plug-in as a reference. > [!Important] -> The Informatics Gateway requires all plug-ins to extend both Entity Framework (sqlite) and MongoDB databases. +> The Informatics Gateway requires all plug-ins to extend both the Entity Framework (SQLite) and MongoDB databases. #### Entity Framework -Implement the [IDatabaseMigrationManagerForPlugIns](xref:Monai.Deploy.InformaticsGateway.Database.Api.IDatabaseMigrationManagerForPlugIns) interface to register your Entity Framework (EF) database context. A `connectionString` is provided to the `Configure(...)` -function when you extend the [DatabaseRegistrationBase](xref:Monai.Deploy.InformaticsGateway.Database.Api.DatabaseRegistrationBase) class and allows you to create your [code-first](https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database) -EF database context and generate your migration code using [dotnet ef](https://learn.microsoft.com/en-us/ef/core/cli/dotnet) CLI tool. +Implement the [IDatabaseMigrationManagerForPlugIns](xref:Monai.Deploy.InformaticsGateway.Database.Api.IDatabaseMigrationManagerForPlugIns) interface to +register your Entity Framework (EF) database context. A `connectionString` is provided to the `Configure(...)` function when you extend the +[DatabaseRegistrationBase](xref:Monai.Deploy.InformaticsGateway.Database.Api.DatabaseRegistrationBase) class, allowing you to create your +[code-first](https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database) EF database context and generate your +migration code using the [dotnet ef](https://learn.microsoft.com/en-us/ef/core/cli/dotnet) CLI tool. -In the following example, we extend [DatabaseRegistrationBase](xref:Monai.Deploy.InformaticsGateway.Database.Api.DatabaseRegistrationBase) class to register a new EF database context named `RemoteAppExecutionDbContext`. +The following example extends the [DatabaseRegistrationBase](xref:Monai.Deploy.InformaticsGateway.Database.Api.DatabaseRegistrationBase) class +to register a new EF database context named `RemoteAppExecutionDbContext`. -In the method, we first register the database context, then register our Migration Manager by implementing the [IDatabaseMigrationManagerForPlugIns](xref:Monai.Deploy.InformaticsGateway.Database.Api.IDatabaseMigrationManagerForPlugIns) interface. -Lastly, we register our repository for the `RemoteAppExecutions` table. +In the method, you first register the database context, then register your Migration Manager by implementing the +[IDatabaseMigrationManagerForPlugIns](xref:Monai.Deploy.InformaticsGateway.Database.Api.IDatabaseMigrationManagerForPlugIns) interface. +Lastly, you register your repository for the `RemoteAppExecutions` table. ```csharp public class DatabaseRegistrar : DatabaseRegistrationBase @@ -97,8 +106,9 @@ public class DatabaseRegistrar : DatabaseRegistrationBase #### MongoDB -Similar to the [Entity Framework](#entity-framework) section above, For MongoDB, we first register our Migration Manager by implementing the [IDatabaseMigrationManagerForPlugIns](xref:Monai.Deploy.InformaticsGateway.Database.Api.IDatabaseMigrationManagerForPlugIns) interface, -and then we register our repository for the `RemoteAppExecutions` collection. +Similar to the [Entity Framework](#entity-framework) section above, for MongoDB you first register your Migration Manager by implementing +the [IDatabaseMigrationManagerForPlugIns](xref:Monai.Deploy.InformaticsGateway.Database.Api.IDatabaseMigrationManagerForPlugIns) interface +and then register your repository for the `RemoteAppExecutions` collection. ```csharp public class DatabaseRegistrar : DatabaseRegistrationBase @@ -122,7 +132,7 @@ public class DatabaseRegistrar : DatabaseRegistrationBase } ``` -In the `MigrationManager`, we configure the `RemoteAppExecutions` collection. +In the `MigrationManager`, configure the `RemoteAppExecutions` collection. ```csharp public class MigrationManager : IDatabaseMigrationManagerForPlugIns diff --git a/docs/plug-ins/remote-app.md b/docs/plug-ins/remote-app.md index 0f870d2cc..83fdc3ae7 100644 --- a/docs/plug-ins/remote-app.md +++ b/docs/plug-ins/remote-app.md @@ -17,7 +17,7 @@ # Remote App Execution Plug-ins The **Remote App Execution Plug-ins** allow the users to configure a set of DICOM metadata to be replaced with dummy data before -being exported using the `DicomDeidentifier` plug-in. The original data is stored in the database so when the data returns +being exported using the `DicomDeidentifier` plug-in. The original data is stored in the database; when the data returns via DICOM DIMSE or DICOMWeb, the data can be restored using the `DicomReidentifier` plug-in. ## Supported Data Types @@ -26,8 +26,8 @@ via DICOM DIMSE or DICOMWeb, the data can be restored using the `DicomReidentifi ## Configuration -One or more DICOM tags may be configured in the `appsettings.json` file. For example, the following snippet will replace -`AccessionNumber`, `StudyDescription`, and `SeriesDescription`. +One or more DICOM tags may be configured in the `appsettings.json` file. For example, the following snippet will replace the +`AccessionNumber`, `StudyDescription`, and `SeriesDescription` tags. ```json { diff --git a/docs/setup/services.md b/docs/setup/services.md index f1c48c181..c64e841fe 100644 --- a/docs/setup/services.md +++ b/docs/setup/services.md @@ -21,7 +21,7 @@ MONAI Deploy Informatics Gateway supports the following standard protocols for c * **DICOM SCP**: C-ECHO, C-STORE * **DICOM SCU**: C-STORE -* **HL7 Server**: A HL7 MLLP listener. +* **HL7 Server**: An HL7 MLLP listener * **ACR DSI API**: [The American College of Radiology�s Data Science Institute API](https://www.acrdsi.org/-/media/DSI/Files/ACR-DSI-Model-API.pdf) * **DICOMweb client**: QIDO-RS, WADO-RS, STOW-RS * **FHIR Server**: POST @@ -32,7 +32,9 @@ MONAI Deploy Informatics Gateway supports the following standard protocols for c ## DICOM SCP -The *DICOM SCP Service* accepts standard DICOM C-ECHO and C-STORE commands, which receive DICOM instances for processing. In addition, the Informatics Gateway groups received DICOM instances by the study or series based on the configuration. Once DICOM instances are grouped, they are assembled into a payload for the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) to consume. +The *DICOM SCP Service* accepts standard DICOM C-ECHO and C-STORE commands, which receive DICOM instances for processing. In addition, +the Informatics Gateway groups received DICOM instances by the study or series based on the configuration. Once DICOM instances are grouped, +they are assembled into a payload for the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) to consume. ### Workflow Request @@ -44,15 +46,18 @@ With a DICOM SCP triggered workflow request, the data trigger contains the follo ## DICOM SCU -The *DICOM SCU Service* enables users to export application-generated DICOM results to external DICOM devices. It subscribes to the `md.export.request.monaiscu` events generated by the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) and then exports the data to user-configured DICOM destination(s). +The *DICOM SCU Service* allows users to export application-generated DICOM results to external DICOM devices. It subscribes +to the `md.export.request.monaiscu` events generated by the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager), +then exports the data to user-configured DICOM destination(s). > [!Note] -> DICOM instances are sent as-is; no codec conversion is done as part of the SCU process. +> DICOM instances are sent as-is; no codec conversion is done as part of the SCU process. > See the [DICOM Interface SCU](../compliance/dicom.md#dimse-services-scu) section for more information. ## DICOMWeb STOW-RS -The *DICOMWeb STOW-RS Service* allows users to trigger a new workflow request by uploading a DICOM dataset. The entire DICOM dataset is assembled into a payload for the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) to consume. +The *DICOMWeb STOW-RS Service* allows users to trigger a new workflow request by uploading a DICOM dataset. The entire DICOM dataset is assembled into a +payload for the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) to consume. It provides options to trigger a workflow with or without specifying a workflow ID/name. See the [DICOMWeb STOW-RS](../api/rest/dicomweb-stow.md) section for more information. @@ -66,11 +71,13 @@ With a DICOMWeb STOW-RS triggered workflow request, the data trigger contains th ## HL7 MLLP Server -The *HL7 MLLP Server* accepts Health Level 7 messages via the MLLP (Minimal Lower Layer Protocol). The received messages are validated and assembled into a payload for the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) to consume. +The *HL7 MLLP Server* accepts Health Level 7 messages via the MLLP (Minimal Lower Layer Protocol). The received messages are +validated and assembled into a payload for the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) +to consume. ### Workflow Request -With an HL7 MLLP Server triggered workflow request, the data trigger contains the following: +If a workflow request is triggered by an HL7 MLLP Server, the data trigger contains the following: - `DataService`: `DataService.HL7` - `Source`: `` @@ -86,7 +93,7 @@ See the [Inference API](../api/rest/inference.md) for more information. ### Workflow Request -With an ACR DSI API triggered workflow request, the data trigger contains the following: +If a workflow request is triggered by the ACR DSI API, the data trigger contains the following: - `DataService`: `DataService.ACR` - `Source`: `` @@ -95,13 +102,13 @@ With an ACR DSI API triggered workflow request, the data trigger contains the fo ## DICOMweb Export A DICOMweb export agent can export any user-generated DICOM content to configured DICOM destinations. The agent -subscribes to the `md.export.request.monaidicomweb` events generated by the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager) -and then exports the data to user-configured DICOMweb destination(s). +subscribes to the `md.export.request.monaidicomweb` events generated by the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager), +then exports the data to user-configured DICOMweb destination(s). ## FHIR Server -The *FHIR Server* accepts FHIR resources as described in the [FHIR API](../api/rest/fhir.md) section. When data arrives at the service, each resource is packaged into a payload and a workflow request is -sent to the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager). +The *FHIR Server* accepts FHIR resources as described in the [FHIR API](../api/rest/fhir.md) section. When data arrives at the service, +each resource is packaged into a payload and a workflow request is sent to the [MONAI Deploy Workflow Manager](https://github.com/Project-MONAI/monai-deploy-workflow-manager). ### Workflow Request diff --git a/docs/setup/setup.md b/docs/setup/setup.md index 7f3092af9..f7e7a794b 100644 --- a/docs/setup/setup.md +++ b/docs/setup/setup.md @@ -42,7 +42,8 @@ Download and install the Informatics Gateway CLI from the [Releases](https://git the repository and install it. > [!Note] -> We use `v0.2.0` release as an example here, always download the latest from the [Releases](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/releases) section. +> The example below uses the `v0.2.0` release; we recommend always downloading the latest version from the [Releases](https://github.com/Project-MONAI/monai-deploy-informatics-gateway/releases) +> section. #### On Linux @@ -179,7 +180,8 @@ Authentication is disabled by default. To enable authentication using OpenID, ed } ``` -Refer to [Authentication Setup Using Keycloak](https://github.com/Project-MONAI/monai-deploy-workflow-manager/blob/develop/guidelines/mwm-auth.md) for additional details. +Refer to the [Authentication Setup Using Keycloak](https://github.com/Project-MONAI/monai-deploy-workflow-manager/blob/develop/guidelines/mwm-auth.md) +section for additional details. ## Storage Consideration & Configuration @@ -342,48 +344,45 @@ The next step is to configure the Informatics Gateway to enable receiving of DIC 1. Configure a listening AE Title to receive instances: -```bash -mig-cli aet add -a BrainAET -grouping 0020,000E, -t 30 -``` - -The command creates a new listening AE Title with AE Title `BrainAET`. The listening AE Title -will group instances by the Series Instance UID (0020,000E) with a timeout value of 30 seconds. + ```bash + mig-cli aet add -a BrainAET -grouping 0020,000E, -t 30 + ``` + The command creates a new listening AE Title with AE Title `BrainAET`. The listening AE Title + will group instances by the Series Instance UID (0020,000E) with a timeout value of 30 seconds. -### Optional: Input Data Plug-ins + Each listening AE Title may be configured with one or more plug-ins to manipulate incoming DICOM files before saving to the storage + service and dispatching a workflow request. To include input data plug-ins, first create your plug-ins by implementing the + [IInputDataPlugIn](xref:Monai.Deploy.InformaticsGateway.Api.PlugIns.IInputDataPlugIn) interface, then add the `-p` argument, with the fully + qualified type name, to the `mig-cli aet add` command. For example, the following command adds the `MyNamespace.AnonymizePlugIn` + and `MyNamespace.FixSeriesData` plug-ins from the `MyNamespace.Plugins` assembly file. -Each listening AE Title may be configured with zero or more plug-ins to manipulate incoming DICOM files before saving to the storage -service and dispatching a workflow request. To include input data plug-ins, first create your plug-ins by implementing the -[IInputDataPlugIn](xref:Monai.Deploy.InformaticsGateway.Api.PlugIns.IInputDataPlugIn) interface and then use `-p` argument with the fully -qualified type name with the `mig-cli aet add` command. For example, the following command adds `MyNamespace.AnonymizePlugIn` -and `MyNamespace.FixSeriesData` plug-ins from the `MyNamespace.Plugins` assembly file. - -```bash -mig-cli aet add -a BrainAET -grouping 0020,000E, -t 30 -p "MyNamespace.AnonymizePlugIn, MyNamespace.PlugIns" "MyNamespace.FixSeriesData, MyNamespace.PlugIns" -``` + ```bash + mig-cli aet add -a BrainAET -grouping 0020,000E, -t 30 -p "MyNamespace.AnonymizePlugIn, MyNamespace.PlugIns" "MyNamespace.FixSeriesData, MyNamespace.PlugIns" + ``` -> [!Note] -> `-grouping` is optional, with a default value of 0020,000D. -> `-t` is optional, with a default value of 5 seconds. -> For complete reference, refer to the [Configuration API](../api/rest/config.md). + > [!Note] + > The `-grouping` argument is optional, with a default value of 0020,000D. + > The `-t` argument is also optional, with a default value of 5 seconds. + > For a complete reference, refer to the [Configuration API](../api/rest/config.md). 2. Enable the receiving of DICOM instances from external DICOM devices: -```bash -mig-cli src add -n PACS-LA -a PACSLA001 --h 20.10.30.55 -``` + ```bash + mig-cli src add -n PACS-LA -a PACSLA001 --h 20.10.30.55 + ``` -The above command tells the Informatics Gateway to accept instances from AE Title `PACSLA001` at IP `20.10.30.55` and port `104`. + The above command tells the Informatics Gateway to accept instances from AE Title `PACSLA001` at IP `20.10.30.55` and port `104`. -> [!Note] -> By default, Informatics Gateway blocks all unknown sources. -> To allow all unknown sources, set the `dicom>scp>rejectUnknownSources` parameter to `false` in the `appsettings.json` file. + > [!Note] + > By default, Informatics Gateway blocks all unknown sources. + > To allow all unknown sources, set the `dicom>scp>rejectUnknownSources` parameter to `false` in the `appsettings.json` file. -> [!WARNING] -> The Informatics Gateway validates both the source IP address and AE Title when `rejectUnknownSources` is set to `true`. -> When the Informatics Gateway is running in a container and data is coming from the localhost, the IP address may not be the same as the host IP address. In this case, open the log file and locate the association that failed; the log should indicate the correct IP address under `Remote host`. + > [!WARNING] + > The Informatics Gateway validates both the source IP address and AE Title when `rejectUnknownSources` is set to `true`. + > When the Informatics Gateway is running in a container and data is coming from the localhost, the IP address may not be the same as the host IP address. In this case, open the log file and locate the association that failed; the log should indicate the correct IP address under `Remote host`. -See [Data Plug-ins](../plug-ins/overview.md) to configure data plug-ins or create your own data plug-ins. + See [Data Plug-ins](../plug-ins/overview.md) to configure data plug-ins or create your own data plug-ins. ## Export Processed Results diff --git a/src/Api/Storage/FileStorageMetadata.cs b/src/Api/Storage/FileStorageMetadata.cs old mode 100755 new mode 100644 index f10db2bce..302612d07 --- a/src/Api/Storage/FileStorageMetadata.cs +++ b/src/Api/Storage/FileStorageMetadata.cs @@ -162,4 +162,4 @@ public static string IpAddress() return "127.0.0.1"; } } -} +} \ No newline at end of file diff --git a/src/CLI/Services/NLogConfigurationOptionAccessor.cs b/src/CLI/Services/NLogConfigurationOptionAccessor.cs old mode 100755 new mode 100644 diff --git a/src/Client/HttpContentExtensions.cs b/src/Client/HttpContentExtensions.cs old mode 100755 new mode 100644 diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/Database/Api/DatabaseRegistrationBase.cs b/src/Database/Api/DatabaseRegistrationBase.cs old mode 100755 new mode 100644 diff --git a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj old mode 100755 new mode 100644 diff --git a/src/Database/Api/Repositories/IVirtualApplicationEntityRepository.cs b/src/Database/Api/Repositories/IVirtualApplicationEntityRepository.cs old mode 100755 new mode 100644 diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs old mode 100755 new mode 100644 index 5c1b08a4b..3c1352d12 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -27,6 +27,8 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api /// public class StorageMetadataWrapper : MongoDBEntityBase { + private readonly JsonSerializerOptions _options; + [JsonPropertyName("correlationId")] public string CorrelationId { get; set; } = string.Empty; @@ -90,4 +92,4 @@ public override string ToString() return $"Identity: {Identity}"; } } -} +} \ No newline at end of file diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs old mode 100755 new mode 100644 diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json old mode 100755 new mode 100644 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 diff --git a/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs old mode 100755 new mode 100644 diff --git a/src/Database/MongoDB/packages.lock.json b/src/Database/MongoDB/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/Database/packages.lock.json b/src/Database/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Common/PlugInLoadingException.cs b/src/InformaticsGateway/Common/PlugInLoadingException.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Common/TypeExtensions.cs b/src/InformaticsGateway/Common/TypeExtensions.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Logging/Log.500.ExportService.cs b/src/InformaticsGateway/Logging/Log.500.ExportService.cs index 813515cb9..5d2b826f6 100644 --- a/src/InformaticsGateway/Logging/Log.500.ExportService.cs +++ b/src/InformaticsGateway/Logging/Log.500.ExportService.cs @@ -129,5 +129,8 @@ public static partial class Log [LoggerMessage(EventId = 535, Level = LogLevel.Warning, Message = "Exceeded maximum number of worker in {serviceName}: {count}.")] public static partial void ExceededMaxmimumNumberOfWorkers(this ILogger logger, string serviceName, ulong count); + + [LoggerMessage(EventId = 536, Level = LogLevel.Error, Message = "Error executing data plug-ins.")] + public static partial void ErrorExecutingDataPlugIns(this ILogger logger, Exception ex); } } diff --git a/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs b/src/InformaticsGateway/Logging/Log.8000.HttpServices.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Repositories/MonaiServiceLocator.cs b/src/InformaticsGateway/Repositories/MonaiServiceLocator.cs old mode 100755 new mode 100644 index d5a00e8e5..07a063760 --- a/src/InformaticsGateway/Repositories/MonaiServiceLocator.cs +++ b/src/InformaticsGateway/Repositories/MonaiServiceLocator.cs @@ -51,8 +51,7 @@ public Dictionary GetServiceStatus() { Guard.Against.Null(type, nameof(type)); - return - (_serviceProvider.GetService(type) as IMonaiService); + return (_serviceProvider.GetService(type) as IMonaiService); } diff --git a/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs b/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs old mode 100755 new mode 100644 index b8edaf95e..4f122da6f --- a/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs +++ b/src/InformaticsGateway/Services/Common/IInputDataPluginEngineFactory.cs @@ -40,6 +40,7 @@ public static class DataPlugInEngineFactoryStatic public abstract class DataPlugInEngineFactoryBase : IDataPlugInEngineFactory { + private static readonly object SyncLock = new(); private readonly IFileSystem _fileSystem; private readonly ILogger> _logger; private readonly Type _type; diff --git a/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/InputDataPluginEngine.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs b/src/InformaticsGateway/Services/Common/OutputDataPluginEngine.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs old mode 100755 new mode 100644 index 121ff24ad..3bc1300fd --- a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs +++ b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs @@ -589,4 +589,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 7d552bdfa..b498cd082 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -219,4 +219,4 @@ public void Dispose() _timer.Stop(); } } -} +} \ No newline at end of file diff --git a/src/InformaticsGateway/Services/Connectors/PayloadMoveActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadMoveActionHandler.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index ff49a6941..84958b577 100755 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -189,4 +189,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 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/DicomWeb/IStowService.cs b/src/InformaticsGateway/Services/DicomWeb/IStowService.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/DicomWeb/IStreamsWriter.cs b/src/InformaticsGateway/Services/DicomWeb/IStreamsWriter.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/DicomWeb/StowService.cs b/src/InformaticsGateway/Services/DicomWeb/StowService.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Export/ExportServiceBase.cs b/src/InformaticsGateway/Services/Export/ExportServiceBase.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs b/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs old mode 100755 new mode 100644 index 75da98fd0..7dc3ba299 --- a/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs +++ b/src/InformaticsGateway/Services/Fhir/FhirJsonReader.cs @@ -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/FhirService.cs b/src/InformaticsGateway/Services/Fhir/FhirService.cs old mode 100755 new mode 100644 index d3203be73..0cd2830ca --- a/src/InformaticsGateway/Services/Fhir/FhirService.cs +++ b/src/InformaticsGateway/Services/Fhir/FhirService.cs @@ -118,4 +118,4 @@ private IFHirRequestReader GetRequestReader(MediaTypeHeaderValue mediaTypeHeader throw new UnsupportedContentTypeException($"Media type of '{mediaTypeHeaderValue.MediaType}' is not supported."); } } -} +} \ No newline at end of file diff --git a/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs b/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs old mode 100755 new mode 100644 index fcb936afc..465e609e0 --- a/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs +++ b/src/InformaticsGateway/Services/Fhir/FhirXmlReader.cs @@ -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/IMllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs old mode 100755 new mode 100644 index 30695f6c7..8e38ac846 --- a/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/IMllpClient.cs @@ -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/MllpClient.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs old mode 100755 new mode 100644 index f7233deb1..0a79c8d1f --- a/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpClient.cs @@ -247,4 +247,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} +} \ No newline at end of file diff --git a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs index d326eb788..24f7269cf 100755 --- a/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs +++ b/src/InformaticsGateway/Services/HealthLevel7/MllpService.cs @@ -223,4 +223,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} +} \ No newline at end of file diff --git a/src/InformaticsGateway/Services/Http/DicomWeb/StowController.cs b/src/InformaticsGateway/Services/Http/DicomWeb/StowController.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs old mode 100755 new mode 100644 index cb64d1dff..19e302a99 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityHandler.cs @@ -167,4 +167,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 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Scp/ScpService.cs b/src/InformaticsGateway/Services/Scp/ScpService.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs old mode 100755 new mode 100644 index e2d46eb66..9a219f185 --- a/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs +++ b/src/InformaticsGateway/Services/Storage/ObjectUploadService.cs @@ -193,7 +193,7 @@ private async Task UploadFileAndConfirm(string identifier, StorageObjectMetadata while ( count-- > 0 && !await VerifyExists(storageObjectMetadata.GetPayloadPath(Guid.Parse(payloadId)), cancellationToken).ConfigureAwait(false) - ) { /* do nothing! was this the intent? */}; + ) { /* no op */}; if (count <= 0) { diff --git a/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/InputDataPluginEngineTest.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs b/src/InformaticsGateway/Test/Services/Common/OutputDataPluginEngineTest.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs b/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs index e72c397e2..f7b445681 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs @@ -844,4 +844,4 @@ private static void BlockUntilCancelled(CancellationToken token) WaitHandle.WaitAll(new[] { token.WaitHandle }); } } -} +} \ No newline at end of file diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs index a3b5dbfbb..02baac013 100755 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs @@ -177,4 +177,4 @@ public void GivenAPayload_WhenDequedFromPayloadAssembler_ExpectThePayloadBeProce _logger.VerifyLogging($"Payload {payload.PayloadId} added to {service.ServiceName} for processing.", LogLevel.Information, Times.AtLeastOnce()); } } -} +} \ No newline at end of file diff --git a/src/InformaticsGateway/Test/Services/DicomWeb/StowServiceTest.cs b/src/InformaticsGateway/Test/Services/DicomWeb/StowServiceTest.cs old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs index 242021b01..0c8abe39e 100755 --- a/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/HealthLevel7/MllpServiceTest.cs @@ -309,4 +309,4 @@ public async Task GivenATcpClientWithHl7Messages_WhenDisconnected_ExpectMessageT _payloadAssembler.Verify(p => p.Queue(It.IsAny(), 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 old mode 100755 new mode 100644 diff --git a/src/InformaticsGateway/packages.lock.json b/src/InformaticsGateway/packages.lock.json old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs b/src/Plug-ins/RemoteAppExecution/Database/DatabaseRegistrar.cs old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs b/src/Plug-ins/RemoteAppExecution/DicomDeidentifier.cs old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/Log.10000.DataPlugins.cs b/src/Plug-ins/RemoteAppExecution/Log.10000.DataPlugins.cs old mode 100755 new mode 100644 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 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs b/src/Plug-ins/RemoteAppExecution/RemoteAppExecution.cs old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/SR.cs b/src/Plug-ins/RemoteAppExecution/SR.cs old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs b/src/Plug-ins/RemoteAppExecution/Test/Database/DatabaseRegistrarTest.cs old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomDeidentifierTest.cs old mode 100755 new mode 100644 diff --git a/src/Plug-ins/RemoteAppExecution/Test/DicomReidentifierTest.cs b/src/Plug-ins/RemoteAppExecution/Test/DicomReidentifierTest.cs old mode 100755 new mode 100644 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 diff --git a/src/Plug-ins/RemoteAppExecution/packages.lock.json b/src/Plug-ins/RemoteAppExecution/packages.lock.json old mode 100755 new mode 100644 diff --git a/tests/Integration.Test/packages.lock.json b/tests/Integration.Test/packages.lock.json old mode 100755 new mode 100644