Skip to content

Commit e3daeb7

Browse files
authored
Merge pull request #833 from Project-MONAI/AC-2258
fixing email validation
2 parents 4db093d + dc10561 commit e3daeb7

File tree

3 files changed

+101
-5
lines changed

3 files changed

+101
-5
lines changed

src/Shared/Shared/Utilities/DicomTagUtilities.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17+
using System.Text.RegularExpressions;
1718
using FellowOakDicom;
1819

1920
namespace Monai.Deploy.WorkflowManager.Shared.Utilities
@@ -22,7 +23,7 @@ public static class DicomTagUtilities
2223
{
2324
public static DicomTag GetDicomTagByName(string tag)
2425
{
25-
return DicomDictionary.Default[tag];
26+
return DicomDictionary.Default[tag] ?? DicomDictionary.Default[Regex.Replace(tag, @"\s+", "", RegexOptions.None, TimeSpan.FromSeconds(1))];
2627
}
2728

2829
public static (bool valid, IList<string> invalidTags) DicomTagsValid(IEnumerable<string> dicomTags)

src/WorkflowManager/WorkflowManager/Validators/WorkflowValidator.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ private void ValidateEmailTask(TaskObject currentTask)
457457
if (emailsSpecified)
458458
{
459459
var emails = currentTask.Args[RecipientEmails] ?? string.Empty;
460-
var formattedEmails = emails.Split(',').Where(e => !string.IsNullOrWhiteSpace(e.Trim()));
460+
var formattedEmails = emails.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
461461

462462
if (!formattedEmails.Any())
463463
{
@@ -498,7 +498,7 @@ private void ValidateEmailTask(TaskObject currentTask)
498498
if (rolesSpecified)
499499
{
500500
var roles = currentTask.Args[RecipientRoles] ?? string.Empty;
501-
var formattedRoles = roles.Split(',').Where(r => !string.IsNullOrWhiteSpace(r.Trim()));
501+
var formattedRoles = roles.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
502502

503503
if (!formattedRoles.Any())
504504
{
@@ -514,15 +514,15 @@ private void ValidateEmailTask(TaskObject currentTask)
514514
}
515515

516516
var metadataValues = currentTask.Args[MetadataValues] ?? string.Empty;
517-
var formattedMetadataValues = metadataValues.Split(',').Where(m => !string.IsNullOrWhiteSpace(m.Trim()));
517+
var formattedMetadataValues = metadataValues.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
518518

519519
if (!formattedMetadataValues.Any())
520520
{
521521
Errors.Add($"Argument '{MetadataValues}' for task {currentTask.Id} must be a comma seperated list of DICOM metadata tag names.");
522522
return;
523523
}
524524

525-
var disallowedTags = _options.Value.DicomTagsDisallowed.Split(',').Select(t => t.Trim());
525+
var disallowedTags = _options.Value.DicomTagsDisallowed.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
526526
var intersect = formattedMetadataValues.Intersect(disallowedTags);
527527

528528
if (intersect.Any())

tests/UnitTests/WorkflowManager.Tests/Validators/WorkflowValidatorTests.cs

+95
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
using System;
18+
using System.Collections.Generic;
1819
using System.Threading.Tasks;
1920
using Microsoft.Extensions.Logging;
2021
using Microsoft.Extensions.Options;
@@ -722,6 +723,100 @@ public async Task ValidateWorkflow_ValidatesEmptyWorkflow_ReturnsErrorsAndHasCor
722723
Assert.Contains(error4, errors);
723724
}
724725

726+
//"metadata_values": "Study Instance UID, Series Instance UID"
727+
[Fact]
728+
public async Task ValidateWorkflow_ValidateWorkflow_WithPluginArgs_ReturnsNoErrors()
729+
{
730+
var workflow = new Workflow
731+
{
732+
Name = "Workflowname1",
733+
Description = "Workflowdesc1",
734+
Version = "1",
735+
InformaticsGateway = new InformaticsGateway
736+
{
737+
AeTitle = "aetitle",
738+
ExportDestinations = new string[] { "oneDestination", "twoDestination", "threeDestination" }
739+
},
740+
Tasks = new TaskObject[]
741+
{
742+
new TaskObject
743+
{
744+
Id = "rootTask",
745+
Type = "router",
746+
Description = "TestDesc",
747+
TaskDestinations = new TaskDestination[]
748+
{
749+
new TaskDestination
750+
{
751+
Name = "EmailTask"
752+
}
753+
},
754+
ExportDestinations = new ExportDestination[]
755+
{
756+
new ExportDestination { Name = "oneDestination" },
757+
new ExportDestination { Name = "twoDestination" },
758+
},
759+
Artifacts = new ArtifactMap
760+
{
761+
Output = new Artifact[]
762+
{
763+
new Artifact
764+
{
765+
Name = "non_unique_artifact",
766+
Mandatory = true,
767+
Value = "Example Value"
768+
}
769+
}
770+
}
771+
},
772+
773+
#region SuccessfulTasksPath
774+
775+
new TaskObject
776+
{
777+
778+
Id = "EmailTask",
779+
Type = "email",
780+
Description = "Email plugin Task 1",
781+
Artifacts = new ArtifactMap{ Input = new Artifact[] {
782+
new Artifact
783+
{
784+
Name = "ExampleArtifact",
785+
Value = "{{ context.value.EmailTask_InvalidEmailsArg.artifact.test }}"
786+
},
787+
} },
788+
Args = new Dictionary<string, string>{
789+
{ "metadata_values", "Study Instance UID, Series Instance UID"},
790+
{ "workflow_name", "Workflow Name"},
791+
{ "recipient_emails", "[email protected]"}
792+
},
793+
TaskDestinations = new TaskDestination[] {
794+
new TaskDestination
795+
{
796+
Name = "taskdesc2"
797+
}
798+
}
799+
},
800+
new TaskObject
801+
{
802+
Id = "taskdesc2",
803+
Type = "router",
804+
Description = "TestDesc",
805+
TaskDestinations = Array.Empty<TaskDestination>()
806+
}
807+
#endregion SuccessfulTasksPath
808+
}
809+
};
810+
811+
_workflowService.Setup(w => w.GetByNameAsync(It.IsAny<string>()))
812+
.ReturnsAsync(null, TimeSpan.FromSeconds(.1));
813+
814+
var errors = await _workflowValidator.ValidateWorkflow(workflow);
815+
816+
Assert.True(errors.Count == 0);
817+
818+
}
819+
725820
[Fact]
726821
public async Task ValidateWorkflow_ValidateWorkflow_ReturnsNoErrors()
727822
{

0 commit comments

Comments
 (0)