From dadda110d2664e1768d8f649190a6ea5addac6c2 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Thu, 10 Feb 2022 11:19:52 +1100 Subject: [PATCH] fix validation of bindings on choice types - only consider bindable types --- .../type/StructureDefinitionValidator.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) 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 8e9b7eced..b623469f9 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 @@ -211,7 +211,10 @@ public class StructureDefinitionValidator extends BaseValidator { private void validateBinding(List errors, Element binding, NodeStack stack, Set typeCodes, boolean snapshot, String path) { rule(errors, IssueType.BUSINESSRULE, stack.getLiteralPath(), !snapshot || bindableType(typeCodes) != null, I18nConstants.SD_ED_BIND_NO_BINDABLE, path, typeCodes.toString()); - hint(errors, IssueType.BUSINESSRULE, stack.getLiteralPath(), typeCodes.size() <= 1, I18nConstants.SD_ED_BIND_MULTIPLE_TYPES, path, typeCodes.toString()); + if (!snapshot) { + Set bindables = getListofBindableTypes(typeCodes); + hint(errors, IssueType.BUSINESSRULE, stack.getLiteralPath(), bindables.size() <= 1, I18nConstants.SD_ED_BIND_MULTIPLE_TYPES, path, typeCodes.toString()); + } if (binding.hasChild("valueSet")) { Element valueSet = binding.getNamedChild("valueSet"); @@ -230,6 +233,16 @@ public class StructureDefinitionValidator extends BaseValidator { } } + private Set getListofBindableTypes(Set types) { + Set res = new HashSet<>(); + for (String s : types) { + if (Utilities.existsInList(s, "code", "string", "url", "uri", "Coding", "CodeableConcept", "Quantity", "CodeableReference")) { + res.add(s); + } + } + return res; + } + private boolean serverSupportsValueSet(String ref) { ValidationResult vr = context.validateCode(new ValidationOptions().checkValueSetOnly().setVsAsUrl().noClient(), new Coding("http://loinc.org", "5792-7", null), new ValueSet().setUrl(ref)); return vr.getErrorClass() == null;