From b7fd419509fcf6ffbdabeec2b49c0c67b5638684 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Fri, 11 Aug 2023 12:25:37 +1000 Subject: [PATCH] Check experimental / draft in mini terminology service --- .../expansion/ValueSetExpander.java | 10 +++++----- .../utilities/ValueSetProcessBase.java | 18 ++++++++++++++++-- .../validation/ValueSetValidator.java | 8 ++++---- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java index 8f5d6e3af..b5b01b7a9 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java @@ -286,7 +286,7 @@ public class ValueSetExpander extends ValueSetProcessBase { private boolean filterContainsCode(List filters, String system, String code, ValueSetExpansionComponent exp) { for (ValueSet vse : filters) { - checkCanonical(exp, vse); + checkCanonical(exp, vse, focus); if (expansionContainsCode(vse.getExpansion().getContains(), system, code)) return true; } @@ -503,7 +503,7 @@ public class ValueSetExpander extends ValueSetProcessBase { focus.setExpansion(new ValueSet.ValueSetExpansionComponent()); focus.getExpansion().setTimestampElement(DateTimeType.now()); focus.getExpansion().setIdentifier(Factory.createUUID()); - checkCanonical(focus.getExpansion(), focus); + checkCanonical(focus.getExpansion(), focus, focus); for (ParametersParameterComponent p : expParams.getParameter()) { if (Utilities.existsInList(p.getName(), "includeDesignations", "excludeNested", "activeOnly", "offset", "count")) { focus.getExpansion().addParameter().setName(p.getName()).setValue(p.getValue()); @@ -643,7 +643,7 @@ public class ValueSetExpander extends ValueSetProcessBase { throw fail("Unable to find imported value set " + value); } } - checkCanonical(exp, vs); + checkCanonical(exp, vs, focus); if (noInactive) { expParams = expParams.copy(); expParams.addParameter("activeOnly", true); @@ -736,7 +736,7 @@ public class ValueSetExpander extends ValueSetProcessBase { if (imports.isEmpty()) // though this is not supposed to be the case return; ValueSet base = imports.get(0); - checkCanonical(exp, base); + checkCanonical(exp, base, focus); imports.remove(0); base.checkNoModifiers("Imported ValueSet", "expanding"); copyImportContains(base.getExpansion().getContains(), null, expParams, imports, noInactive, base.getExpansion().getProperty(), base, exp); @@ -798,7 +798,7 @@ public class ValueSetExpander extends ValueSetProcessBase { else throw failTSE("Unable to find code system " + inc.getSystem().toString()); } - checkCanonical(exp, cs); + checkCanonical(exp, cs, focus); cs.checkNoModifiers("Code System", "expanding"); if (cs.getContent() != CodeSystemContentMode.COMPLETE && cs.getContent() != CodeSystemContentMode.FRAGMENT) throw failTSE("Code system " + inc.getSystem().toString() + " is incomplete"); diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValueSetProcessBase.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValueSetProcessBase.java index 567556b45..49b37c4c9 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValueSetProcessBase.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/utilities/ValueSetProcessBase.java @@ -113,7 +113,7 @@ public class ValueSetProcessBase { return list; } - public void checkCanonical(List issues, String path, CanonicalResource resource) { + public void checkCanonical(List issues, String path, CanonicalResource resource, CanonicalResource source) { if (resource != null) { StandardsStatus standardsStatus = ToolingExtensions.getStandardsStatus(resource); if (standardsStatus == StandardsStatus.DEPRECATED) { @@ -122,6 +122,11 @@ public class ValueSetProcessBase { addToIssues(issues, makeStatusIssue(path, "withdrawn", I18nConstants.MSG_WITHDRAWN, resource)); } else if (resource.getStatus() == PublicationStatus.RETIRED) { addToIssues(issues, makeStatusIssue(path, "retired", I18nConstants.MSG_RETIRED, resource)); + } else if (resource.getExperimental() && !source.getExperimental()) { + addToIssues(issues, makeStatusIssue(path, "experimental", I18nConstants.MSG_EXPERIMENTAL, resource)); + } else if ((resource.getStatus() == PublicationStatus.DRAFT || standardsStatus == StandardsStatus.DRAFT) + && !(source.getStatus() == PublicationStatus.DRAFT || ToolingExtensions.getStandardsStatus(source) == StandardsStatus.DRAFT)) { + addToIssues(issues, makeStatusIssue(path, "draft", I18nConstants.MSG_DRAFT, resource)); } } } @@ -150,7 +155,7 @@ public class ValueSetProcessBase { } } - public void checkCanonical(ValueSetExpansionComponent params, CanonicalResource resource) { + public void checkCanonical(ValueSetExpansionComponent params, CanonicalResource resource, ValueSet source) { if (resource != null) { StandardsStatus standardsStatus = ToolingExtensions.getStandardsStatus(resource); if (standardsStatus == StandardsStatus.DEPRECATED) { @@ -165,6 +170,15 @@ public class ValueSetProcessBase { if (!params.hasParameterValue("warning-retired", resource.getVersionedUrl())) { params.addParameter("warning-retired", new UriType(resource.getVersionedUrl())); } + } else if (resource.getExperimental() && !source.getExperimental()) { + if (!params.hasParameterValue("warning-experimental", resource.getVersionedUrl())) { + params.addParameter("warning-experimental", new UriType(resource.getVersionedUrl())); + } + } else if ((resource.getStatus() == PublicationStatus.DRAFT || standardsStatus == StandardsStatus.DRAFT) + && !(source.getStatus() == PublicationStatus.DRAFT || ToolingExtensions.getStandardsStatus(source) == StandardsStatus.DRAFT)) { + if (!params.hasParameterValue("warning-draft", resource.getVersionedUrl())) { + params.addParameter("warning-draft", new UriType(resource.getVersionedUrl())); + } } } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java index df425b3fc..be8748f7e 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/validation/ValueSetValidator.java @@ -351,7 +351,7 @@ public class ValueSetValidator extends ValueSetProcessBase { List issues = new ArrayList<>(); ValidationProcessInfo info = new ValidationProcessInfo(issues); VersionInfo vi = new VersionInfo(this); - checkCanonical(issues, path, valueset); + checkCanonical(issues, path, valueset, valueset); String system = code.hasSystem() ? code.getSystem() : getValueSetSystemOrNull(); if (options.getValueSetMode() != ValueSetMode.CHECK_MEMERSHIP_ONLY) { @@ -412,7 +412,7 @@ public class ValueSetValidator extends ValueSetProcessBase { } } } else { - checkCanonical(issues, path, cs); + checkCanonical(issues, path, cs, valueset); } if (cs != null && cs.hasSupplements()) { String msg = context.formatMessage(I18nConstants.CODESYSTEM_CS_NO_SUPPLEMENT, cs.getUrl()); @@ -975,7 +975,7 @@ public class ValueSetValidator extends ValueSetProcessBase { if (valueset == null) { return false; } - checkCanonical(info.getIssues(), path, valueset); + checkCanonical(info.getIssues(), path, valueset, valueset); Boolean result = false; VersionInfo vi = new VersionInfo(this); @@ -1083,7 +1083,7 @@ public class ValueSetValidator extends ValueSetProcessBase { return null; } } else { - checkCanonical(info.getIssues(), path, cs); + checkCanonical(info.getIssues(), path, cs, valueset); if (valueset.getCompose().hasInactive() && !valueset.getCompose().getInactive()) { if (CodeSystemUtilities.isInactive(cs, code)) { return false;