Skip to content

Commit

Permalink
Merge pull request #2548 from FirelyTeam/feature/2519-create-terminol…
Browse files Browse the repository at this point in the history
…ogy-service-factory

feature: create factory methods for "core" terminology service
  • Loading branch information
ewoutkramer authored Jul 24, 2023
2 parents 2186f26 + 5fca132 commit 606f648
Show file tree
Hide file tree
Showing 7 changed files with 137 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ namespace Hl7.Fhir.Specification.Terminology
public class MimeTypeTerminologyService : ITerminologyService
{
private const string MIMETYPE_SYSTEM = "urn:ietf:bcp:13";
private const string MIMETYPE_VALUESET_R4_AND_UP = "http://hl7.org/fhir/ValueSet/mimetypes";
private const string MIMETYPE_VALUESET_STU3 = "http://www.rfc-editor.org/bcp/bcp13.txt";
public const string MIMETYPE_VALUESET_R4_AND_UP = "http://hl7.org/fhir/ValueSet/mimetypes";
public const string MIMETYPE_VALUESET_STU3 = "http://www.rfc-editor.org/bcp/bcp13.txt";

///<inheritdoc />
public T.Task<Resource> Closure(Parameters parameters, bool useGet = false) => throw new NotImplementedException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ public LocalTerminologyService(IAsyncResourceResolver resolver, ValueSetExpander
_expander = new ValueSetExpander(settings);
}

/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
return TerminologyServiceFactory.CreateDefaultForCore(coreResourceResolver, expanderSettings);
}

internal async T.Task<ValueSet?> FindValueset(string canonical)
{
var valueset = await _resolver.FindValueSetAsync(canonical).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#nullable enable

using Hl7.Fhir.Specification.Source;

namespace Hl7.Fhir.Specification.Terminology
{
public static class TerminologyServiceFactory
{
/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
var mimeTypeRoutingSettings = new TerminologyServiceRoutingSettings(new MimeTypeTerminologyService())
{
PreferredValueSets = new string[]
{
MimeTypeTerminologyService.MIMETYPE_VALUESET_R4_AND_UP
}
};

var localTermRoutingSettings = new TerminologyServiceRoutingSettings(new LocalTerminologyService(coreResourceResolver, expanderSettings))
{
PreferredValueSets = new string[]
{
"http://hl7.org/fhir/ValueSet/"
}
};

return new MultiTerminologyService(mimeTypeRoutingSettings, localTermRoutingSettings);
}

}
}

#nullable restore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,18 @@ public LocalTerminologyService(IAsyncResourceResolver resolver, ValueSetExpander
_expander = new ValueSetExpander(settings);
}


/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
return TerminologyServiceFactory.CreateDefaultForCore(coreResourceResolver, expanderSettings);
}

internal async T.Task<ValueSet?> FindValueset(string canonical)
{
var valueset = await _resolver.FindValueSetAsync(canonical).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#nullable enable

using Hl7.Fhir.Specification.Source;

namespace Hl7.Fhir.Specification.Terminology
{
public static class TerminologyServiceFactory
{
/// <summary>
/// Creates a MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets.
/// </summary>
/// <param name="coreResourceResolver">Resource resolves to resolve FHIR core artifacts</param>
/// <param name="expanderSettings">ValueSet expansion settings</param>
/// <returns>A MultiTerminologyService, which combines a LocalTerminologyService to retrieve the core FHIR resources with custom services to validate some implicit core ValueSets</returns>
public static MultiTerminologyService CreateDefaultForCore(IAsyncResourceResolver coreResourceResolver, ValueSetExpanderSettings? expanderSettings = null)
{
var mimeTypeRoutingSettings = new TerminologyServiceRoutingSettings(new MimeTypeTerminologyService())
{
PreferredValueSets = new string[]
{
MimeTypeTerminologyService.MIMETYPE_VALUESET_STU3
}
};

var localTermRoutingSettings = new TerminologyServiceRoutingSettings(new LocalTerminologyService(coreResourceResolver, expanderSettings))
{
PreferredValueSets = new string[]
{
"http://hl7.org/fhir/ValueSet/"
}
};

return new MultiTerminologyService(mimeTypeRoutingSettings, localTermRoutingSettings);
}

}
}

#nullable restore
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,22 @@ public async Task CodingWithValuesetAsSystem(string valueset, string code, strin
result.Parameter.Should().Contain(p => p.Name == "message")
.Subject.Value.Should().BeEquivalentTo(new FhirString($"The Coding references a value set, not a code system ('{system}')"));
}

[TestMethod]
public async Task DefaultCoreServiceTest()
{
var resolver = new CachedResolver(ZipSource.CreateValidationSource());
var service = LocalTerminologyService.CreateDefaultForCore(resolver);

var parameters = new ValidateCodeParameters()
.WithValueSet("http://www.rfc-editor.org/bcp/bcp13.txt")
.WithCode(code: "application/json", context: "context")
.Build();

var result = await service.ValueSetValidateCode(parameters);

result.Parameter.Should().Contain(p => p.Name == "result")
.Subject.Value.Should().BeEquivalentTo(new FhirBoolean(true));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,22 @@ public async Task CodingWithValuesetAsSystem(string valueset, string code, strin
result.Parameter.Should().Contain(p => p.Name == "message")
.Subject.Value.Should().BeEquivalentTo(new FhirString($"The Coding references a value set, not a code system ('{system}')"));
}

[TestMethod]
public async Task DefaultCoreServiceTest()
{
var resolver = new CachedResolver(ZipSource.CreateValidationSource());
var service = LocalTerminologyService.CreateDefaultForCore(resolver);

var parameters = new ValidateCodeParameters()
.WithValueSet("http://hl7.org/fhir/ValueSet/mimetypes")
.WithCode(code: "application/json", context: "context")
.Build();

var result = await service.ValueSetValidateCode(parameters);

result.Parameter.Should().Contain(p => p.Name == "result")
.Subject.Value.Should().BeEquivalentTo(new FhirBoolean(true));
}
}
}

0 comments on commit 606f648

Please sign in to comment.