From 618930e5bf29331cec067f57b9ac81f91892dd33 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Tue, 14 Nov 2023 06:38:40 +1100 Subject: [PATCH] Planning ahead: Add fhirVersion to R5 Base and IWorkerContext methods, and move IContextResourceLoader, ValidationResult and CodingValidationRequest out of IWorkerContext to their own clasess --- .../loaders/loaderR5/BaseLoaderR5.java | 2 +- .../loaders/loaderR5/R2ToR5Loader.java | 2 +- .../loaders/loaderR5/R3ToR5Loader.java | 2 +- .../loaders/loaderR5/R4BToR5Loader.java | 2 +- .../loaders/loaderR5/R4ToR5Loader.java | 2 +- .../ResourceDependencyPackageBuilder.java | 2 +- .../fhir/r4/conformance/ProfileUtilities.java | 3 +- .../org/hl7/fhir/r4/utils/FHIRPathEngine.java | 3 +- .../hl7/fhir/r4/utils/NarrativeGenerator.java | 3 +- .../fhir/r4/utils/StructureMapUtilities.java | 3 +- .../hl7/fhir/r4/context/CacheTestUtils.java | 3 +- .../r4b/conformance/ProfileUtilities.java | 3 +- .../r4b/renderers/utils/RenderingContext.java | 2 +- .../hl7/fhir/r4b/utils/FHIRPathEngine.java | 3 +- .../structuremap/StructureMapUtilities.java | 3 +- .../hl7/fhir/r4b/context/CacheTestUtils.java | 3 +- .../r5/comparison/ComparisonRenderer.java | 3 +- .../conformance/profile/ProfileUtilities.java | 5 +- .../fhir/r5/context/BaseWorkerContext.java | 107 ++++- .../r5/context/IContextResourceLoader.java | 101 ++++ .../hl7/fhir/r5/context/IWorkerContext.java | 438 +----------------- .../org/hl7/fhir/r5/elementmodel/Element.java | 4 + .../main/java/org/hl7/fhir/r5/model/Base.java | 3 + .../java/org/hl7/fhir/r5/model/Element.java | 6 +- .../java/org/hl7/fhir/r5/model/Resource.java | 7 + .../java/org/hl7/fhir/r5/model/Tuple.java | 11 +- .../hl7/fhir/r5/renderers/DataRenderer.java | 2 +- .../StructureDefinitionRenderer.java | 2 +- .../r5/renderers/TerminologyRenderer.java | 2 +- .../fhir/r5/renderers/ValueSetRenderer.java | 8 +- .../r5/renderers/utils/RenderingContext.java | 2 +- .../utilities/CodingValidationRequest.java | 74 +++ .../utilities}/TerminologyCache.java | 6 +- .../utilities/ValidationResult.java | 259 +++++++++++ .../validation/ValueSetValidator.java | 5 +- .../fhir/r5/test/utils/TestPackageLoader.java | 2 +- .../fhir/r5/test/utils/TestingUtilities.java | 5 +- .../org/hl7/fhir/r5/utils/FHIRPathEngine.java | 5 +- .../fhir/r5/utils/FHIRPathUtilityClasses.java | 9 + .../org/hl7/fhir/r5/utils/GraphQLEngine.java | 8 + .../structuremap/StructureMapUtilities.java | 5 +- .../r5/context/BaseWorkerContextTests.java | 9 +- .../hl7/fhir/r5/context/CacheTestUtils.java | 3 +- .../r5/context/SimpleWorkerContextTests.java | 23 +- .../r5/context/TerminologyCacheTests.java | 8 +- .../utilities/TerminologyServiceOptions.java | 8 +- .../validation/ValidationOptions.java | 15 +- .../org/hl7/fhir/validation/IgLoader.java | 2 +- .../cli/services/ValidationService.java | 2 +- .../codesystem/CodingsObserver.java | 2 +- .../instance/InstanceValidator.java | 10 +- .../instance/type/CodeSystemValidator.java | 3 +- .../instance/type/ConceptMapValidator.java | 4 +- .../instance/type/QuestionnaireValidator.java | 5 +- .../type/StructureDefinitionValidator.java | 5 +- .../instance/type/ValueSetValidator.java | 4 +- .../validation/special/R4R5MapTester.java | 2 +- .../conversion/tests/UtilitiesXTests.java | 2 +- .../tests/TerminologyServiceTests.java | 4 +- .../tests/utilities/TestUtilities.java | 2 +- 60 files changed, 723 insertions(+), 510 deletions(-) create mode 100644 org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IContextResourceLoader.java create mode 100644 org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/CodingValidationRequest.java rename org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/{context => terminologies/utilities}/TerminologyCache.java (99%) create mode 100644 org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValidationResult.java diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/BaseLoaderR5.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/BaseLoaderR5.java index 972eaf711..7ad7c0628 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/BaseLoaderR5.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/BaseLoaderR5.java @@ -6,7 +6,7 @@ import java.util.List; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.model.CanonicalResource; import org.hl7.fhir.r5.model.CanonicalType; import org.hl7.fhir.r5.model.ElementDefinition; diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R2ToR5Loader.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R2ToR5Loader.java index 852d1f317..2326dfe3a 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R2ToR5Loader.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R2ToR5Loader.java @@ -42,7 +42,7 @@ import org.hl7.fhir.dstu2.formats.JsonParser; import org.hl7.fhir.dstu2.formats.XmlParser; import org.hl7.fhir.dstu2.model.Resource; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.model.Bundle; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.Bundle.BundleType; diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R3ToR5Loader.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R3ToR5Loader.java index 7fb37d5b7..9997f8e75 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R3ToR5Loader.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R3ToR5Loader.java @@ -42,7 +42,7 @@ import org.hl7.fhir.dstu3.formats.JsonParser; import org.hl7.fhir.dstu3.formats.XmlParser; import org.hl7.fhir.dstu3.model.Resource; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.model.Bundle; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.Bundle.BundleType; diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4BToR5Loader.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4BToR5Loader.java index aa1f203b2..bc8241154 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4BToR5Loader.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4BToR5Loader.java @@ -43,7 +43,7 @@ import org.hl7.fhir.r4.formats.JsonParser; import org.hl7.fhir.r4.formats.XmlParser; import org.hl7.fhir.r4.model.Resource; import org.hl7.fhir.r5.conformance.StructureDefinitionHacker; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.model.Bundle; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.Bundle.BundleType; diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4ToR5Loader.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4ToR5Loader.java index aed175572..f0aeea721 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4ToR5Loader.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/loaders/loaderR5/R4ToR5Loader.java @@ -43,7 +43,7 @@ import org.hl7.fhir.r4.formats.JsonParser; import org.hl7.fhir.r4.formats.XmlParser; import org.hl7.fhir.r4.model.Resource; import org.hl7.fhir.r5.conformance.StructureDefinitionHacker; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.model.Bundle; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.Bundle.BundleType; diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/misc/ResourceDependencyPackageBuilder.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/misc/ResourceDependencyPackageBuilder.java index ad54bd549..7d1b050d0 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/misc/ResourceDependencyPackageBuilder.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/misc/ResourceDependencyPackageBuilder.java @@ -14,7 +14,7 @@ import org.hl7.fhir.convertors.loaders.loaderR5.R3ToR5Loader; import org.hl7.fhir.convertors.loaders.loaderR5.R4ToR5Loader; import org.hl7.fhir.convertors.loaders.loaderR5.R5ToR5Loader; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.context.SimpleWorkerContext; import org.hl7.fhir.r5.context.SimpleWorkerContext.SimpleWorkerContextBuilder; import org.hl7.fhir.r5.model.CapabilityStatement; diff --git a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java index 602852722..981b00a61 100644 --- a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java +++ b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java @@ -99,6 +99,7 @@ import org.hl7.fhir.r4.utils.TranslatingUtilities; import org.hl7.fhir.r4.utils.formats.CSVWriter; import org.hl7.fhir.r4.utils.formats.XLSXWriter; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.TerminologyServiceOptions; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; @@ -252,7 +253,7 @@ public class ProfileUtilities extends TranslatingUtilities { private ProfileKnowledgeProvider pkp; private boolean igmode; private boolean exception; - private TerminologyServiceOptions terminologyServiceOptions = new TerminologyServiceOptions(); + private TerminologyServiceOptions terminologyServiceOptions = new TerminologyServiceOptions(FhirPublication.R4); private boolean newSlicingProcessing; public ProfileUtilities(IWorkerContext context, List messages, ProfileKnowledgeProvider pkp) { diff --git a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/FHIRPathEngine.java b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/FHIRPathEngine.java index d493cf8cf..f8af9449e 100644 --- a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/FHIRPathEngine.java +++ b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/FHIRPathEngine.java @@ -62,6 +62,7 @@ import org.hl7.fhir.r4.utils.FHIRPathUtilityClasses.TypedElementDefinition; import org.hl7.fhir.r4.utils.FHIRPathEngine; import org.hl7.fhir.r4.utils.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.MergedList; import org.hl7.fhir.utilities.MergedList.MergeNode; import org.hl7.fhir.utilities.SourceLocation; @@ -121,7 +122,7 @@ public class FHIRPathEngine { private Map allTypes = new HashMap(); private boolean legacyMode; // some R2 and R3 constraints assume that != is valid for emptty sets, so when // running for R2/R3, this is set ot true - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R4); private ProfileUtilities profileUtilities; private String location; // for error messages private boolean allowPolymorphicNames; diff --git a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/NarrativeGenerator.java b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/NarrativeGenerator.java index 629257a55..3b25d4cf9 100644 --- a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/NarrativeGenerator.java +++ b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/NarrativeGenerator.java @@ -157,6 +157,7 @@ import org.hl7.fhir.r4.terminologies.ValueSetExpander.ValueSetExpansionOutcome; import org.hl7.fhir.r4.utils.FHIRPathEngine.IEvaluationContext; import org.hl7.fhir.r4.utils.LiquidEngine.LiquidDocument; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.LoincLinker; import org.hl7.fhir.utilities.MarkDownProcessor; import org.hl7.fhir.utilities.MarkDownProcessor.Dialect; @@ -1047,7 +1048,7 @@ public class NarrativeGenerator implements INarrativeGenerator { private List renderingMaps = new ArrayList(); private boolean pretty; private boolean canonicalUrlsAsLinks; - private TerminologyServiceOptions terminologyServiceOptions = new TerminologyServiceOptions(); + private TerminologyServiceOptions terminologyServiceOptions = new TerminologyServiceOptions(FhirPublication.R4); public NarrativeGenerator(String prefix, String basePath, IWorkerContext context) { super(); diff --git a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/StructureMapUtilities.java b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/StructureMapUtilities.java index d83edeb05..3516f5bb0 100644 --- a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/StructureMapUtilities.java +++ b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/utils/StructureMapUtilities.java @@ -117,6 +117,7 @@ import org.hl7.fhir.r4.utils.FHIRPathEngine.IEvaluationContext; import org.hl7.fhir.r4.utils.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.r4.utils.validation.IResourceValidator; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.TerminologyServiceOptions; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationMessage; @@ -256,7 +257,7 @@ public class StructureMapUtilities { private ITransformerServices services; private ProfileKnowledgeProvider pkp; private Map ids = new HashMap(); - private TerminologyServiceOptions terminologyServiceOptions = new TerminologyServiceOptions(); + private TerminologyServiceOptions terminologyServiceOptions = new TerminologyServiceOptions(FhirPublication.R4); public StructureMapUtilities(IWorkerContext worker, ITransformerServices services, ProfileKnowledgeProvider pkp) { super(); diff --git a/org.hl7.fhir.r4/src/test/java/org/hl7/fhir/r4/context/CacheTestUtils.java b/org.hl7.fhir.r4/src/test/java/org/hl7/fhir/r4/context/CacheTestUtils.java index e1e8e5e7c..3d2db8708 100644 --- a/org.hl7.fhir.r4/src/test/java/org/hl7/fhir/r4/context/CacheTestUtils.java +++ b/org.hl7.fhir.r4/src/test/java/org/hl7/fhir/r4/context/CacheTestUtils.java @@ -1,9 +1,10 @@ package org.hl7.fhir.r4.context; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.validation.ValidationOptions; public class CacheTestUtils { - public static final ValidationOptions validationOptions = new ValidationOptions().withGuessSystem() + public static final ValidationOptions validationOptions = new ValidationOptions(FhirPublication.R4).withGuessSystem() .withVersionFlexible(false); } diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java index 89c741ba8..34fe6916a 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java @@ -116,6 +116,7 @@ import org.hl7.fhir.r4b.utils.XVerExtensionManager; import org.hl7.fhir.r4b.utils.XVerExtensionManager.XVerExtensionStatus; import org.hl7.fhir.r4b.utils.formats.CSVWriter; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.MarkDownProcessor; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; @@ -341,7 +342,7 @@ public class ProfileUtilities extends TranslatingUtilities { private ProfileKnowledgeProvider pkp; private boolean igmode; private boolean exception; - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R4B); private boolean newSlicingProcessing; private String defWebRoot; private boolean autoFixSliceNames; diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/renderers/utils/RenderingContext.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/renderers/utils/RenderingContext.java index 262ff47ae..9cbef70f8 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/renderers/utils/RenderingContext.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/renderers/utils/RenderingContext.java @@ -117,7 +117,7 @@ public class RenderingContext { private boolean header; private boolean contained; - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R4B); private boolean noSlowLookup; private String tooCostlyNoteEmpty; private String tooCostlyNoteNotEmpty; diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/FHIRPathEngine.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/FHIRPathEngine.java index 99cc200f3..e61127b70 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/FHIRPathEngine.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/FHIRPathEngine.java @@ -62,6 +62,7 @@ import org.hl7.fhir.r4b.utils.FHIRPathUtilityClasses.ClassTypeInfo; import org.hl7.fhir.r4b.utils.FHIRPathUtilityClasses.TypedElementDefinition; import org.hl7.fhir.r4b.utils.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.MergedList; import org.hl7.fhir.utilities.MergedList.MergeNode; import org.hl7.fhir.utilities.SourceLocation; @@ -122,7 +123,7 @@ public class FHIRPathEngine { private Map allTypes = new HashMap(); private boolean legacyMode; // some R2 and R3 constraints assume that != is valid for emptty sets, so when // running for R2/R3, this is set ot true - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R4B); private ProfileUtilities profileUtilities; private String location; // for error messages private boolean allowPolymorphicNames; diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/structuremap/StructureMapUtilities.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/structuremap/StructureMapUtilities.java index 208182c96..759068e1b 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/structuremap/StructureMapUtilities.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/utils/structuremap/StructureMapUtilities.java @@ -72,6 +72,7 @@ import org.hl7.fhir.r4b.utils.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.r4b.utils.ToolingExtensions; import org.hl7.fhir.r4b.utils.validation.IResourceValidator; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationOptions; @@ -192,7 +193,7 @@ public class StructureMapUtilities { private ITransformerServices services; private ProfileKnowledgeProvider pkp; private final Map ids = new HashMap(); - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R4B); private final ProfileUtilities profileUtilities; public StructureMapUtilities(IWorkerContext worker, ITransformerServices services, ProfileKnowledgeProvider pkp) { diff --git a/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/context/CacheTestUtils.java b/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/context/CacheTestUtils.java index 593f72aa0..f40e262ac 100644 --- a/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/context/CacheTestUtils.java +++ b/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/context/CacheTestUtils.java @@ -1,9 +1,10 @@ package org.hl7.fhir.r4b.context; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.validation.ValidationOptions; public class CacheTestUtils { - public static final ValidationOptions validationOptions = new ValidationOptions().withGuessSystem() + public static final ValidationOptions validationOptions = new ValidationOptions(FhirPublication.R4B).withGuessSystem() .withVersionFlexible(false); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/comparison/ComparisonRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/comparison/ComparisonRenderer.java index 9a3bd1882..9ba77c38a 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/comparison/ComparisonRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/comparison/ComparisonRenderer.java @@ -34,6 +34,7 @@ import org.hl7.fhir.r5.utils.FHIRPathEngine.IEvaluationContext; import org.hl7.fhir.r5.utils.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.r5.utils.LiquidEngine; import org.hl7.fhir.r5.utils.LiquidEngine.LiquidDocument; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.TextFile; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.xhtml.XhtmlComposer; @@ -252,7 +253,7 @@ public class ComparisonRenderer implements IEvaluationContext { private String processTemplate(String template, String name, Map vars) { LiquidEngine engine = new LiquidEngine(contextRight, this); LiquidDocument doc = engine.parse(template, name+".template"); - return engine.evaluate(doc, Tuple.fromMap(vars), vars); + return engine.evaluate(doc, Tuple.fromMap(FhirPublication.R5, vars), vars); } @Override diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java index 34d9e0966..9b1fd17be 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/profile/ProfileUtilities.java @@ -51,7 +51,6 @@ import org.hl7.fhir.r5.conformance.ElementRedirection; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.AllowUnknownProfile; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.ElementDefinitionCounter; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.ObjectConverter; import org.hl7.fhir.r5.elementmodel.Property; import org.hl7.fhir.r5.model.Base; @@ -97,6 +96,7 @@ import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.FHIRPathEngine; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.TranslatingUtilities; @@ -104,6 +104,7 @@ import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus; import org.hl7.fhir.r5.utils.formats.CSVWriter; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; @@ -423,7 +424,7 @@ public class ProfileUtilities extends TranslatingUtilities { private ProfileKnowledgeProvider pkp; // private boolean igmode; private boolean exception; - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R5); private boolean newSlicingProcessing; private String defWebRoot; private boolean autoFixSliceNames; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java index 8960cb641..c406a7e73 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java @@ -61,7 +61,6 @@ import org.hl7.fhir.exceptions.TerminologyServiceException; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.context.CanonicalResourceManager.CanonicalResourceProxy; import org.hl7.fhir.r5.context.IWorkerContext.ILoggingService.LogCategory; -import org.hl7.fhir.r5.context.TerminologyCache.CacheToken; import org.hl7.fhir.r5.model.ActorDefinition; import org.hl7.fhir.r5.model.BooleanType; import org.hl7.fhir.r5.model.Bundle; @@ -121,9 +120,13 @@ import org.hl7.fhir.r5.renderers.OperationOutcomeRenderer; import org.hl7.fhir.r5.terminologies.CodeSystemUtilities; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpander; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; import org.hl7.fhir.r5.terminologies.utilities.TerminologyOperationContext; import org.hl7.fhir.r5.terminologies.utilities.TerminologyOperationContext.TerminologyServiceProtectionException; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.CacheToken; import org.hl7.fhir.r5.terminologies.validation.VSCheckerException; import org.hl7.fhir.r5.terminologies.validation.ValueSetValidator; import org.hl7.fhir.r5.terminologies.ValueSetUtilities; @@ -134,6 +137,7 @@ import org.hl7.fhir.r5.utils.ResourceUtilities; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.client.EFhirClientException; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.TimeTracker; import org.hl7.fhir.utilities.ToolingClientLogger; import org.hl7.fhir.utilities.TranslationServices; @@ -678,6 +682,11 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } } + @Override + public CodeSystem fetchCodeSystem(String system, FhirPublication fhirVersion) { + return fetchCodeSystem(system); + } + @Override public CodeSystem fetchCodeSystem(String system) { if (system == null) { @@ -701,6 +710,11 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte return cs; } + + public CodeSystem fetchCodeSystem(String system, String version, FhirPublication fhirVersion) { + return fetchCodeSystem(system, version); + } + public CodeSystem fetchCodeSystem(String system, String version) { if (version == null) { return fetchCodeSystem(system); @@ -718,6 +732,15 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte return cs; } + + public CodeSystem fetchSupplementedCodeSystem(String system, FhirPublication fhirVersion) { + return fetchSupplementedCodeSystem(system); + } + + public CodeSystem fetchSupplementedCodeSystem(String system, String version, FhirPublication fhirVersion) { + return fetchSupplementedCodeSystem(system, version); + } + @Override public CodeSystem fetchSupplementedCodeSystem(String system) { CodeSystem cs = fetchCodeSystem(system); @@ -742,6 +765,11 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte return cs; } + + public boolean supportsSystem(String system, FhirPublication fhirVersion) throws TerminologyServiceException { + return supportsSystem(system); + } + @Override public boolean supportsSystem(String system) throws TerminologyServiceException { synchronized (lock) { @@ -1762,6 +1790,15 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte this.name = name; } + + public List getResourceNames(FhirPublication fhirVersion) { + return getResourceNames(); + } + + public Set getResourceNamesAsSet(FhirPublication fhirVersion) { + return getResourceNamesAsSet(); + } + @Override public Set getResourceNamesAsSet() { Set res = new HashSet(); @@ -2187,6 +2224,10 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } } + public List fetchResourcesByType(Class class_, FhirPublication fhirVersion) { + return fetchResourcesByType(class_); + } + @SuppressWarnings("unchecked") public List fetchResourcesByType(Class class_) { @@ -2254,6 +2295,10 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte private boolean forPublication; private boolean cachingAllowed = true; + public Resource fetchResourceById(String type, String uri, FhirPublication fhirVersion) { + return fetchResourceById(type, uri); + } + @Override public Resource fetchResourceById(String type, String uri) { synchronized (lock) { @@ -2286,6 +2331,10 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } } + public T fetchResource(Class class_, String uri, FhirPublication fhirVersion) { + return fetchResource(class_, uri); + } + public T fetchResource(Class class_, String uri) { try { return fetchResourceWithException(class_, uri, null); @@ -2293,7 +2342,10 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte throw new Error(e); } } - + + public T fetchResource(Class class_, String uri, String version, FhirPublication fhirVersion) { + return fetchResource(class_, uri, version); + } public T fetchResource(Class class_, String uri, String version) { try { return fetchResourceWithExceptionByVersion(class_, uri, version, null); @@ -2335,6 +2387,46 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } } + @Override + public boolean hasResource(Class class_, String uri, FhirPublication fhirVersion) { + try { + return fetchResourceWithException(class_, uri) != null; + } catch (Exception e) { + return false; + } + } + + public boolean hasResource(String cls, String uri, FhirPublication fhirVersion) { + try { + return fetchResourceWithException(cls, uri) != null; + } catch (Exception e) { + return false; + } + } + + public boolean hasResourceVersion(Class class_, String uri, String version, FhirPublication fhirVersion) { + try { + return fetchResourceWithExceptionByVersion(class_, uri, version, null) != null; + } catch (Exception e) { + return false; + } + } + + public boolean hasResourceVersion(String cls, String uri, String version, FhirPublication fhirVersion) { + try { + return fetchResourceWithExceptionByVersion(cls, uri, version, null) != null; + } catch (Exception e) { + return false; + } + } + + public boolean hasResource(Class class_, String uri, Resource sourceOfReference) { + try { + return fetchResourceWithExceptionByVersion(class_, uri, version, null) != null; + } catch (Exception e) { + return false; + } + } public TranslationServices translator() { return translator; @@ -2540,6 +2632,11 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte return logger; } + + public StructureDefinition fetchTypeDefinition(String typeName, FhirPublication fhirVersion) { + return fetchTypeDefinition(typeName); + } + @Override public StructureDefinition fetchTypeDefinition(String typeName) { if (Utilities.isAbsoluteUrl(typeName)) { @@ -2579,6 +2676,12 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte return typeManager.getDefinitions(typeName); } + @Override + public List fetchTypeDefinitions(String typeName, FhirPublication fhirVersion) { + return typeManager.getDefinitions(typeName); + } + + public boolean isPrimitiveType(String type) { return typeManager.isPrimitive(type); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IContextResourceLoader.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IContextResourceLoader.java new file mode 100644 index 000000000..e2abf8b41 --- /dev/null +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IContextResourceLoader.java @@ -0,0 +1,101 @@ +package org.hl7.fhir.r5.context; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.r5.model.Bundle; +import org.hl7.fhir.r5.model.CodeSystem; +import org.hl7.fhir.r5.model.Resource; +import org.hl7.fhir.utilities.npm.NpmPackage; +import org.hl7.fhir.utilities.npm.NpmPackage.PackageResourceInformation; + +import com.google.gson.JsonSyntaxException; + +public interface IContextResourceLoader { + /** + * @return List of the resource types that should be loaded + */ + List getTypes(); + + /** + * Request to actually load the resources and do whatever is required + * + * @param stream + * @param isJson + * @return A bundle because some single resources become multiple resources after loading + * @throws FHIRException + * @throws IOException + */ + Bundle loadBundle(InputStream stream, boolean isJson) throws FHIRException, IOException; + + /** + * Load a single resources (lazy load) + * + * @param stream + * @param isJson + * @return + * @throws FHIRException - throw this if you a single resource can't be returned - can't lazy load in this circumstance + * @throws IOException + */ + Resource loadResource(InputStream stream, boolean isJson) throws FHIRException, IOException; + + /** + * get the path for references to this resource. + * @param resource + * @return null if not tracking paths + */ + String getResourcePath(Resource resource); + + /** + * called when a new package is being loaded + * + * this is called by loadPackageAndDependencies when a new package is loaded + * @param npm + * @return + * @throws IOException + * @throws JsonSyntaxException + */ + IContextResourceLoader getNewLoader(NpmPackage npm) throws JsonSyntaxException, IOException; + + /** + * called when processing R2 for implicit code systems in ValueSets + * + * @return + */ + List getCodeSystems(); + + /** + * if this is true, then the loader will patch canonical URLs and cross-links + * to add /X.X/ into the URL so that different versions can be loaded safely + * + * default is false + */ + void setPatchUrls(boolean value); + + /** + * patch the URL if necessary + * + * @param url + * @return + */ + String patchUrl(String url, String resourceType); + + /** + * set this to false (default is true) if you don't want profiles loaded + * @param value + * @return + */ + IContextResourceLoader setLoadProfiles(boolean value); + + /** + * Called during the loading process - the loader can decide which resources to load. + * At this point, only the .index.json is being read + * + * @param pi + * @param pri + * @return + */ + boolean wantLoad(NpmPackage pi, PackageResourceInformation pri); +} \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java index da230937a..61e903a4a 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java @@ -2,8 +2,6 @@ package org.hl7.fhir.r5.context; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -47,19 +45,15 @@ import org.fhir.ucum.UcumService; import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.TerminologyServiceException; -import org.hl7.fhir.r5.context.TerminologyCache.CacheToken; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.formats.IParser; import org.hl7.fhir.r5.formats.ParserType; -import org.hl7.fhir.r5.model.Bundle; import org.hl7.fhir.r5.model.CanonicalResource; import org.hl7.fhir.r5.model.CodeSystem; -import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent; import org.hl7.fhir.r5.model.CodeableConcept; import org.hl7.fhir.r5.model.Coding; import org.hl7.fhir.r5.model.ConceptMap; import org.hl7.fhir.r5.model.ElementDefinition.ElementDefinitionBindingComponent; -import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent; import org.hl7.fhir.r5.model.NamingSystem; import org.hl7.fhir.r5.model.PackageInformation; import org.hl7.fhir.r5.model.Parameters; @@ -72,20 +66,18 @@ import org.hl7.fhir.r5.profilemodel.PEDefinition; import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy; import org.hl7.fhir.r5.profilemodel.PEBuilder; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; -import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.validation.IResourceValidator; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.TimeTracker; import org.hl7.fhir.utilities.TranslationServices; import org.hl7.fhir.utilities.npm.BasePackageCacheManager; import org.hl7.fhir.utilities.npm.NpmPackage; -import org.hl7.fhir.utilities.npm.NpmPackage.PackageResourceInformation; -import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationOptions; -import com.google.gson.JsonSyntaxException; - import javax.annotation.Nonnull; @@ -111,415 +103,12 @@ import javax.annotation.Nonnull; public interface IWorkerContext { - class ValidationResult { - private ConceptDefinitionComponent definition; - private String preferredDisplay; - private String system; - private String version; - private IssueSeverity severity; - private String message; - private TerminologyServiceErrorClass errorClass; - private String txLink; - private String diagnostics; - private List issues = new ArrayList<>(); - private CodeableConcept codeableConcept; - private Set unknownSystems; - private boolean inactive; - private String status; - - @Override - public String toString() { - return "ValidationResult [definition=" + definition + ", system=" + system + ", severity=" + severity + ", message=" + message + ", errorClass=" - + errorClass + ", txLink=" + txLink + "]"; - } - - public ValidationResult(IssueSeverity severity, String message, List issues) { - this.severity = severity; - this.message = message; - if (issues != null) { - this.issues.addAll(issues); - } - } - - public ValidationResult(String system, String version, ConceptDefinitionComponent definition, String preferredDisplay) { - this.system = system; - this.version = version; - this.definition = definition; - this.preferredDisplay = preferredDisplay; - } - - public ValidationResult(IssueSeverity severity, String message, String system, String version, ConceptDefinitionComponent definition, String preferredDisplay, List issues) { - this.severity = severity; - this.message = message; - this.system = system; - this.version = version; - this.definition = definition; - this.preferredDisplay = preferredDisplay; - if (issues != null) { - this.issues.addAll(issues); - } - } - - public ValidationResult(IssueSeverity severity, String message, TerminologyServiceErrorClass errorClass, List issues) { - this.severity = severity; - this.message = message; - this.errorClass = errorClass; - if (issues != null) { - this.issues.addAll(issues); - } - } - - public boolean isOk() { - return severity == null || severity == IssueSeverity.INFORMATION || severity == IssueSeverity.WARNING; - } - - public String getSystem() { - return system; - } - - public String getVersion() { - return version; - } - - public String getDisplay() { - if (preferredDisplay != null) { - return preferredDisplay; - } else { - return definition == null ? null : definition.getDisplay(); - } - } - - public void setDisplay(String display) { - this.preferredDisplay = display; - } - - public void setSystem(String system) { - this.system = system; - } - - public void setVersion(String version) { - this.version = version; - } - - public String getCode() { - return definition == null ? null : definition.getCode(); - } - - public String getDefinition() { - return definition == null ? null : definition.getDefinition(); - } - - public void setDefinition(ConceptDefinitionComponent definition) { - this.definition = definition; - } - - public ConceptDefinitionComponent asConceptDefinition() { - return definition; - } - - public IssueSeverity getSeverity() { - return severity; - } - - public String getMessage() { - return message; - } - - public boolean IsNoService() { - return errorClass == TerminologyServiceErrorClass.NOSERVICE; - } - - public TerminologyServiceErrorClass getErrorClass() { - return errorClass; - } - - public ValidationResult setSeverity(IssueSeverity severity) { - this.severity = severity; - return this; - } - - public ValidationResult setMessage(String message) { - this.message = message; - return this; - } - - public ValidationResult addToMessage(String message) { - this.message = this.message == null ? message : this.message +"; "+ message; - return this; - } - - public ValidationResult setErrorClass(TerminologyServiceErrorClass errorClass) { - this.errorClass = errorClass; - return this; - } - - public String getTxLink() { - return txLink; - } - - public ValidationResult setTxLink(String txLink) { - this.txLink = txLink; - return this; - } - - public boolean hasMessage() { - return message != null; - } - - public String getDiagnostics() { - return diagnostics; - } - - public void setDiagnostics(String diagnostics) { - this.diagnostics = diagnostics; - } - - public Coding asCoding() { - if (isOk() && definition != null && definition.getCode() != null) { - return new Coding(system, definition.getCode(), definition.getDisplay()); - } else { - return null; - } - } - - public List getIssues() { - return issues; - } - - public ValidationResult addCodeableConcept(CodeableConcept vcc) { - if (!vcc.isEmpty()) { - codeableConcept = vcc; - } - return this; - } - - public CodeableConcept getCodeableConcept() { - return codeableConcept; - } - - public Set getUnknownSystems() { - return unknownSystems; - } - - public ValidationResult setUnknownSystems(Set unknownSystems) { - this.unknownSystems = unknownSystems; - return this; - } - - public String unknownSystems() { - if (unknownSystems == null) { - return null; - } - if (unknownSystems.size() == 1) { - return unknownSystems.iterator().next(); - } else { - return String.join(",", unknownSystems); - } - } - - public void setIssues(List issues) { - if (this.issues != null) { - issues.addAll(this.issues); - } - this.issues = issues; - - } - - public void trimPath(String prefix) { - if (issues != null) { - for (OperationOutcomeIssueComponent iss : issues) { - for (int i = iss.getLocation().size() -1; i >= 0; i--) { - var s = iss.getLocation().get(i).primitiveValue(); - if (prefix.equals(s)) { - iss.getLocation().remove(i); - } else if (s.startsWith(prefix+".")) { - iss.getLocation().get(i).setValueAsString(s.substring(prefix.length()+1)); - } - } - } - } - - } - - public boolean isInactive() { - return inactive; - } - - public String getStatus() { - return status; - } - - public ValidationResult setStatus(boolean inactive, String status) { - this.inactive = inactive; - if (!"inactive".equals(status)) { - this.status = status; - } - return this; - } - - } - - public class CodingValidationRequest { - private Coding coding; - private ValidationResult result; - private CacheToken cacheToken; - private String vs; - private ValueSet vsObj; - - public CodingValidationRequest(Coding coding) { - super(); - this.coding = coding; - } - - public CodingValidationRequest(Coding coding, String vs) { - super(); - this.coding = coding; - this.vs = vs; - } - - public CodingValidationRequest(Coding coding, ValueSet vsObj) { - super(); - this.coding = coding; - this.vsObj = vsObj; - } - - public String getVs() { - return vs; - } - - public ValueSet getVsObj() { - return vsObj; - } - - public ValidationResult getResult() { - return result; - } - - public void setResult(ValidationResult result) { - this.result = result; - } - - public Coding getCoding() { - return coding; - } - - public boolean hasResult() { - return result != null; - } - - /** - * internal logic; external users of batch validation should ignore this property - * - * @return - */ - public CacheToken getCacheToken() { - return cacheToken; - } - - /** - * internal logic; external users of batch validation should ignore this property - * - * @param cacheToken - */ - public void setCacheToken(CacheToken cacheToken) { - this.cacheToken = cacheToken; - } - - - } - - - public interface IContextResourceLoader { - /** - * @return List of the resource types that should be loaded - */ - List getTypes(); - - /** - * Request to actually load the resources and do whatever is required - * - * @param stream - * @param isJson - * @return A bundle because some single resources become multiple resources after loading - * @throws FHIRException - * @throws IOException - */ - Bundle loadBundle(InputStream stream, boolean isJson) throws FHIRException, IOException; - - /** - * Load a single resources (lazy load) - * - * @param stream - * @param isJson - * @return - * @throws FHIRException - throw this if you a single resource can't be returned - can't lazy load in this circumstance - * @throws IOException - */ - Resource loadResource(InputStream stream, boolean isJson) throws FHIRException, IOException; - - /** - * get the path for references to this resource. - * @param resource - * @return null if not tracking paths - */ - String getResourcePath(Resource resource); - - /** - * called when a new package is being loaded - * - * this is called by loadPackageAndDependencies when a new package is loaded - * @param npm - * @return - * @throws IOException - * @throws JsonSyntaxException - */ - IContextResourceLoader getNewLoader(NpmPackage npm) throws JsonSyntaxException, IOException; - - /** - * called when processing R2 for implicit code systems in ValueSets - * - * @return - */ - List getCodeSystems(); - - /** - * if this is true, then the loader will patch canonical URLs and cross-links - * to add /X.X/ into the URL so that different versions can be loaded safely - * - * default is false - */ - void setPatchUrls(boolean value); - - /** - * patch the URL if necessary - * - * @param url - * @return - */ - String patchUrl(String url, String resourceType); - - /** - * set this to false (default is true) if you don't want profiles loaded - * @param value - * @return - */ - IContextResourceLoader setLoadProfiles(boolean value); - - /** - * Called during the loading process - the loader can decide which resources to load. - * At this point, only the .index.json is being read - * - * @param pi - * @param pri - * @return - */ - boolean wantLoad(NpmPackage pi, PackageResourceInformation pri); - } - /** - * Get the version of the definitions loaded in context + * Get the version of the base definitions loaded in context * This *does not* have to be 5.0 (R5) - the context can load other versions * + * Note that more than one version might be loaded at once, but one version is always the default / master + * * @return */ public String getVersion(); @@ -576,6 +165,8 @@ public interface IWorkerContext { public T fetchResourceWithException(Class class_, String uri) throws FHIRException; public T fetchResourceWithException(Class class_, String uri, Resource sourceOfReference) throws FHIRException; public T fetchResource(Class class_, String uri, String version); + public T fetchResource(Class class_, String uri, FhirPublication fhirVersion); + public T fetchResource(Class class_, String uri, String version, FhirPublication fhirVersion); /** has the same functionality as fetchResource, but passes in information about the source of the * reference (this may affect resolution of version) @@ -597,6 +188,7 @@ public interface IWorkerContext { * @param canonicalForSource * @return */ + public List fetchResourcesByType(Class class_, FhirPublication fhirVersion); public List fetchResourcesByType(Class class_); /** @@ -614,6 +206,7 @@ public interface IWorkerContext { * @return */ public Resource fetchResourceById(String type, String uri); + public Resource fetchResourceById(String type, String uri, FhirPublication fhirVersion); /** * find whether a resource is available. @@ -626,6 +219,8 @@ public interface IWorkerContext { * @return */ public boolean hasResource(Class class_, String uri); + public boolean hasResource(Class class_, String uri, Resource sourceOfReference); + public boolean hasResource(Class class_, String uri, FhirPublication fhirVersion); /** * cache a resource for later retrieval using fetchResource. @@ -668,10 +263,12 @@ public interface IWorkerContext { * @return a list of the resource names defined for this version */ public List getResourceNames(); + public List getResourceNames(FhirPublication fhirVersion); /** * @return a set of the resource names defined for this version */ public Set getResourceNamesAsSet(); + public Set getResourceNamesAsSet(FhirPublication fhirVersion); // -- Terminology services ------------------------------------------------------ @@ -702,6 +299,8 @@ public interface IWorkerContext { */ public CodeSystem fetchCodeSystem(String system); public CodeSystem fetchCodeSystem(String system, String version); + public CodeSystem fetchCodeSystem(String system, FhirPublication fhirVersion); + public CodeSystem fetchCodeSystem(String system, String version, FhirPublication fhirVersion); /** * Like fetchCodeSystem, except that the context will find any CodeSysetm supplements and merge them into the @@ -710,6 +309,8 @@ public interface IWorkerContext { */ public CodeSystem fetchSupplementedCodeSystem(String system); public CodeSystem fetchSupplementedCodeSystem(String system, String version); + public CodeSystem fetchSupplementedCodeSystem(String system, FhirPublication fhirVersion); + public CodeSystem fetchSupplementedCodeSystem(String system, String version, FhirPublication fhirVersion); /** * True if the underlying terminology service provider will do @@ -727,6 +328,7 @@ public interface IWorkerContext { * @throws Exception */ public boolean supportsSystem(String system) throws TerminologyServiceException; + public boolean supportsSystem(String system, FhirPublication fhirVersion) throws TerminologyServiceException; /** * ValueSet Expansion - see $expand @@ -929,6 +531,7 @@ public interface IWorkerContext { * @return */ public StructureDefinition fetchTypeDefinition(String typeName); + public StructureDefinition fetchTypeDefinition(String typeName, FhirPublication fhirVersion); /** * This finds all the structure definitions that have the given typeName @@ -937,6 +540,7 @@ public interface IWorkerContext { * @return */ public List fetchTypeDefinitions(String n); + public List fetchTypeDefinitions(String n, FhirPublication fhirVersion); /** * return whether type is primitive type. This is called a lot, and needs a high performance implementation diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/Element.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/Element.java index 373d4e32e..2c1128979 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/Element.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/Element.java @@ -56,6 +56,7 @@ import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.ElementDecoration; import org.hl7.fhir.utilities.ElementDecoration.DecorationType; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.NamedItemList; import org.hl7.fhir.utilities.NamedItemList.NamedItem; import org.hl7.fhir.utilities.SourceLocation; @@ -1544,5 +1545,8 @@ public class Element extends Base implements NamedItem { return false; } + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.fromCode(property.getStructure().getVersion()); + } } \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Base.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Base.java index 40ed9bed5..d7664094e 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Base.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Base.java @@ -36,6 +36,8 @@ import java.util.Map; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.instance.model.api.IBase; +import org.hl7.fhir.r5.model.Enumerations.FHIRVersion; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.xhtml.XhtmlNode; @@ -582,4 +584,5 @@ public abstract class Base implements Serializable, IBase, IElement { return validationMessages != null ? validationMessages : new ArrayList<>(); } + public abstract FhirPublication getFHIRPublicationVersion(); } \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Element.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Element.java index 0ec766643..4ce465bad 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Element.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Element.java @@ -48,6 +48,7 @@ import ca.uhn.fhir.model.api.annotation.Block; import org.hl7.fhir.instance.model.api.IBaseElement; import org.hl7.fhir.instance.model.api.IBaseHasExtensions; import org.hl7.fhir.r5.utils.ToolingExtensions; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.StandardsStatus; /** * Element Type: Base definition for all elements in a resource. @@ -517,7 +518,10 @@ public abstract class Element extends Base implements IBaseHasExtensions, IBaseE } } - + + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } // end addition } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Resource.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Resource.java index 326d72106..65006a354 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Resource.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Resource.java @@ -34,6 +34,8 @@ package org.hl7.fhir.r5.model; import java.util.ArrayList; import java.util.Date; import java.util.List; + +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.r5.model.Enumerations.*; import org.hl7.fhir.instance.model.api.IBaseBackboneElement; @@ -482,6 +484,11 @@ public abstract class Resource extends BaseResource implements IAnyResource { return getIdElement().getIdPart(); } + + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } + // end addition } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Tuple.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Tuple.java index 0fff6567e..c4fb64f1f 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Tuple.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/Tuple.java @@ -37,20 +37,24 @@ import java.util.List; import java.util.Map; import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.utilities.FhirPublication; public class Tuple extends Base { private static final long serialVersionUID = -8402411970797277451L; private Map> properties = new HashMap<>(); + private FhirPublication publicationVersion; - public static Tuple fromMapList(Map> map) { + public static Tuple fromMapList(FhirPublication publicationVersion, Map> map) { Tuple res = new Tuple(); res.properties.putAll(map); + res.publicationVersion = publicationVersion; return res; } - public static Tuple fromMap(Map map) { + public static Tuple fromMap(FhirPublication publicationVersion,Map map) { Tuple res = new Tuple(); + res.publicationVersion = publicationVersion; for (String key : map.keySet()) { List list = new ArrayList<>(); list.add(map.get(key)); @@ -106,4 +110,7 @@ public class Tuple extends Base { } + public FhirPublication getFHIRPublicationVersion() { + return publicationVersion; + } } \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java index fc18c91fb..ef6b6dd3d 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java @@ -21,7 +21,6 @@ import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.model.Address; import org.hl7.fhir.r5.model.Annotation; import org.hl7.fhir.r5.model.BackboneType; @@ -79,6 +78,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext; import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules; import org.hl7.fhir.r5.renderers.utils.RenderingContext.ResourceRendererMode; import org.hl7.fhir.r5.terminologies.JurisdictionUtilities; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java index d14272515..5fbb97b00 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java @@ -20,7 +20,6 @@ import org.hl7.fhir.r5.conformance.profile.BindingResolution; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.ElementChoiceGroup; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.ExtensionContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.formats.IParser; import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.formats.JsonParser; @@ -74,6 +73,7 @@ import org.hl7.fhir.r5.renderers.utils.RenderingContext.GenerationRules; import org.hl7.fhir.r5.renderers.utils.RenderingContext.KnownLinkType; import org.hl7.fhir.r5.renderers.utils.RenderingContext.StructureDefinitionRendererMode; import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.PublicationHacker; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/TerminologyRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/TerminologyRenderer.java index fe37c8be3..10fe2a071 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/TerminologyRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/TerminologyRenderer.java @@ -8,7 +8,6 @@ import java.util.Map; import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRFormatError; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.CanonicalResource; import org.hl7.fhir.r5.model.CodeSystem; @@ -27,6 +26,7 @@ import org.hl7.fhir.r5.renderers.utils.BaseWrappers.ResourceWrapper; import org.hl7.fhir.r5.renderers.utils.RenderingContext; import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext; import org.hl7.fhir.r5.terminologies.CodeSystemUtilities; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.xhtml.XhtmlNode; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java index f1f4b1f2e..21d19d477 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ValueSetRenderer.java @@ -15,10 +15,6 @@ import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRFormatError; import org.hl7.fhir.exceptions.TerminologyServiceException; import org.hl7.fhir.r5.comparison.VersionComparisonAnnotation; -import org.hl7.fhir.r5.context.TerminologyCache; -import org.hl7.fhir.r5.context.IWorkerContext.CodingValidationRequest; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; -import org.hl7.fhir.r5.context.TerminologyCache.CacheToken; import org.hl7.fhir.r5.model.Base; import org.hl7.fhir.r5.model.BooleanType; import org.hl7.fhir.r5.model.CanonicalResource; @@ -53,7 +49,11 @@ import org.hl7.fhir.r5.renderers.utils.Resolver.ResourceContext; import org.hl7.fhir.r5.terminologies.CodeSystemUtilities; import org.hl7.fhir.r5.terminologies.ValueSetUtilities; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.CacheToken; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.LoincLinker; import org.hl7.fhir.utilities.Utilities; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java index dc859e7ad..c7ddb42bd 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java @@ -157,7 +157,7 @@ public class RenderingContext { private boolean header; private boolean contained; - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R5); private boolean noSlowLookup; private String tooCostlyNoteEmpty; private String tooCostlyNoteNotEmpty; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/CodingValidationRequest.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/CodingValidationRequest.java new file mode 100644 index 000000000..bb4c66e88 --- /dev/null +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/CodingValidationRequest.java @@ -0,0 +1,74 @@ +package org.hl7.fhir.r5.terminologies.utilities; + +import org.hl7.fhir.r5.model.Coding; +import org.hl7.fhir.r5.model.ValueSet; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache.CacheToken; + +public class CodingValidationRequest { + private Coding coding; + private ValidationResult result; + private CacheToken cacheToken; + private String vs; + private ValueSet vsObj; + + public CodingValidationRequest(Coding coding) { + super(); + this.coding = coding; + } + + public CodingValidationRequest(Coding coding, String vs) { + super(); + this.coding = coding; + this.vs = vs; + } + + public CodingValidationRequest(Coding coding, ValueSet vsObj) { + super(); + this.coding = coding; + this.vsObj = vsObj; + } + + public String getVs() { + return vs; + } + + public ValueSet getVsObj() { + return vsObj; + } + + public ValidationResult getResult() { + return result; + } + + public void setResult(ValidationResult result) { + this.result = result; + } + + public Coding getCoding() { + return coding; + } + + public boolean hasResult() { + return result != null; + } + + /** + * internal logic; external users of batch validation should ignore this property + * + * @return + */ + public CacheToken getCacheToken() { + return cacheToken; + } + + /** + * internal logic; external users of batch validation should ignore this property + * + * @param cacheToken + */ + public void setCacheToken(CacheToken cacheToken) { + this.cacheToken = cacheToken; + } + + +} \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/TerminologyCache.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/TerminologyCache.java similarity index 99% rename from org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/TerminologyCache.java rename to org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/TerminologyCache.java index 47c4766b4..016e0b754 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/TerminologyCache.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/TerminologyCache.java @@ -1,4 +1,4 @@ -package org.hl7.fhir.r5.context; +package org.hl7.fhir.r5.terminologies.utilities; /* Copyright (c) 2011+, HL7, Inc. @@ -43,7 +43,6 @@ import lombok.Setter; import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.formats.JsonParser; import org.hl7.fhir.r5.model.*; @@ -53,7 +52,6 @@ import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent; import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; -import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.TextFile; import org.hl7.fhir.utilities.Utilities; @@ -713,7 +711,7 @@ public class TerminologyCache { return s; } - protected String hashJson(String s) { + public String hashJson(String s) { return String.valueOf(s.trim().hashCode()); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValidationResult.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValidationResult.java new file mode 100644 index 000000000..539e6c60b --- /dev/null +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValidationResult.java @@ -0,0 +1,259 @@ +package org.hl7.fhir.r5.terminologies.utilities; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.hl7.fhir.r5.model.CodeableConcept; +import org.hl7.fhir.r5.model.Coding; +import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent; +import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent; +import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity; + +public class ValidationResult { + private ConceptDefinitionComponent definition; + private String preferredDisplay; + private String system; + private String version; + private IssueSeverity severity; + private String message; + private TerminologyServiceErrorClass errorClass; + private String txLink; + private String diagnostics; + private List issues = new ArrayList<>(); + private CodeableConcept codeableConcept; + private Set unknownSystems; + private boolean inactive; + private String status; + + @Override + public String toString() { + return "ValidationResult [definition=" + definition + ", system=" + system + ", severity=" + severity + ", message=" + message + ", errorClass=" + + errorClass + ", txLink=" + txLink + "]"; + } + + public ValidationResult(IssueSeverity severity, String message, List issues) { + this.severity = severity; + this.message = message; + if (issues != null) { + this.issues.addAll(issues); + } + } + + public ValidationResult(String system, String version, ConceptDefinitionComponent definition, String preferredDisplay) { + this.system = system; + this.version = version; + this.definition = definition; + this.preferredDisplay = preferredDisplay; + } + + public ValidationResult(IssueSeverity severity, String message, String system, String version, ConceptDefinitionComponent definition, String preferredDisplay, List issues) { + this.severity = severity; + this.message = message; + this.system = system; + this.version = version; + this.definition = definition; + this.preferredDisplay = preferredDisplay; + if (issues != null) { + this.issues.addAll(issues); + } + } + + public ValidationResult(IssueSeverity severity, String message, TerminologyServiceErrorClass errorClass, List issues) { + this.severity = severity; + this.message = message; + this.errorClass = errorClass; + if (issues != null) { + this.issues.addAll(issues); + } + } + + public boolean isOk() { + return severity == null || severity == IssueSeverity.INFORMATION || severity == IssueSeverity.WARNING; + } + + public String getSystem() { + return system; + } + + public String getVersion() { + return version; + } + + public String getDisplay() { + if (preferredDisplay != null) { + return preferredDisplay; + } else { + return definition == null ? null : definition.getDisplay(); + } + } + + public void setDisplay(String display) { + this.preferredDisplay = display; + } + + public void setSystem(String system) { + this.system = system; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getCode() { + return definition == null ? null : definition.getCode(); + } + + public String getDefinition() { + return definition == null ? null : definition.getDefinition(); + } + + public void setDefinition(ConceptDefinitionComponent definition) { + this.definition = definition; + } + + public ConceptDefinitionComponent asConceptDefinition() { + return definition; + } + + public IssueSeverity getSeverity() { + return severity; + } + + public String getMessage() { + return message; + } + + public boolean IsNoService() { + return errorClass == TerminologyServiceErrorClass.NOSERVICE; + } + + public TerminologyServiceErrorClass getErrorClass() { + return errorClass; + } + + public ValidationResult setSeverity(IssueSeverity severity) { + this.severity = severity; + return this; + } + + public ValidationResult setMessage(String message) { + this.message = message; + return this; + } + + public ValidationResult addToMessage(String message) { + this.message = this.message == null ? message : this.message +"; "+ message; + return this; + } + + public ValidationResult setErrorClass(TerminologyServiceErrorClass errorClass) { + this.errorClass = errorClass; + return this; + } + + public String getTxLink() { + return txLink; + } + + public ValidationResult setTxLink(String txLink) { + this.txLink = txLink; + return this; + } + + public boolean hasMessage() { + return message != null; + } + + public String getDiagnostics() { + return diagnostics; + } + + public void setDiagnostics(String diagnostics) { + this.diagnostics = diagnostics; + } + + public Coding asCoding() { + if (isOk() && definition != null && definition.getCode() != null) { + return new Coding(system, definition.getCode(), definition.getDisplay()); + } else { + return null; + } + } + + public List getIssues() { + return issues; + } + + public ValidationResult addCodeableConcept(CodeableConcept vcc) { + if (!vcc.isEmpty()) { + codeableConcept = vcc; + } + return this; + } + + public CodeableConcept getCodeableConcept() { + return codeableConcept; + } + + public Set getUnknownSystems() { + return unknownSystems; + } + + public ValidationResult setUnknownSystems(Set unknownSystems) { + this.unknownSystems = unknownSystems; + return this; + } + + public String unknownSystems() { + if (unknownSystems == null) { + return null; + } + if (unknownSystems.size() == 1) { + return unknownSystems.iterator().next(); + } else { + return String.join(",", unknownSystems); + } + } + + public void setIssues(List issues) { + if (this.issues != null) { + issues.addAll(this.issues); + } + this.issues = issues; + + } + + public void trimPath(String prefix) { + if (issues != null) { + for (OperationOutcomeIssueComponent iss : issues) { + for (int i = iss.getLocation().size() -1; i >= 0; i--) { + var s = iss.getLocation().get(i).primitiveValue(); + if (prefix.equals(s)) { + iss.getLocation().remove(i); + } else if (s.startsWith(prefix+".")) { + iss.getLocation().get(i).setValueAsString(s.substring(prefix.length()+1)); + } + } + } + } + + } + + public boolean isInactive() { + return inactive; + } + + public String getStatus() { + return status; + } + + public ValidationResult setStatus(boolean inactive, String status) { + this.inactive = inactive; + if (!"inactive".equals(status)) { + this.status = status; + } + return this; + } + +} \ No newline at end of file diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java index 207f0e261..be8902408 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java @@ -44,7 +44,6 @@ import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.NoTerminologyServiceException; import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.LanguageUtils; import org.hl7.fhir.r5.extensions.ExtensionConstants; import org.hl7.fhir.r5.model.CanonicalType; @@ -83,11 +82,13 @@ import org.hl7.fhir.r5.terminologies.providers.URICodeSystem; import org.hl7.fhir.r5.terminologies.utilities.TerminologyOperationContext; import org.hl7.fhir.r5.terminologies.utilities.TerminologyOperationContext.TerminologyServiceProtectionException; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.terminologies.utilities.ValueSetProcessBase; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.AcceptLanguageHeader; @@ -780,7 +781,7 @@ public class ValueSetValidator extends ValueSetProcessBase { private ConceptDefinitionComponent findCountryCode(String code) { - ValidationResult vr = context.validateCode(new ValidationOptions(), "urn:iso:std:iso:3166", null, code, null); + ValidationResult vr = context.validateCode(new ValidationOptions(FhirPublication.R5), "urn:iso:std:iso:3166", null, code, null); return vr == null || !vr.isOk() ? null : new ConceptDefinitionComponent(code).setDisplay(vr.getDisplay()).setDefinition(vr.getDefinition()); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestPackageLoader.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestPackageLoader.java index c3e68dd96..109ce8fb6 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestPackageLoader.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestPackageLoader.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.List; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.formats.JsonParser; import org.hl7.fhir.r5.formats.XmlParser; import org.hl7.fhir.r5.model.Bundle; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestingUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestingUtilities.java index 42a61d208..742927e48 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestingUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/test/utils/TestingUtilities.java @@ -8,10 +8,11 @@ import java.util.Locale; import java.util.Map; import org.fhir.ucum.UcumEssenceService; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.SimpleWorkerContext; -import org.hl7.fhir.r5.context.TerminologyCache; import org.hl7.fhir.r5.model.Parameters; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; import org.hl7.fhir.r5.utils.R5Hacker; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; @@ -125,7 +126,7 @@ public class TestingUtilities extends BaseTestingUtilities { return swc; } - public static SimpleWorkerContext getWorkerContext(NpmPackage npmPackage, IWorkerContext.IContextResourceLoader loader) throws Exception { + public static SimpleWorkerContext getWorkerContext(NpmPackage npmPackage, IContextResourceLoader loader) throws Exception { SimpleWorkerContext swc = new SimpleWorkerContext.SimpleWorkerContextBuilder().withAllowLoadingDuplicates(true).withUserAgent(TestConstants.USER_AGENT) .withTerminologyCachePath(getTerminologyCacheDirectory()).fromPackage(npmPackage, loader, true); TerminologyCache.setCacheErrors(true); diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java index 016167966..43141fee3 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java @@ -28,7 +28,6 @@ import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.SourcedChildDefinitions; import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.model.Base; import org.hl7.fhir.r5.model.BaseDateTimeType; import org.hl7.fhir.r5.model.BooleanType; @@ -61,6 +60,7 @@ import org.hl7.fhir.r5.model.TimeType; import org.hl7.fhir.r5.model.TypeConvertor; import org.hl7.fhir.r5.model.TypeDetails; import org.hl7.fhir.r5.model.TypeDetails.ProfiledType; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.utils.FHIRLexer.FHIRLexerException; import org.hl7.fhir.r5.utils.FHIRPathEngine.IssueMessage; @@ -69,6 +69,7 @@ import org.hl7.fhir.r5.utils.FHIRPathUtilityClasses.ClassTypeInfo; import org.hl7.fhir.r5.utils.FHIRPathUtilityClasses.FunctionDetails; import org.hl7.fhir.r5.utils.FHIRPathUtilityClasses.TypedElementDefinition; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.MarkDownProcessor; import org.hl7.fhir.utilities.MergedList; import org.hl7.fhir.utilities.MergedList.MergeNode; @@ -149,7 +150,7 @@ public class FHIRPathEngine { private Set primitiveTypes = new HashSet(); private Map allTypes = new HashMap(); private boolean legacyMode; // some R2 and R3 constraints assume that != is valid for emptty sets, so when running for R2/R3, this is set ot true - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R5); private ProfileUtilities profileUtilities; private String location; // for error messages private boolean allowPolymorphicNames; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathUtilityClasses.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathUtilityClasses.java index 6867a38f0..6ffba02bd 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathUtilityClasses.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathUtilityClasses.java @@ -12,6 +12,7 @@ import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.StringType; import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; public class FHIRPathUtilityClasses { @@ -56,6 +57,10 @@ public class FHIRPathUtilityClasses { public Base copy() { throw new Error("Not Implemented"); } + + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } } public static class ClassTypeInfo extends Base { @@ -119,6 +124,10 @@ public class FHIRPathUtilityClasses { public Base copy() { throw new Error("Not Implemented"); } + + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } } public static class TypedElementDefinition { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java index 7fb240a3b..d8c881542 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java @@ -57,6 +57,7 @@ import org.hl7.fhir.r5.model.Property; import org.hl7.fhir.r5.model.Reference; import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.StringType; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.graphql.Argument; import org.hl7.fhir.utilities.graphql.Argument.ArgumentListStatus; @@ -126,6 +127,10 @@ public class GraphQLEngine implements IGraphQLEngine { public Base copy() { throw new Error("Not Implemented"); } + + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } } public static class SearchWrapper extends Base { @@ -220,6 +225,9 @@ public class GraphQLEngine implements IGraphQLEngine { throw new Error("Not Implemented"); } + public FhirPublication getFHIRPublicationVersion() { + return FhirPublication.R5; + } } private IWorkerContext context; diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java index afd641e8d..2889bfcad 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java @@ -40,7 +40,6 @@ import org.hl7.fhir.r5.conformance.profile.ProfileKnowledgeProvider; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.elementmodel.Manager; import org.hl7.fhir.r5.elementmodel.Property; @@ -64,11 +63,13 @@ import org.hl7.fhir.r5.model.TypeDetails.ProfiledType; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.renderers.TerminologyRenderer; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.FHIRLexer; import org.hl7.fhir.r5.utils.FHIRLexer.FHIRLexerException; import org.hl7.fhir.r5.utils.FHIRPathEngine; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationOptions; import org.hl7.fhir.utilities.xhtml.NodeType; @@ -105,7 +106,7 @@ public class StructureMapUtilities { private ITransformerServices services; private ProfileKnowledgeProvider pkp; private final Map ids = new HashMap(); - private ValidationOptions terminologyServiceOptions = new ValidationOptions(); + private ValidationOptions terminologyServiceOptions = new ValidationOptions(FhirPublication.R5); private final ProfileUtilities profileUtilities; private boolean exceptionsForChecks = true; private boolean debug; diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/BaseWorkerContextTests.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/BaseWorkerContextTests.java index 8910fbd8c..2b14634a1 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/BaseWorkerContextTests.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/BaseWorkerContextTests.java @@ -6,11 +6,14 @@ import org.hl7.fhir.r5.model.Parameters; import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.utils.validation.IResourceValidator; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.npm.BasePackageCacheManager; import org.hl7.fhir.utilities.npm.NpmPackage; import org.hl7.fhir.utilities.validation.ValidationOptions; import org.junit.jupiter.api.Test; +import net.sourceforge.plantuml.tim.stdlib.GetVariableValue; + import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; @@ -91,7 +94,7 @@ public class BaseWorkerContextTests { public void testAddServerValidationParametersDisplayWarning() throws IOException { BaseWorkerContext baseWorkerContext = getBaseWorkerContext(); Parameters pin = new Parameters(); - baseWorkerContext.addServerValidationParameters(new ValueSet(), pin, new ValidationOptions().setDisplayWarningMode(true)); + baseWorkerContext.addServerValidationParameters(new ValueSet(), pin, new ValidationOptions(FhirPublication.fromCode(baseWorkerContext.getVersion())).setDisplayWarningMode(true)); assertEquals("lenient-display-validation", pin.getParameter("mode").getValue().primitiveValue()); } @@ -99,7 +102,7 @@ public class BaseWorkerContextTests { public void testAddServerValidationParametersVsAsUrl() throws IOException { BaseWorkerContext baseWorkerContext = getBaseWorkerContext(); Parameters pin = new Parameters(); - baseWorkerContext.addServerValidationParameters(new ValueSet().setUrl("http://dummy.org/vs"), pin, new ValidationOptions().setVsAsUrl(true)); + baseWorkerContext.addServerValidationParameters(new ValueSet().setUrl("http://dummy.org/vs"), pin, new ValidationOptions(FhirPublication.fromCode(baseWorkerContext.getVersion())).setVsAsUrl(true)); assertEquals("uri", pin.getParameter("url").getValue().fhirType()); assertEquals("http://dummy.org/vs", pin.getParameter("url").getValue().primitiveValue()); } @@ -109,7 +112,7 @@ public class BaseWorkerContextTests { BaseWorkerContext baseWorkerContext = getBaseWorkerContext(); Parameters pin = new Parameters(); - baseWorkerContext.addServerValidationParameters(new ValueSet(), pin, new ValidationOptions()); + baseWorkerContext.addServerValidationParameters(new ValueSet(), pin, new ValidationOptions(FhirPublication.fromCode(baseWorkerContext.getVersion()))); assertNull(pin.getParameter("mode")); } } diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/CacheTestUtils.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/CacheTestUtils.java index a81559304..043114a4f 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/CacheTestUtils.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/CacheTestUtils.java @@ -1,8 +1,9 @@ package org.hl7.fhir.r5.context; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.validation.ValidationOptions; public class CacheTestUtils { - public static final ValidationOptions validationOptions = new ValidationOptions().withGuessSystem().withVersionFlexible(false); + public static final ValidationOptions validationOptions = new ValidationOptions(FhirPublication.R5).withGuessSystem().withVersionFlexible(false); } diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java index 83098feed..4eb0ab0ec 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java @@ -23,8 +23,11 @@ import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.terminologies.client.ITerminologyClient; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpander; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.terminologies.validation.ValueSetValidator; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.ToolingClientLogger; import org.hl7.fhir.utilities.validation.ValidationOptions; import org.junit.jupiter.api.Assertions; @@ -60,7 +63,7 @@ public class SimpleWorkerContextTests { TerminologyCache.CacheToken cacheToken; @Mock - IWorkerContext.ValidationResult expectedValidationResult; + ValidationResult expectedValidationResult; @Mock ValueSetExpansionOutcome expectedExpansionResult; @@ -137,7 +140,7 @@ public class SimpleWorkerContextTests { @Test public void testValidateCodingWithCache() throws IOException { - ValidationOptions validationOptions = new ValidationOptions().withGuessSystem().withVersionFlexible(false); + ValidationOptions validationOptions = new ValidationOptions(FhirPublication.R5).withGuessSystem().withVersionFlexible(false); ValueSet valueSet = new ValueSet(); Coding coding = new Coding(); @@ -146,7 +149,7 @@ public class SimpleWorkerContextTests { ValidationContextCarrier ctxt = mock(ValidationContextCarrier.class); - IWorkerContext.ValidationResult actualValidationResult = context.validateCode(validationOptions, coding, valueSet, ctxt); + ValidationResult actualValidationResult = context.validateCode(validationOptions, coding, valueSet, ctxt); assertEquals(expectedValidationResult, actualValidationResult); @@ -157,7 +160,7 @@ public class SimpleWorkerContextTests { @Test public void testValidateCodingWithValueSetChecker() throws IOException { - ValidationOptions validationOptions = new ValidationOptions().withGuessSystem().withVersionFlexible(false); + ValidationOptions validationOptions = new ValidationOptions(FhirPublication.R5).withGuessSystem().withVersionFlexible(false); ValueSet valueSet = new ValueSet(); Coding coding = new Coding(); @@ -168,7 +171,7 @@ public class SimpleWorkerContextTests { ValidationContextCarrier ctxt = mock(ValidationContextCarrier.class); - IWorkerContext.ValidationResult actualValidationResult = context.validateCode(validationOptions, coding, valueSet, ctxt); + ValidationResult actualValidationResult = context.validateCode(validationOptions, coding, valueSet, ctxt); assertEquals(expectedValidationResult, actualValidationResult); @@ -180,7 +183,7 @@ public class SimpleWorkerContextTests { @Test public void testValidateCodingWithServer() throws IOException { - ValidationOptions validationOptions = new ValidationOptions().withGuessSystem().withVersionFlexible(false).withNoClient(); + ValidationOptions validationOptions = new ValidationOptions(FhirPublication.R5).withGuessSystem().withVersionFlexible(false).withNoClient(); ValueSet valueSet = new ValueSet(); Coding coding = new Coding(); @@ -190,7 +193,7 @@ public class SimpleWorkerContextTests { ValidationContextCarrier ctxt = mock(ValidationContextCarrier.class); - IWorkerContext.ValidationResult actualValidationResult = context.validateCode(validationOptions, coding, valueSet, ctxt); + ValidationResult actualValidationResult = context.validateCode(validationOptions, coding, valueSet, ctxt); assertEquals(expectedValidationResult, actualValidationResult); @@ -207,7 +210,7 @@ public class SimpleWorkerContextTests { Mockito.doReturn(cacheToken).when(terminologyCache).generateValidationToken(CacheTestUtils.validationOptions, codeableConcept, valueSet, expParameters); Mockito.doReturn(expectedValidationResult).when(terminologyCache).getValidation(cacheToken); - IWorkerContext.ValidationResult actualValidationResult = context.validateCode(CacheTestUtils.validationOptions, codeableConcept, valueSet); + ValidationResult actualValidationResult = context.validateCode(CacheTestUtils.validationOptions, codeableConcept, valueSet); assertEquals(expectedValidationResult, actualValidationResult); Mockito.verify(valueSetCheckerSimple, times(0)).validateCode("CodeableConcept", codeableConcept); @@ -225,7 +228,7 @@ public class SimpleWorkerContextTests { Mockito.doReturn(cacheToken).when(terminologyCache).generateValidationToken(CacheTestUtils.validationOptions, codeableConcept, valueSet, expParameters); - IWorkerContext.ValidationResult validationResultB = context.validateCode(CacheTestUtils.validationOptions, codeableConcept, valueSet); + ValidationResult validationResultB = context.validateCode(CacheTestUtils.validationOptions, codeableConcept, valueSet); assertEquals(expectedValidationResult, validationResultB); Mockito.verify(valueSetCheckerSimple).validateCode("CodeableConcept", codeableConcept); @@ -247,7 +250,7 @@ public class SimpleWorkerContextTests { Mockito.doReturn(cacheToken).when(terminologyCache).generateValidationToken(validationOptions, codeableConcept, valueSet, expParameters); - IWorkerContext.ValidationResult validationResultB = context.validateCode(validationOptions, codeableConcept, valueSet); + ValidationResult validationResultB = context.validateCode(validationOptions, codeableConcept, valueSet); assertEquals(expectedValidationResult, validationResultB); diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/TerminologyCacheTests.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/TerminologyCacheTests.java index 96817110c..b27df7575 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/TerminologyCacheTests.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/TerminologyCacheTests.java @@ -29,6 +29,8 @@ import org.hl7.fhir.r5.model.Parameters; import org.hl7.fhir.r5.model.TerminologyCapabilities; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.utilities.tests.ResourceLoaderTests; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.junit.jupiter.api.Test; @@ -118,12 +120,12 @@ public class TerminologyCacheTests implements ResourceLoaderTests { terminologyCacheA.cacheTerminologyCapabilities(terminologyCapabilities); terminologyCacheA.cacheCapabilityStatement(capabilityStatement); - IWorkerContext.ValidationResult codingResultA = new IWorkerContext.ValidationResult(ValidationMessage.IssueSeverity.INFORMATION, "dummyInfo", null); + ValidationResult codingResultA = new ValidationResult(ValidationMessage.IssueSeverity.INFORMATION, "dummyInfo", null); TerminologyCache.CacheToken codingTokenA = terminologyCacheA.generateValidationToken(CacheTestUtils.validationOptions, coding, valueSet, new Parameters()); terminologyCacheA.cacheValidation(codingTokenA, codingResultA, true); - IWorkerContext.ValidationResult codeableConceptResultA = new IWorkerContext.ValidationResult(ValidationMessage.IssueSeverity.INFORMATION, "dummyInfo", null); + ValidationResult codeableConceptResultA = new ValidationResult(ValidationMessage.IssueSeverity.INFORMATION, "dummyInfo", null); TerminologyCache.CacheToken codeableConceptTokenA = terminologyCacheA.generateValidationToken(CacheTestUtils.validationOptions, concept, valueSet, new Parameters()); terminologyCacheA.cacheValidation(codeableConceptTokenA, codeableConceptResultA, true); @@ -160,7 +162,7 @@ public class TerminologyCacheTests implements ResourceLoaderTests { assertTrue(a.equalsDeep(b)); } - private void assertValidationResultEquals(IWorkerContext.ValidationResult a, IWorkerContext.ValidationResult b) { + private void assertValidationResultEquals(ValidationResult a, ValidationResult b) { assertEquals(a.getSeverity(), b.getSeverity()); assertEquals(a.getMessage(), b.getMessage()); } diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TerminologyServiceOptions.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TerminologyServiceOptions.java index 3d2283b3b..2dd989c9a 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TerminologyServiceOptions.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TerminologyServiceOptions.java @@ -39,12 +39,12 @@ import org.hl7.fhir.utilities.validation.ValidationOptions; */ public class TerminologyServiceOptions extends ValidationOptions { - public TerminologyServiceOptions() { - super(); + public TerminologyServiceOptions(FhirPublication fhirVersion) { + super(fhirVersion); } - public TerminologyServiceOptions(String lang) { - super(lang); + public TerminologyServiceOptions(FhirPublication fhirVersion, String lang) { + super(fhirVersion, lang); } } \ No newline at end of file diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/validation/ValidationOptions.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/validation/ValidationOptions.java index 5bea3868b..943ae7284 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/validation/ValidationOptions.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/validation/ValidationOptions.java @@ -3,6 +3,7 @@ package org.hl7.fhir.utilities.validation; import java.util.HashSet; import java.util.Set; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.i18n.AcceptLanguageHeader; @@ -23,12 +24,14 @@ public class ValidationOptions { private boolean versionFlexible = true; private boolean useValueSetDisplays; private boolean englishOk = true; + private FhirPublication fhirVersion; - public ValidationOptions() { + public ValidationOptions(FhirPublication fhirVersion) { super(); + this.fhirVersion = fhirVersion; } - public ValidationOptions(String language) { + public ValidationOptions(FhirPublication fhirVersion, String language) { super(); if (!Utilities.noString(language)) { langs = new AcceptLanguageHeader(language, false); @@ -36,7 +39,7 @@ public class ValidationOptions { } public static ValidationOptions defaults() { - return new ValidationOptions("en, en-US"); + return new ValidationOptions(FhirPublication.R5, "en, en-US"); } /** @@ -262,7 +265,7 @@ public class ValidationOptions { } public ValidationOptions copy() { - ValidationOptions n = new ValidationOptions(); + ValidationOptions n = new ValidationOptions(fhirVersion); n.langs = langs == null ? null : langs.copy(); n.useServer = useServer; n.useClient = useClient; @@ -293,6 +296,8 @@ public class ValidationOptions { } } - + public FhirPublication getFhirVersion() { + return fhirVersion; + } } \ No newline at end of file diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java index 5b1930752..13333a1ab 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/IgLoader.java @@ -21,7 +21,7 @@ import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_50; import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; import org.hl7.fhir.convertors.factory.VersionConvertorFactory_43_50; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.context.SimpleWorkerContext; import org.hl7.fhir.r5.elementmodel.Manager; import org.hl7.fhir.r5.formats.JsonParser; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java index 8e1fc845d..b96ebb9ba 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java @@ -24,7 +24,6 @@ import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.SimpleWorkerContext; import org.hl7.fhir.r5.context.SystemOutLoggingService; -import org.hl7.fhir.r5.context.TerminologyCache; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.elementmodel.LanguageUtils; import org.hl7.fhir.r5.elementmodel.Manager; @@ -47,6 +46,7 @@ import org.hl7.fhir.r5.renderers.spreadsheets.ConceptMapSpreadsheetGenerator; import org.hl7.fhir.r5.renderers.spreadsheets.StructureDefinitionSpreadsheetGenerator; import org.hl7.fhir.r5.renderers.spreadsheets.ValueSetSpreadsheetGenerator; import org.hl7.fhir.r5.terminologies.CodeSystemUtilities; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.SystemExitManager; import org.hl7.fhir.utilities.TextFile; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java index e241c6147..0e1555dd4 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java @@ -10,9 +10,9 @@ import java.util.Set; import javax.annotation.Nonnull; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.CodingValidationRequest; import org.hl7.fhir.r5.model.CodeableConcept; import org.hl7.fhir.r5.model.Coding; +import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.utilities.i18n.I18nConstants; import org.hl7.fhir.utilities.validation.ValidationMessage; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java index 763e22cf0..7f86fd091 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java @@ -68,7 +68,6 @@ import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities.SourcedChildDefinitions; import org.hl7.fhir.r5.context.ContextUtilities; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.elementmodel.Element.SpecialElement; import org.hl7.fhir.r5.elementmodel.JsonParser; @@ -152,6 +151,7 @@ import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.renderers.DataRenderer; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.BuildExtensions; import org.hl7.fhir.r5.utils.FHIRLexer.FHIRLexerException; import org.hl7.fhir.r5.utils.FHIRPathEngine; @@ -175,6 +175,7 @@ import org.hl7.fhir.r5.utils.validation.constants.ContainedReferenceValidationPo import org.hl7.fhir.r5.utils.validation.constants.IdStatus; import org.hl7.fhir.r5.utils.validation.constants.ReferenceValidationPolicy; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.HL7WorkGroups; import org.hl7.fhir.utilities.HL7WorkGroups.HL7WorkGroup; import org.hl7.fhir.utilities.MarkDownProcessor; @@ -596,7 +597,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat private List bundleValidationRules = new ArrayList<>(); private boolean validateValueSetCodesOnTxServer = true; private QuestionnaireMode questionnaireMode; - private ValidationOptions baseOptions = new ValidationOptions(); + private ValidationOptions baseOptions = new ValidationOptions(FhirPublication.R5); private Map crLookups = new HashMap<>(); private boolean logProgress; private CodingsObserver codingObserver; @@ -4259,16 +4260,15 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat if (sd != null && (sd.getTypeTail().equals(type) || sd.getUrl().equals(type)) && sd.hasSnapshot()) { return sd; } - if (sd.getAbstract()) { + if (sd != null && sd.getAbstract()) { StructureDefinition sdt = context.fetchTypeDefinition(type); StructureDefinition tt = sdt; while (tt != null) { if (tt.getBaseDefinition().equals(sd.getUrl())) { return sdt; } + tt = context.fetchResource(StructureDefinition.class, tt.getBaseDefinition()); } - - } } return null; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/CodeSystemValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/CodeSystemValidator.java index 9f97260be..6e7a8b98a 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/CodeSystemValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/CodeSystemValidator.java @@ -8,6 +8,7 @@ import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.model.Coding; import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.ValueSet; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.i18n.I18nConstants; @@ -234,7 +235,7 @@ public class CodeSystemValidator extends BaseValidator { private boolean validateSupplementConcept(List errors, Element concept, NodeStack stack, String supp, ValidationOptions options) { String code = concept.getChildValue("code"); if (!Utilities.noString(code)) { - org.hl7.fhir.r5.context.IWorkerContext.ValidationResult res = context.validateCode(options, systemFromCanonical(supp), versionFromCanonical(supp), code, null); + org.hl7.fhir.r5.terminologies.utilities.ValidationResult res = context.validateCode(options, systemFromCanonical(supp), versionFromCanonical(supp), code, null); return rule(errors, NO_RULE_DATE, IssueType.BUSINESSRULE, stack.getLiteralPath(), res.isOk(), I18nConstants.CODESYSTEM_CS_SUPP_INVALID_CODE, supp, code); } else { return true; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java index 5665e0b7e..d2a5b5bd9 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ConceptMapValidator.java @@ -6,8 +6,6 @@ import java.util.List; import java.util.Map; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.CodingValidationRequest; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent; @@ -15,7 +13,9 @@ import org.hl7.fhir.r5.model.Coding; import org.hl7.fhir.r5.model.Enumerations.CodeSystemContentMode; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.terminologies.CodeSystemUtilities; +import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/QuestionnaireValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/QuestionnaireValidator.java index 3f8d349be..bde4fcfa4 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/QuestionnaireValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/QuestionnaireValidator.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; import org.hl7.fhir.exceptions.FHIRException; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.elementmodel.ObjectConverter; import org.hl7.fhir.r5.model.Coding; @@ -24,10 +23,12 @@ import org.hl7.fhir.r5.model.StringType; import org.hl7.fhir.r5.model.TimeType; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.FHIRPathEngine; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; @@ -767,7 +768,7 @@ public class QuestionnaireValidator extends BaseValidator { long t = System.nanoTime(); ValidationContextCarrier vc = makeValidationContext(errors, qSrc); - ValidationResult res = context.validateCode(new ValidationOptions(stack.getWorkingLang()), c, vs, vc); + ValidationResult res = context.validateCode(new ValidationOptions(FhirPublication.R5, stack.getWorkingLang()), c, vs, vc); timeTracker.tx(t, "vc "+c.getSystem()+"#"+c.getCode()+" '"+c.getDisplay()+"'"); if (!res.isOk()) { if (res.getErrorClass() == TerminologyServiceErrorClass.CODESYSTEM_UNSUPPORTED) { diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java index c87535cd0..5c34b8b50 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/StructureDefinitionValidator.java @@ -16,7 +16,6 @@ import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_50; import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.r5.conformance.profile.ProfileUtilities; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.elementmodel.Manager; import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat; @@ -36,10 +35,12 @@ import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind; import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.FHIRPathEngine; import org.hl7.fhir.r5.utils.FHIRPathEngine.IssueMessage; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; @@ -894,7 +895,7 @@ public class StructureDefinitionValidator extends BaseValidator { } private boolean serverSupportsValueSet(String ref) { - ValidationResult vr = context.validateCode(new ValidationOptions().withCheckValueSetOnly().withVsAsUrl().withNoClient(), new Coding("http://loinc.org", "5792-7", null), new ValueSet().setUrl(ref)); + ValidationResult vr = context.validateCode(new ValidationOptions(FhirPublication.R5).withCheckValueSetOnly().withVsAsUrl().withNoClient(), new Coding("http://loinc.org", "5792-7", null), new ValueSet().setUrl(ref)); return vr.getErrorClass() == null || vr.getErrorClass() == TerminologyServiceErrorClass.UNKNOWN; } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java index 4037fbcd2..a131a99c3 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java @@ -3,13 +3,13 @@ package org.hl7.fhir.validation.instance.type; import java.util.ArrayList; import java.util.List; -import org.hl7.fhir.r5.context.IWorkerContext.CodingValidationRequest; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.model.Coding; import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.ValueSet; +import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.i18n.I18nConstants; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java index 8e0bd2148..3cf17d529 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java @@ -16,7 +16,7 @@ import java.util.Set; import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRFormatError; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.context.SimpleWorkerContext; import org.hl7.fhir.r5.context.SimpleWorkerContext.SimpleWorkerContextBuilder; import org.hl7.fhir.r5.elementmodel.Element; diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/conversion/tests/UtilitiesXTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/conversion/tests/UtilitiesXTests.java index 0d0d3085a..fe6a7f8d1 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/conversion/tests/UtilitiesXTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/conversion/tests/UtilitiesXTests.java @@ -54,8 +54,8 @@ import org.hl7.fhir.convertors.loaders.loaderR5.R2016MayToR5Loader; import org.hl7.fhir.convertors.loaders.loaderR5.R2ToR5Loader; import org.hl7.fhir.convertors.loaders.loaderR5.R3ToR5Loader; import org.hl7.fhir.convertors.loaders.loaderR5.R4ToR5Loader; +import org.hl7.fhir.r5.context.IContextResourceLoader; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.context.IWorkerContext.IContextResourceLoader; import org.hl7.fhir.r5.model.Parameters; import org.hl7.fhir.r5.test.utils.TestingUtilities; import org.hl7.fhir.utilities.CSFile; diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/terminology/tests/TerminologyServiceTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/terminology/tests/TerminologyServiceTests.java index f24573d82..411b86d0f 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/terminology/tests/TerminologyServiceTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/terminology/tests/TerminologyServiceTests.java @@ -18,7 +18,6 @@ import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50; import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRFormatError; -import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.formats.JsonParser; import org.hl7.fhir.r5.formats.XmlParser; @@ -37,6 +36,7 @@ import org.hl7.fhir.r5.model.UriType; import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent; import org.hl7.fhir.r5.terminologies.expansion.ValueSetExpansionOutcome; +import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.test.utils.CompareUtilities; import org.hl7.fhir.r5.test.utils.TestingUtilities; import org.hl7.fhir.utilities.FhirPublication; @@ -241,7 +241,7 @@ public class TerminologyServiceTests { } else { vs = engine.getContext().fetchResource(ValueSet.class, p.getParameterValue("url").primitiveValue()); } - ValidationOptions options = new ValidationOptions(); + ValidationOptions options = new ValidationOptions(FhirPublication.R5); if (p.hasParameter("displayLanguage")) { options = options.withLanguage(p.getParameterString("displayLanguage")); } else if (lang != null ) { diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/utilities/TestUtilities.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/utilities/TestUtilities.java index 3187695a0..596854fad 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/utilities/TestUtilities.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/utilities/TestUtilities.java @@ -3,7 +3,7 @@ package org.hl7.fhir.validation.tests.utilities; import java.nio.file.Paths; import java.util.Locale; -import org.hl7.fhir.r5.context.TerminologyCache; +import org.hl7.fhir.r5.terminologies.utilities.TerminologyCache; import org.hl7.fhir.r5.test.utils.TestingUtilities; import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.tests.TestConfig;