From 35c7e18e55a898356674568533165b0a5d29a959 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Sun, 5 Nov 2023 09:19:39 +1100 Subject: [PATCH] Validate Vital signs Profiles when validating observations --- .../hl7/fhir/r5/utils/ToolingExtensions.java | 8 +- .../org/hl7/fhir/utilities/Utilities.java | 8 + .../fhir/utilities/i18n/I18nConstants.java | 1 + .../hl7/fhir/utilities/xml/IXMLWriter.java | 1 + .../org/hl7/fhir/utilities/xml/XMLWriter.java | 4 + .../src/main/resources/Messages.properties | 6 +- .../hl7/fhir/validation/BaseValidator.java | 32 +- .../instance/InstanceValidator.java | 134 +++--- .../instance/type/ObservationValidator.java | 129 ++++++ .../tests/ValidationEngineTests.java | 2 +- .../4.0.1/all-systems.cache | 65 +++ .../org.hl7.fhir.validation/4.0.1/loinc.cache | 392 +++++++++++++++++- .../4.0.1/snomed.cache | 47 ++- .../org.hl7.fhir.validation/4.0.1/ucum.cache | 22 +- .../5.0.0/all-systems.cache | 50 ++- .../org.hl7.fhir.validation/5.0.0/loinc.cache | 175 ++++++++ .../5.0.0/snomed.cache | 45 +- pom.xml | 2 +- 18 files changed, 1022 insertions(+), 101 deletions(-) create mode 100644 org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ObservationValidator.java diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java index 60bf03059..ced70d2a3 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/ToolingExtensions.java @@ -146,7 +146,10 @@ public class ToolingExtensions { public static final String EXT_CS_ALTERNATE_STATUS = "http://hl7.org/fhir/StructureDefinition/alternate-code-status"; public static final String EXT_OBLIGATION_PROFILE_FLAG = "http://hl7.org/fhir/tools/StructureDefinition/obligation-profile"; public static final String EXT_OBLIGATION_INHERITS = "http://hl7.org/fhir/tools/StructureDefinition/inherit-obligations"; - public static final String DAR = "http://hl7.org/fhir/StructureDefinition/data-absent-reason"; + public static final String EXT_DAR = "http://hl7.org/fhir/StructureDefinition/data-absent-reason"; + public static final String EXT_NF = "http://hl7.org/fhir/StructureDefinition/iso21090-nullFlavor"; + public static final String EXT_OT = "http://hl7.org/fhir/StructureDefinition/originalText"; + public static final String EXT_CQF_EXP = "http://hl7.org/fhir/StructureDefinition/cqf-expression"; // validated @@ -261,7 +264,8 @@ public class ToolingExtensions { public static final String EXT_RESOURCE_NAME = "http://hl7.org/fhir/StructureDefinition/resource-instance-name"; public static final String EXT_RESOURCE_DESC = "http://hl7.org/fhir/StructureDefinition/resource-instance-description"; public static final String EXT_ARTIFACT_NAME = "http://hl7.org/fhir/StructureDefinition/artifact-name"; - public static final String EXT_ARTIFACT_DESC = "http://hl7.org/fhir/StructureDefinition/artifact-description"; + public static final String EXT_ARTIFACT_DESC = "http://hl7.org/fhir/StructureDefinition/artifact-description"; + public static final String EXT_ED_SUPPRESS = "http://hl7.org/fhir/StructureDefinition/elementdefinition-suppress"; // specific extension helpers diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java index 43cd93f75..061e882c0 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java @@ -1974,6 +1974,14 @@ public class Utilities { return res; } + public static String getRelativeUrlPath(String root, String path) { + String res = path.substring(root.length()); + if (res.startsWith("/")) { + res = res.substring(1); + } + return res; + } + public static List listAllFiles(String path, List ignoreList) { List res = new ArrayList<>(); addAllFiles(res, path, new File(path), ignoreList); diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/i18n/I18nConstants.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/i18n/I18nConstants.java index 973834dec..19c6364bf 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/i18n/I18nConstants.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/i18n/I18nConstants.java @@ -1014,6 +1014,7 @@ public class I18nConstants { public static final String CDA_UNKNOWN_TEMPLATE_EXT = "CDA_UNKNOWN_TEMPLATE_EXT"; public static final String UNABLE_TO_DETERMINE_TYPE_CONTEXT_INV = "UNABLE_TO_DETERMINE_TYPE_CONTEXT_INV"; public static final String ED_CONTEXT_INVARIANT_EXPRESSION_ERROR = "ED_CONTEXT_INVARIANT_EXPRESSION_ERROR"; + public static final String VALIDATION_VAL_PROFILE_SIGNPOST_OBS = "VALIDATION_VAL_PROFILE_SIGNPOST_OBS"; } diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/IXMLWriter.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/IXMLWriter.java index 2be6e0e6e..80459e7ad 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/IXMLWriter.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/IXMLWriter.java @@ -103,4 +103,5 @@ public interface IXMLWriter { // this is only implemented by an implementation that is producing an xhtml representation, and is able to render elements as hyperlinks public abstract void link(String href); public abstract void anchor(String name); + public abstract void externalLink(String ref) throws IOException; } \ No newline at end of file diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/XMLWriter.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/XMLWriter.java index b271da9a1..a8e40fee0 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/XMLWriter.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xml/XMLWriter.java @@ -907,6 +907,10 @@ public class XMLWriter extends OutputStreamWriter implements IXMLWriter { attribute("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", ns+" "+loc); } + @Override + public void externalLink(String ref) { + // ignore this + } } \ No newline at end of file diff --git a/org.hl7.fhir.utilities/src/main/resources/Messages.properties b/org.hl7.fhir.utilities/src/main/resources/Messages.properties index 333f28dc6..90062f33f 100644 --- a/org.hl7.fhir.utilities/src/main/resources/Messages.properties +++ b/org.hl7.fhir.utilities/src/main/resources/Messages.properties @@ -392,7 +392,7 @@ Unable_to_resolve_name_reference__at_path_ = Unable to resolve name reference {0 Details_for__matching_against_Profile_ = Details for {0} matching against profile {1} Does_not_match_slice_ = Does not match slice ''{0}'' (discriminator: {1}) Profile__does_not_match_for__because_of_the_following_profile_issues__ = Profile {0} does not match for {1} because of the following profile issues: {2} -This_element_does_not_match_any_known_slice_ = This element does not match any known slice {0} +This_element_does_not_match_any_known_slice_ = This element does not match any known slice {0} (this may not be a problem, but you should check that it''s not intended to match a slice) defined_in_the_profile = Defined in the profile This_does_not_appear_to_be_a_FHIR_resource_unknown_name_ = This content cannot be parsed (unknown or unrecognized resource name ''{0}'') This_cannot_be_parsed_as_a_FHIR_object_no_name = This content cannot be parsed (no name) @@ -1070,4 +1070,6 @@ TERMINOLOGY_TX_OID_MULTIPLE_MATCHES = The OID ''{0}'' matches multiple code syst CDA_UNKNOWN_TEMPLATE = The CDA Template {0} is not known CDA_UNKNOWN_TEMPLATE_EXT = The CDA Template {0} / {1} is not known UNABLE_TO_DETERMINE_TYPE_CONTEXT_INV = The types could not be determined from the extension context, so the invariant can't be validated (types = {0}) -ED_CONTEXT_INVARIANT_EXPRESSION_ERROR = Error in constraint ''{0}'': {1} \ No newline at end of file +ED_CONTEXT_INVARIANT_EXPRESSION_ERROR = Error in constraint ''{0}'': {1} +VALIDATION_VAL_PROFILE_SIGNPOST_OBS = Validate Observation against {1} profile because the {2} code {3} was found + \ No newline at end of file diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java index 55dc10fdd..dc324a8d9 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java @@ -65,7 +65,9 @@ import org.hl7.fhir.r5.terminologies.ValueSetUtilities; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.r5.utils.XVerExtensionManager.XVerExtensionStatus; +import org.hl7.fhir.r5.utils.validation.IResourceValidator; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.IValidationContextResourceLoader; +import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel; import org.hl7.fhir.utilities.FhirPublication; import org.hl7.fhir.utilities.StandardsStatus; import org.hl7.fhir.utilities.Utilities; @@ -166,7 +168,9 @@ public class BaseValidator implements IValidationContextResourceLoader { protected boolean forPublication; protected boolean debug; protected boolean warnOnDraftOrExperimental; - protected Set statusWarnings = new HashSet<>(); + protected Set statusWarnings = new HashSet<>(); + protected BestPracticeWarningLevel bpWarnings = BestPracticeWarningLevel.Warning; + public BaseValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug) { super(); @@ -194,6 +198,7 @@ public class BaseValidator implements IValidationContextResourceLoader { this.debug = parent.debug; this.warnOnDraftOrExperimental = parent.warnOnDraftOrExperimental; this.statusWarnings = parent.statusWarnings; + this.bpWarnings = parent.bpWarnings; } private boolean doingLevel(IssueSeverity error) { @@ -1402,4 +1407,29 @@ public class BaseValidator implements IValidationContextResourceLoader { return ok; } + + public BestPracticeWarningLevel getBestPracticeWarningLevel() { + return bpWarnings; + } + + + protected boolean bpCheck(List errors, IssueType invalid, int line, int col, String literalPath, boolean test, String message, Object... theMessageArguments) { + if (bpWarnings != null) { + switch (bpWarnings) { + case Error: + rule(errors, NO_RULE_DATE, invalid, line, col, literalPath, test, message, theMessageArguments); + return test; + case Warning: + warning(errors, NO_RULE_DATE, invalid, line, col, literalPath, test, message, theMessageArguments); + return true; + case Hint: + hint(errors, NO_RULE_DATE, invalid, line, col, literalPath, test, message, theMessageArguments); + return true; + default: // do nothing + break; + } + } + return true; + } + } \ No newline at end of file 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 f33e19bff..0bc29f1b2 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 @@ -128,6 +128,7 @@ import org.hl7.fhir.r5.model.IntegerType; import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent; import org.hl7.fhir.r5.model.Period; import org.hl7.fhir.r5.model.PrimitiveType; +import org.hl7.fhir.r5.model.Property; import org.hl7.fhir.r5.model.Quantity; import org.hl7.fhir.r5.model.Range; import org.hl7.fhir.r5.model.Ratio; @@ -203,6 +204,7 @@ import org.hl7.fhir.validation.instance.type.BundleValidator; import org.hl7.fhir.validation.instance.type.CodeSystemValidator; import org.hl7.fhir.validation.instance.type.ConceptMapValidator; import org.hl7.fhir.validation.instance.type.MeasureValidator; +import org.hl7.fhir.validation.instance.type.ObservationValidator; import org.hl7.fhir.validation.instance.type.QuestionnaireValidator; import org.hl7.fhir.validation.instance.type.SearchParameterValidator; import org.hl7.fhir.validation.instance.type.StructureDefinitionValidator; @@ -320,7 +322,9 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat public FunctionDetails resolveFunction(FHIRPathEngine engine, String functionName) { switch (functionName) { case "slice": return new FunctionDetails("Returns the given slice as defined in the given structure definition. If in an invariant, First parameter can be %profile - current profile", 2, 2); - default: throw new FHIRException(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESRESOLVEFUNCTION_, functionName)); + case "getResourceKey" : return new FunctionDetails("Unique Key for resource", 0, 0); + case "getReferenceKey" : return new FunctionDetails("Unique Key for resource that is the target of the reference", 0, 1); + default: return null; } } @@ -331,7 +335,9 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat case "slice": // todo: check parameters return focus; - + + case "getResourceKey" : return new TypeDetails(CollectionStatus.SINGLETON, "string"); + case "getReferenceKey" : return new TypeDetails(CollectionStatus.SINGLETON, "string"); default: throw new Error(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESCHECKFUNCTION)); } } @@ -339,11 +345,47 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat @Override public List executeFunction(FHIRPathEngine engine, Object appContext, List focus, String functionName, List> parameters) { switch (functionName) { - case "slice": return executeSlice(engine, appContext, focus, parameters); + case "slice": return executeSlice(engine, appContext, focus, parameters);case "getResourceKey" : return executeResourceKey(focus); + case "getReferenceKey" : return executeReferenceKey(null, focus, parameters); default: throw new Error(context.formatMessage(I18nConstants.NOT_DONE_YET_VALIDATORHOSTSERVICESEXECUTEFUNCTION)); } } + + private List executeResourceKey(List focus) { + List base = new ArrayList(); + if (focus.size() == 1) { + Base res = focus.get(0); + base.add(new StringType(res.fhirType()+"/"+res.getIdBase())); + } + return base; + } + + private List executeReferenceKey(Base rootResource, List focus, List> parameters) { + List base = new ArrayList(); + if (focus.size() == 1) { + Base res = focus.get(0); + String ref = null; + if (res.fhirType().equals("Reference")) { + ref = getRef(res); + } else if (res.isPrimitive()) { + ref = res.primitiveValue(); + } else { + throw new FHIRException("Unable to generate a reference key based on a "+res.fhirType()); + } + base.add(new StringType(ref)); + } + return base; + } + + private String getRef(Base res) { + Property prop = res.getChildByName("reference"); + if (prop != null && prop.getValues().size() == 1) { + return prop.getValues().get(0).primitiveValue(); + } + return null; + } + private List executeSlice(FHIRPathEngine engine, Object appContext, List focus, List> parameters) { ValidationContext c = (ValidationContext) appContext; @@ -512,7 +554,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat private boolean noTerminologyChecks; private boolean hintAboutNonMustSupport; private boolean showMessagesFromReferences; - private BestPracticeWarningLevel bpWarnings = BestPracticeWarningLevel.Warning; private String validationLanguage; private boolean baseOnly; private boolean noCheckAggregation; @@ -716,26 +757,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return true; return false; } - - private boolean bpCheck(List errors, IssueType invalid, int line, int col, String literalPath, boolean test, String message, Object... theMessageArguments) { - if (bpWarnings != null) { - switch (bpWarnings) { - case Error: - rule(errors, NO_RULE_DATE, invalid, line, col, literalPath, test, message, theMessageArguments); - return test; - case Warning: - warning(errors, NO_RULE_DATE, invalid, line, col, literalPath, test, message, theMessageArguments); - return true; - case Hint: - hint(errors, NO_RULE_DATE, invalid, line, col, literalPath, test, message, theMessageArguments); - return true; - default: // do nothing - break; - } - } - return true; - } - @Override public org.hl7.fhir.r5.elementmodel.Element validate(Object appContext, List errors, InputStream stream, FhirFormat format) throws FHIRException { return validate(appContext, errors, stream, format, new ArrayList<>()); @@ -4105,10 +4126,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return null; } - public BestPracticeWarningLevel getBestPracticeWarningLevel() { - return bpWarnings; - } - @Override public CheckDisplayOption getCheckDisplay() { return checkDisplay; @@ -4649,14 +4666,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat this.anyExtensionsAllowed = anyExtensionsAllowed; } - public IResourceValidator setBestPracticeWarningLevel(BestPracticeWarningLevel value) { - if (value == null) { - bpWarnings = BestPracticeWarningLevel.Warning; - } else { - bpWarnings = value; - } - return this; - } @Override public void setCheckDisplay(CheckDisplayOption checkDisplay) { @@ -4724,15 +4733,14 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat if (!criteriaElement.getPath().contains("[") && discriminator.contains("[")) { discriminator = discriminator.substring(0, discriminator.indexOf('[')); String lastNode = tail(discriminator); - type = tail(criteriaElement.getPath()).substring(lastNode.length()); - type = type.substring(0, 1).toLowerCase() + type.substring(1); + type = makeTypeForFHIRPath(criteriaElement.getPath()).substring(lastNode.length()); } else if (!criteriaElement.hasType() || criteriaElement.getType().size() == 1) { if (discriminator.contains("[")) discriminator = discriminator.substring(0, discriminator.indexOf('[')); if (criteriaElement.hasType()) { - type = criteriaElement.getType().get(0).getWorkingCode(); + type = makeTypeForFHIRPath(criteriaElement.getType().get(0).getWorkingCode()); } else if (!criteriaElement.getPath().contains(".")) { - type = criteriaElement.getPath(); + type = makeTypeForFHIRPath(criteriaElement.getPath()); } else { throw new DefinitionException(context.formatMessage(I18nConstants.DISCRIMINATOR__IS_BASED_ON_TYPE_BUT_SLICE__IN__HAS_NO_TYPES, discriminator, ed.getId(), profile.getVersionedUrl())); } @@ -4818,6 +4826,25 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return pass; } + private String makeTypeForFHIRPath(String type) { + if (Utilities.isAbsoluteUrl(type)) { + if (type.startsWith("http://hl7.org/fhir/StructureDefinition/")) { + return tail(type); + } else if (type.startsWith("http://hl7.org/cda/stds/core/StructureDefinition/")) { + return "CDA."+tail(type); + } else { + return tail(type); // todo? + } + } else { + String ptype = type.substring(0, 1).toLowerCase() + type.substring(1); + if (context.isPrimitiveType(ptype)) { + return ptype; + } else { + return type; + } + } + } + private boolean isBaseDefinition(String url) { boolean b = url.startsWith("http://hl7.org/fhir/") && !url.substring(40).contains("/"); return b; @@ -5425,7 +5452,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat if (element.getType().equals(BUNDLE)) { return new BundleValidator(this, serverBase).validateBundle(errors, element, stack, checkSpecials, valContext, pct, mode) && ok; } else if (element.getType().equals("Observation")) { - return validateObservation(errors, element, stack) && ok; + return new ObservationValidator(this).validateObservation(valContext, errors, element, stack, pct, mode) && ok; } else if (element.getType().equals("Questionnaire")) { return new QuestionnaireValidator(this, myEnableWhenEvaluator, fpe, questionnaireMode).validateQuestionannaire(errors, element, element, stack) && ok; } else if (element.getType().equals("QuestionnaireResponse")) { @@ -6814,21 +6841,6 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return false; } - private boolean validateObservation(List errors, Element element, NodeStack stack) { - boolean ok = true; - // all observations should have a subject, a performer, and a time - - ok = bpCheck(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), element.getNamedChild("subject") != null, I18nConstants.ALL_OBSERVATIONS_SHOULD_HAVE_A_SUBJECT) && ok; - List performers = new ArrayList<>(); - element.getNamedChildren("performer", performers); - ok = bpCheck(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), performers.size() > 0, I18nConstants.ALL_OBSERVATIONS_SHOULD_HAVE_A_PERFORMER) && ok; - ok = bpCheck(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), - element.getNamedChild("effectiveDateTime") != null || element.getNamedChild("effectivePeriod") != null || - element.getNamedChild("effectiveTiming") != null || element.getNamedChild("effectiveInstant") != null, - I18nConstants.ALL_OBSERVATIONS_SHOULD_HAVE_AN_EFFECTIVEDATETIME_OR_AN_EFFECTIVEPERIOD, element.getProperty().typeSummary()) && ok; - return ok; - } - /* * The actual base entry point for internal use (re-entrant) */ @@ -7305,5 +7317,13 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat public void setSignatureServices(IDigitalSignatureServices signatureServices) { this.signatureServices = signatureServices; } - + + public IResourceValidator setBestPracticeWarningLevel(BestPracticeWarningLevel value) { + if (value == null) { + bpWarnings = BestPracticeWarningLevel.Warning; + } else { + bpWarnings = value; + } + return this; + } } \ No newline at end of file diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ObservationValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ObservationValidator.java new file mode 100644 index 000000000..80ccddbf3 --- /dev/null +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ObservationValidator.java @@ -0,0 +1,129 @@ +package org.hl7.fhir.validation.instance.type; + +import java.util.ArrayList; +import java.util.List; + +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.r5.elementmodel.Element; +import org.hl7.fhir.r5.model.StructureDefinition; +import org.hl7.fhir.r5.model.Base.ValidationMode; +import org.hl7.fhir.utilities.Utilities; +import org.hl7.fhir.utilities.VersionUtilities; +import org.hl7.fhir.utilities.i18n.I18nConstants; +import org.hl7.fhir.utilities.validation.ValidationMessage; +import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; +import org.hl7.fhir.validation.BaseValidator; +import org.hl7.fhir.validation.instance.InstanceValidator; +import org.hl7.fhir.validation.instance.PercentageTracker; +import org.hl7.fhir.validation.instance.utils.NodeStack; +import org.hl7.fhir.validation.instance.utils.ValidationContext; + +public class ObservationValidator extends BaseValidator { + + + public ObservationValidator(BaseValidator parent) { + super(parent); + } + + public boolean validateObservation(ValidationContext valContext, List errors, Element element, NodeStack stack, PercentageTracker pct, ValidationMode mode) { + boolean ok = true; + // all observations should have a subject, a performer, and a time + + ok = bpCheck(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), element.getNamedChild("subject") != null, I18nConstants.ALL_OBSERVATIONS_SHOULD_HAVE_A_SUBJECT) && ok; + List performers = new ArrayList<>(); + element.getNamedChildren("performer", performers); + ok = bpCheck(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), performers.size() > 0, I18nConstants.ALL_OBSERVATIONS_SHOULD_HAVE_A_PERFORMER) && ok; + ok = bpCheck(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), + element.getNamedChild("effectiveDateTime") != null || element.getNamedChild("effectivePeriod") != null || + element.getNamedChild("effectiveTiming") != null || element.getNamedChild("effectiveInstant") != null, + I18nConstants.ALL_OBSERVATIONS_SHOULD_HAVE_AN_EFFECTIVEDATETIME_OR_AN_EFFECTIVEPERIOD, element.getProperty().typeSummary()) && ok; + + // hook in the vital signs + if (VersionUtilities.isR4Plus(context.getVersion())) { + Element code = element.getNamedChild("code"); + List codes = new ArrayList<>(); + if (hasLoincCode(code, codes, "85353-1")) { + ok = checkObservationAgainstProfile(valContext, errors, element, stack, "http://hl7.org/fhir/StructureDefinition/vitalspanel", "Vital Signs Panel", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "9279-1", "76170-0", "76172-6", "76171-8", "19840-8", "33438-3", "76270-8", "11291-2")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/resprate", "Respiratory Rate", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "60978-4", "73795-7", "73799-9", "76476-1", "76477-9", "8867-4", "8889-8", "8890-6", "8891-4", "8892-2", "8893-0", "40443-4", "55425-3", "68999-2", "11328-2", "69000-8", "69000-8", "60978-4", "60978-4", "8890-6", "8886-4", "68999-2", "68999-2")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/heartrate", "Heart rate", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "2708-6", "19224-5", "20564-1", "2709-4", "2710-2", "2711-0", "2713-6", "51733-4", "59408-5", "59417-6", "89276-0", "97549-0")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/oxygensat", "Oxygen saturation", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "8310-5", "60834-9", "60835-6", "60836-4", "60838-0", "60955-2", "61009-7", "75539-7", "75987-8", "76010-8", "76011-6", "76278-1", "8309-7", "8310-5", "8328-7", "8329-5", "8330-3", "8331-1", "8332-9", "8333-7", "8334-5", "91371-5", "98657-0", "98663-8")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bodytemp", "Body temperature", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "8302-2", "3137-7", "3138-5", "8302-2", "8306-3", "8308-9")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bodyheight", "Body height", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "9843-4", "8287-5", "9843-4", "8289-1")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/headcircum", "Head circumference", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "29463-7", "29463-7", "3141-9", "3142-7", "75292-3", "79348-9", "8350-1", "8351-9")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bodyweight", "Body weight", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "39156-5", "39156-5", "59574-4", "89270-3")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bmi", "Body mass index", "LOINC", codes, pct, mode) && ok; + } else if (hasLoincCode(code, codes, "85354-9", "96607-7", "35094-2", "8459-0", "85354-9", "76534-7", "96607-7", "55284-4", "8480-6")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bp", "Blood pressure systolic and diastolic", "LOINC", codes, pct, mode) && ok; + + } else if (hasSctCode(code, codes, "46680005")) { + ok = checkObservationAgainstProfile(valContext, errors, element, stack, "http://hl7.org/fhir/StructureDefinition/vitalspanel", "Vital Signs Panel", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "86290005", "271625008", "271306003")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "Blood pressure systolic and diastolic", "Respiratory Rate", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "271306003", "249043002", "444981005", "399017001", "251670001", "429525003", "429614003")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/heartrate", "Heart rate", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "103228002", "103228002", "442349007", "442476006", "442440005", "431314004", "442734002", "713194001")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/oxygensat", "Oxygen saturation", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "386725007", "276885007", "300076005", "1222808002", "364246006", "307047009", "708499008", "708499008", "431598003", "698831002", "698832009", "415882003", "415974002", "415929009", "415945006")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bodytemp", "Body temperature", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "1153637007", "1162419008", "50373000", "1162418000", "1230278008", "1162392001", "1162417005")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bodyheight", "Body height", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "363812007", "169876006", "1269262007", "363811000")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/headcircum", "Head circumference", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "363811000", "60621009", "735395000", "425024002", "424927000", "784399000", "1162416001", "1162415002")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bodyweight", "Body weight", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "60621009")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bmi", "Body mass index", "SNOMED CT", codes, pct, mode) && ok; + } else if (hasSctCode(code, codes, "75367002", "251076008", "6797001", "163033001", "123820005", "163035008", "723232008", "386534000", "386536003", "271649006", "271649006", "271650006", "407556006", "407554009", "716579001", "399304008")) { + ok = checkObservationAgainstProfile(valContext,errors, element, stack, "http://hl7.org/fhir/StructureDefinition/bp", "Blood pressure systolic and diastolic", "SNOMED CT", codes, pct, mode) && ok; + } + } + return ok; + } + + private boolean checkObservationAgainstProfile(ValidationContext valContext, List errors, Element element, NodeStack stack, String url, String name, String sys, List loinc, PercentageTracker pct, ValidationMode mode) { + element.addMessage(signpost(errors, NO_RULE_DATE, IssueType.INFORMATIONAL, element.line(), element.col(), stack.getLiteralPath(), I18nConstants.VALIDATION_VAL_PROFILE_SIGNPOST_OBS, url, name, sys, loinc.get(0))); + StructureDefinition sd = context.fetchResource(StructureDefinition.class, url); + if (sd == null) { + return false; + } else { + return ((InstanceValidator) parent).startInner(valContext, errors, element, element, sd, stack, false, pct, mode); + } + } + + private boolean hasLoincCode(Element code, List codes, String... values) { + if (code != null) { + List codings = code.getChildren("coding"); + for (Element coding : codings) { + if ("http://loinc.org".equals(coding.getNamedChildValue("system")) && Utilities.existsInList(coding.getNamedChildValue("code"), values)) { + codes.add(coding.getNamedChildValue("code")); + return true; + } + } + } + return false; + } + + private boolean hasSctCode(Element code, List codes, String... values) { + if (code != null) { + List codings = code.getChildren("coding"); + for (Element coding : codings) { + if ("http://snomed.info/sct".equals(coding.getNamedChildValue("system")) && Utilities.existsInList(coding.getNamedChildValue("code"), values)) { + codes.add(coding.getNamedChildValue("code")); + return true; + } + } + } + return false; + } + + + +} diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java index 4625078b7..6f30fd303 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/tests/ValidationEngineTests.java @@ -271,7 +271,7 @@ public class ValidationEngineTests { int h = hints(op); Assertions.assertEquals(0, e); Assertions.assertEquals(4, w); - Assertions.assertEquals(0, h); + Assertions.assertEquals(1, h); assertTrue(logger.verifyHasNoRequests(), "Unexpected request to TX server"); if (!TestUtilities.silent) System.out.println(" .. done: " + Integer.toString(e) + " errors, " + Integer.toString(w) + " warnings, " + Integer.toString(h) + " information messages"); diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/all-systems.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/all-systems.cache index 169fb075d..6a01d89ec 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/all-systems.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/all-systems.cache @@ -1465,6 +1465,71 @@ v: { "display" : "English (Region=United States)", "code" : "en-US", "system" : "urn:ietf:bcp:47", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://snomed.info/sct", + "version" : "http://snomed.info/sct/900000000000207008/version/20210731", + "code" : "27113001", + "display" : "Body weight (observable entity)" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The CodeSystem http://snomed.info/sct version http://snomed.info/sct/900000000000207008/version/20210731 is unknown. Valid versions: [http://snomed.info/sct/11000146104/version/20230331,http://snomed.info/sct/11000172109/version/20221115,http://snomed.info/sct/2011000195101/version/20230607,http://snomed.info/sct/20611000087101/version/20220930,http://snomed.info/sct/32506021000036107/version/20220731,http://snomed.info/sct/45991000052106/version/20210531,http://snomed.info/sct/554471000005108/version/20210930,http://snomed.info/sct/731000124108/version/20230301,http://snomed.info/sct/83821000000107/version/20230412,http://snomed.info/sct/900000000000207008/version/20230131,http://snomed.info/sct/900000000000207008/version/20230731] (from Tx-Server)", + "class" : "CODESYSTEM_UNSUPPORTED", + "unknown-systems" : "http://snomed.info/sct|http://snomed.info/sct/900000000000207008/version/20210731", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://snomed.info/sct", + "code" : "276885007" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Core body temperature", + "code" : "276885007", + "system" : "http://snomed.info/sct", + "version" : "http://snomed.info/sct/900000000000207008/version/20230731", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "code" : "Cel" +}, "url": "http://hl7.org/fhir/ValueSet/ucum-bodytemp", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Cel", + "code" : "Cel", + "system" : "http://unitsofmeasure.org", + "version" : "2.0.1", "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/loinc.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/loinc.cache index d8690cd22..4f5d6015c 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/loinc.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/loinc.cache @@ -5739,7 +5739,6 @@ v: { "severity" : "error", "error" : "Unknown Code 'X-34133-9' in the system 'http://loinc.org|2.74'; The provided code 'http://loinc.org#X-34133-9' is not in the value set 'http://hl7.org/fhir/ValueSet/@all' (from Tx-Server)", "class" : "UNKNOWN", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -5760,6 +5759,397 @@ v: { "severity" : "error", "error" : "Unknown Code 'X-34133-9' in the system 'http://loinc.org|2.74'; The provided code 'http://loinc.org#X-34133-9' is not in the value set 'http://hl7.org/fhir/ValueSet/doc-typecodes--0|4.0.1' (from Tx-Server)", "class" : "UNKNOWN", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "96607-7", + "display" : "Blood pressure panel mean systolic and mean diastolic" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Blood pressure panel mean systolic and mean diastolic", + "code" : "96607-7", + "system" : "http://loinc.org", + "version" : "2.74", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "96608-5", + "display" : "Systolic blood pressure mean" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Systolic blood pressure mean", + "code" : "96608-5", + "system" : "http://loinc.org", + "version" : "2.74", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "96609-3", + "display" : "Diastolic blood pressure mean" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Diastolic blood pressure mean", + "code" : "96609-3", + "system" : "http://loinc.org", + "version" : "2.74", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "96607-7" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#96607-7' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "96608-5" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#96608-5' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "96609-3" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#96609-3' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "59408-5" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#59408-5' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "59408-5", + "display" : "O2 % BldC Oximetry" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "Wrong Display Name 'O2 % BldC Oximetry' for http://loinc.org#59408-5 - should be one of 26 choices: 'Oxygen saturation in Arterial blood by Pulse oximetry', 'SaO2 % BldA PulseOx', 'O2 SaO2' (pl-PL), 'saturacja krwi tlenem' (pl-PL), 'MFr O2' (zh-CN), 'tO2' (zh-CN), '总氧' (zh-CN), '氧气 SaO2 动脉血 动脉血O2饱和度 可用数量表示的' (zh-CN), '定量性' (zh-CN), '数值型' (zh-CN), '数量型' (zh-CN), '连续数值型标尺 时刻' (zh-CN), '随机' (zh-CN), '随意' (zh-CN), '瞬间 肺部测量指标与呼吸机管理 脉搏血氧测定法' (zh-CN), '脉搏血氧定量' (zh-CN), '脉搏血氧测定' (zh-CN), '脉搏血氧仪 血氧测定法 饱和 饱和状态 饱和程度' (zh-CN), 'O2-Sättigung' (de-DE), 'Frazione di massa Gestione ventilazione polmonare Punto nel tempo (episodio) Sangue arterioso' (it-IT), 'Oksijen doymuşluğu' (tr-TR), 'Количественный Кровь артериальная Массовая доля Насыщение кислородом Оксигемометрия' (ru-RU), 'Гемоксиметрия Точка во времени' (ru-RU), 'Момент' (ru-RU), 'zuurstofsaturatiemeting' (nl-NL) or 'O2 SatO2' (fr-BE) (for the language(s) '--') (from Tx-Server)", + "class" : "UNKNOWN", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "2708-6", + "display" : "Oxygen saturation in Arterial blood" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Oxygen saturation in Arterial blood", + "code" : "2708-6", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "3150-0" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#3150-0' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "3151-8" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#3151-8' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "8867-4" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Heart rate", + "code" : "8867-4", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "8867-4", + "display" : "Heart rate" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Heart rate", + "code" : "8867-4", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "8867-4" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Heart rate", + "code" : "8867-4", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "version" : "2.71", + "code" : "29463-7", + "display" : "Body weight" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "version" : "2.71", + "code" : "29463-7" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "8310-5" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body temperature", + "code" : "8310-5", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "8310-5" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body temperature", + "code" : "8310-5", + "system" : "http://loinc.org", + "version" : "2.74", "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/snomed.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/snomed.cache index 047a17c52..e3e7c6929 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/snomed.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/snomed.cache @@ -4228,7 +4228,6 @@ v: { "code" : "78615007", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome", "issue" : [{ @@ -4293,7 +4292,6 @@ v: { "code" : "246075003", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -4316,7 +4314,50 @@ v: { "code" : "363702006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://snomed.info/sct", + "code" : "723961002", + "display" : "Structure of left brachial artery (body structure)" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Structure of left brachial artery (body structure)", + "code" : "723961002", + "system" : "http://snomed.info/sct", + "version" : "http://snomed.info/sct/900000000000207008/version/20230731", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://snomed.info/sct", + "version" : "http://snomed.info/sct/900000000000207008/version/20210731", + "code" : "27113001" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The CodeSystem http://snomed.info/sct version http://snomed.info/sct/900000000000207008/version/20210731 is unknown. Valid versions: [http://snomed.info/sct/11000146104/version/20230331,http://snomed.info/sct/11000172109/version/20221115,http://snomed.info/sct/2011000195101/version/20230607,http://snomed.info/sct/20611000087101/version/20220930,http://snomed.info/sct/32506021000036107/version/20220731,http://snomed.info/sct/45991000052106/version/20210531,http://snomed.info/sct/554471000005108/version/20210930,http://snomed.info/sct/731000124108/version/20230301,http://snomed.info/sct/83821000000107/version/20230412,http://snomed.info/sct/900000000000207008/version/20230131,http://snomed.info/sct/900000000000207008/version/20230731] (from Tx-Server)", + "class" : "CODESYSTEM_UNSUPPORTED", + "unknown-systems" : "http://snomed.info/sct|http://snomed.info/sct/900000000000207008/version/20210731", "issues" : { "resourceType" : "OperationOutcome" } diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/ucum.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/ucum.cache index 635c4f27b..7bb071a09 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/ucum.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/4.0.1/ucum.cache @@ -556,7 +556,6 @@ v: { "code" : "h", "system" : "http://unitsofmeasure.org", "version" : "2.0.1", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -578,7 +577,6 @@ v: { "code" : "ar", "system" : "http://unitsofmeasure.org", "version" : "2.0.1", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -600,6 +598,26 @@ v: { "code" : "l", "system" : "http://unitsofmeasure.org", "version" : "2.0.1", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://unitsofmeasure.org", + "code" : "mm[Hg]{hg}" +}, "url": "http://hl7.org/fhir/ValueSet/ucum-vitals-common--0", "version": "4.0.1", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://unitsofmeasure.org#mm[Hg]{hg}' is not in the value set 'http://hl7.org/fhir/ValueSet/ucum-vitals-common--0|4.0.1' (from Tx-Server)", + "class" : "UNKNOWN", "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/all-systems.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/all-systems.cache index a9d4f86d7..6f0645f12 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/all-systems.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/all-systems.cache @@ -73,7 +73,6 @@ v: { "display" : "text/plain", "code" : "text/plain", "system" : "urn:ietf:bcp:13", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -96,7 +95,6 @@ v: { "code" : "271649006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -116,7 +114,6 @@ v: { "display" : "json", "code" : "json", "system" : "urn:ietf:bcp:13", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -137,7 +134,6 @@ v: { "display" : "World", "code" : "001", "system" : "http://unstats.un.org/unsd/methods/m49/m49.htm", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -156,7 +152,6 @@ v: { v: { "code" : "nl-NL", "system" : "urn:ietf:bcp:47", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -175,7 +170,6 @@ v: { v: { "code" : "en-AU", "system" : "urn:ietf:bcp:47", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -195,7 +189,6 @@ v: { "display" : "English", "code" : "en", "system" : "urn:ietf:bcp:47", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -217,6 +210,49 @@ v: { "display" : "World", "code" : "001", "system" : "http://unstats.un.org/unsd/methods/m49/m49.htm", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://snomed.info/sct", + "code" : "27113001", + "display" : "Body weight" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "27113001", + "system" : "http://snomed.info/sct", + "version" : "http://snomed.info/sct/900000000000207008/version/20230731", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "code" : "[lb_av]" +}, "url": "http://hl7.org/fhir/ValueSet/ucum-bodyweight", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"true", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "[lb_av]", + "code" : "[lb_av]", + "system" : "http://unitsofmeasure.org", + "version" : "2.0.1", "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/loinc.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/loinc.cache index 1fe216ac1..6c0613d07 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/loinc.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/loinc.cache @@ -814,6 +814,70 @@ v: { "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" }] }}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "29463-7" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "29463-7", + "display" : "Body Weight" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"false", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "29463-7" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### v: { "display" : "Body weight", "code" : "29463-7", @@ -826,3 +890,114 @@ v: { } ------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "3141-9" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"false", "guessSystem":"false", "valueSetMode":"CHECK_MEMERSHIP_ONLY", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "severity" : "error", + "error" : "The provided code 'http://loinc.org#3141-9' is not in the value set 'http://hl7.org/fhir/ValueSet/observation-vitalsignresult--0|5.0.0' (from Tx-Server)", + "class" : "UNKNOWN", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "29463-7", + "display" : "Body Weight" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "3141-9", + "display" : "Body weight Measured" +}, "url": "http://hl7.org/fhir/ValueSet/observation-vitalsignresult", "version": "5.0.0", "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"NO_MEMBERSHIP_CHECK", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight Measured", + "code" : "3141-9", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "29463-7" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "29463-7", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://loinc.org", + "code" : "3141-9" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight Measured", + "code" : "3141-9", + "system" : "http://loinc.org", + "version" : "2.74", + "unknown-systems" : "", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- diff --git a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/snomed.cache b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/snomed.cache index 9ba2bad42..bd77588df 100644 --- a/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/snomed.cache +++ b/org.hl7.fhir.validation/src/test/resources/txCache/org.hl7.fhir.validation/5.0.0/snomed.cache @@ -428,7 +428,6 @@ v: { "code" : "368209003", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -451,7 +450,6 @@ v: { "code" : "271649006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -473,7 +471,6 @@ v: { "code" : "271649006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -520,7 +517,6 @@ v: { "code" : "132037003", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/731000124108/version/20230301", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome", "issue" : [{ @@ -550,7 +546,6 @@ v: { "severity" : "error", "error" : "Wrong Display Name 'Pineywoods pig breed. Not.' for http://snomed.info/sct#132037003 - should be one of 3 choices: 'Pineywoods pig', 'Pineywoods pig breed (organism)' or 'Pineywoods pig breed' (for the language(s) '--') (from Tx-Server)", "class" : "UNKNOWN", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome", "issue" : [{ @@ -580,7 +575,6 @@ v: { "code" : "109006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -602,7 +596,6 @@ v: { "code" : "109006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -625,7 +618,6 @@ v: { "code" : "109006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -647,7 +639,6 @@ v: { "code" : "109006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -670,7 +661,6 @@ v: { "code" : "106004", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -691,7 +681,6 @@ v: { "severity" : "error", "error" : "The provided code 'http://snomed.info/sct#106004' is not in the value set 'http://hl7.org/fhir/ValueSet/clinical-findings--0|5.0.0' (from Tx-Server)", "class" : "UNKNOWN", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -714,7 +703,6 @@ v: { "code" : "106004", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -743,7 +731,6 @@ v: { "code" : "106004", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -766,7 +753,6 @@ v: { "code" : "85600001", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -789,7 +775,6 @@ v: { "code" : "58108001", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome", "issue" : [{ @@ -840,7 +825,6 @@ v: { "code" : "122555007", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -863,7 +847,6 @@ v: { "code" : "263678003", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -886,7 +869,6 @@ v: { "code" : "119364003", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -909,7 +891,6 @@ v: { "code" : "61088005", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -932,7 +913,6 @@ v: { "code" : "702281005", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -955,7 +935,6 @@ v: { "code" : "119361006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -978,7 +957,6 @@ v: { "code" : "32039001", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -999,7 +977,6 @@ v: { "code" : "230993007", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -1020,7 +997,6 @@ v: { "code" : "385633008", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", - "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" } @@ -1041,6 +1017,27 @@ v: { "code" : "260388006", "system" : "http://snomed.info/sct", "version" : "http://snomed.info/sct/900000000000207008/version/20230731", + "issues" : { + "resourceType" : "OperationOutcome" +} + +} +------------------------------------------------------------------------------------- +{"code" : { + "system" : "http://snomed.info/sct", + "code" : "27113001" +}, "valueSet" :null, "langs":"", "useServer":"true", "useClient":"true", "guessSystem":"false", "valueSetMode":"ALL_CHECKS", "displayWarningMode":"false", "versionFlexible":"true", "profile": { + "resourceType" : "Parameters", + "parameter" : [{ + "name" : "profile-url", + "valueString" : "http://hl7.org/fhir/ExpansionProfile/dc8fd4bc-091a-424a-8a3b-6198ef146891" + }] +}}#### +v: { + "display" : "Body weight", + "code" : "27113001", + "system" : "http://snomed.info/sct", + "version" : "http://snomed.info/sct/900000000000207008/version/20230731", "unknown-systems" : "", "issues" : { "resourceType" : "OperationOutcome" diff --git a/pom.xml b/pom.xml index fb5b99691..584efa606 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 32.0.1-jre 6.4.1 - 1.4.14 + 1.4.15-SNAPSHOT 2.15.2 5.9.2 1.8.2