From 9d53b738dfc09ef2fc40da73e13e80598f54fe43 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Fri, 28 Apr 2023 07:36:00 +1000 Subject: [PATCH] Improved error message when code not in value set --- .../org/hl7/fhir/r4b/context/BaseWorkerContext.java | 8 ++++---- .../r4b/terminologies/ValueSetCheckerSimple.java | 6 ++++-- .../r5/terminologies/ValueSetCheckerSimple.java | 13 ++++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/context/BaseWorkerContext.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/context/BaseWorkerContext.java index eeb318f38..ad296998d 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/context/BaseWorkerContext.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/context/BaseWorkerContext.java @@ -1165,13 +1165,13 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte if (p.getName().equals("result")) { ok = ((BooleanType) p.getValue()).getValue().booleanValue(); } else if (p.getName().equals("message")) { - message = ((StringType) p.getValue()).getValue(); + message = p.getValue().primitiveValue(); } else if (p.getName().equals("display")) { - display = ((StringType) p.getValue()).getValue(); + display = p.getValue().primitiveValue(); } else if (p.getName().equals("system")) { - system = ((StringType) p.getValue()).getValue(); + system = p.getValue().primitiveValue(); } else if (p.getName().equals("code")) { - code = ((StringType) p.getValue()).getValue(); + code = p.getValue().primitiveValue(); } else if (p.getName().equals("cause")) { try { IssueType it = IssueType.fromCode(((StringType) p.getValue()).getValue()); diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/terminologies/ValueSetCheckerSimple.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/terminologies/ValueSetCheckerSimple.java index 45ca9c2e5..adc3c47c6 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/terminologies/ValueSetCheckerSimple.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/terminologies/ValueSetCheckerSimple.java @@ -144,7 +144,9 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe } if (valueset != null && options.getValueSetMode() != ValueSetMode.NO_MEMBERSHIP_CHECK) { Boolean result = false; + CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(",", " and "); for (Coding c : code.getCoding()) { + b.append(c.toString()); Boolean ok = codeInValueSet(c.getSystem(), c.getCode(), warnings); if (ok == null && result == false) { result = null; @@ -153,9 +155,9 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe } } if (result == null) { - warnings.add(0, context.formatMessage(I18nConstants.UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl())); + warnings.add(0, context.formatMessage(I18nConstants.UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), b.toString())); } else if (!result) { - errors.add(0, context.formatMessagePlural(code.getCoding().size(), I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl())); + errors.add(0, context.formatMessagePlural(code.getCoding().size(), I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), b.toString())); } } if (errors.size() > 0) { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetCheckerSimple.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetCheckerSimple.java index 4394866f5..0fb3b91dd 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetCheckerSimple.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetCheckerSimple.java @@ -208,7 +208,10 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe Coding foundCoding = null; if (valueset != null && options.getValueSetMode() != ValueSetMode.NO_MEMBERSHIP_CHECK) { Boolean result = false; + CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(",", " and "); + for (Coding c : code.getCoding()) { + b.append(c.toString()); Boolean ok = codeInValueSet(c.getSystem(), c.getVersion(), c.getCode(), info); if (ok == null && result == false) { result = null; @@ -218,10 +221,10 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe } } if (result == null) { - String msg = context.formatMessage(I18nConstants.UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl()); + String msg = context.formatMessage(I18nConstants.UNABLE_TO_CHECK_IF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), b.toString()); info.getIssues().addAll(makeIssue(IssueSeverity.WARNING, IssueType.INVALID, path, msg)); } else if (!result) { - String msg = context.formatMessagePlural(code.getCoding().size(), I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl()); + String msg = context.formatMessagePlural(code.getCoding().size(), I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), b.toString()); info.getIssues().addAll(makeIssue(IssueSeverity.ERROR, IssueType.INVALID, path, msg)); } } @@ -372,7 +375,7 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe if (valueset == null) { throw new VSCheckerException(warningMessage, issues); } else { - String msg = context.formatMessagePlural(1, I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl()); + String msg = context.formatMessagePlural(1, I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), code.toString()); issues.addAll(makeIssue(IssueSeverity.ERROR, IssueType.INVALID, path, msg)); throw new VSCheckerException(warningMessage+"; "+msg, issues); } @@ -440,7 +443,7 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe res.setMessage("Not in value set "+valueset.getUrl()+": "+info.summary()).setSeverity(IssueSeverity.ERROR); res.getIssues().addAll(makeIssue(IssueSeverity.ERROR, IssueType.INVALID, path, res.getMessage())); } else { - String msg = context.formatMessagePlural(1, I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl()); + String msg = context.formatMessagePlural(1, I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), code.toString()); res.setMessage(msg).setSeverity(IssueSeverity.ERROR); res.getIssues().addAll(makeIssue(IssueSeverity.ERROR, IssueType.INVALID, path, msg)); res.setDefinition(null); @@ -459,7 +462,7 @@ public class ValueSetCheckerSimple extends ValueSetWorker implements ValueSetChe } } } else if ((res != null && !res.isOk())) { - String msg = context.formatMessagePlural(1, I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl()); + String msg = context.formatMessagePlural(1, I18nConstants.NONE_OF_THE_PROVIDED_CODES_ARE_IN_THE_VALUE_SET_, valueset.getUrl(), code.toString()); res.setMessage(res.getMessage()+"; "+msg); res.getIssues().addAll(makeIssue(IssueSeverity.ERROR, IssueType.INVALID, path, msg)); }