From f063219cde9aed2cd0f7feb932ea36a534fdba4a Mon Sep 17 00:00:00 2001 From: James Agnew Date: Wed, 29 May 2019 21:14:55 -0400 Subject: [PATCH] Port fix from https://github.com/jamesagnew/hapi-fhir/pull/1228 via Matti Uusitalo --- .../java/org/hl7/fhir/r4/validation/InstanceValidator.java | 7 ++++--- .../java/org/hl7/fhir/r5/validation/InstanceValidator.java | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r4/validation/InstanceValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r4/validation/InstanceValidator.java index 25ca31df7..40656df7a 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r4/validation/InstanceValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r4/validation/InstanceValidator.java @@ -2804,8 +2804,10 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat element.getNamedChildren("answer", answers); if (inProgress) warning(errors, IssueType.REQUIRED, element.line(), element.col(), stack.getLiteralPath(), isAnswerRequirementFulfilled(qItem, answers), "No response answer found for required item "+qItem.getLinkId()); - else + else if(myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot)) rule(errors, IssueType.REQUIRED, element.line(), element.col(), stack.getLiteralPath(), isAnswerRequirementFulfilled(qItem, answers), "No response answer found for required item "+qItem.getLinkId()); + else if (!answers.isEmpty()) // items without answers should be allowed, but not items with answers to questions that are disabled + rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), !isAnswerRequirementFulfilled(qItem, answers), "Item has answer, even though it is not enabled "+qItem.getLinkId()); if (answers.size() > 1) rule(errors, IssueType.INVALID, answers.get(1).line(), answers.get(1).col(), stack.getLiteralPath(), qItem.getRepeats(), "Only one response answer item with this linkId allowed"); @@ -2949,8 +2951,7 @@ private boolean isAnswerRequirementFulfilled(QuestionnaireItemComponent qItem, L // ok, now we have a list of known items, grouped by linkId. We've made an error for anything out of order for (QuestionnaireItemComponent qItem : qItems) { List mapItem = map.get(qItem.getLinkId()); - if (mapItem != null){ - rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot), "Item with linkId [{0}] has answer, even though it is not enabled", qItem.getLinkId()); + if (mapItem != null) { validateQuestionannaireResponseItem(qsrc, qItem, errors, mapItem, stack, inProgress, questionnaireResponseRoot); } else { //item is missing, is the question enabled? diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/InstanceValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/InstanceValidator.java index 6e904c796..5ddf9e3e7 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/InstanceValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/r5/validation/InstanceValidator.java @@ -2937,8 +2937,11 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat element.getNamedChildren("answer", answers); if (inProgress) warning(errors, IssueType.REQUIRED, element.line(), element.col(), stack.getLiteralPath(), isAnswerRequirementFulfilled(qItem, answers), "No response answer found for required item "+qItem.getLinkId()); - else + else if (myEnableWhenEvaluator.isQuestionEnabled(qItem, questionnaireResponseRoot)) rule(errors, IssueType.REQUIRED, element.line(), element.col(), stack.getLiteralPath(), isAnswerRequirementFulfilled(qItem, answers), "No response answer found for required item "+qItem.getLinkId()); + else if (!answers.isEmpty()) // items without answers should be allowed, but not items with answers to questions that are disabled + rule(errors, IssueType.INVALID, element.line(), element.col(), stack.getLiteralPath(), !isAnswerRequirementFulfilled(qItem, answers), "Item has answer, even though it is not enabled "+qItem.getLinkId()); + if (answers.size() > 1) rule(errors, IssueType.INVALID, answers.get(1).line(), answers.get(1).col(), stack.getLiteralPath(), qItem.getRepeats(), "Only one response answer item with this linkId allowed");