diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java index 4f388a5fc..f72301f67 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java @@ -1,5 +1,7 @@ package org.hl7.fhir.r5.context; +import java.io.File; + /* Copyright (c) 2011+, HL7, Inc. All rights reserved. @@ -614,21 +616,28 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte p.setParameter("includeDefinition", false); p.setParameter("excludeNested", !heirarchical); + List allErrors = new ArrayList<>(); + // ok, first we try to expand locally + ValueSetExpanderSimple vse = new ValueSetExpanderSimple(this); try { - ValueSetExpanderSimple vse = new ValueSetExpanderSimple(this); - res = vse.doExpand(vs, p); - if (!res.getValueset().hasUrl()) { - throw new Error(formatMessage(I18nConstants.NO_URL_IN_EXPAND_VALUE_SET)); + res = vse.expand(vs, p); + allErrors.addAll(vse.getAllErrors()); + if (res.getValueset() != null) { + if (!res.getValueset().hasUrl()) { + throw new Error(formatMessage(I18nConstants.NO_URL_IN_EXPAND_VALUE_SET)); + } + txCache.cacheExpansion(cacheToken, res, TerminologyCache.TRANSIENT); + return res; } - txCache.cacheExpansion(cacheToken, res, TerminologyCache.TRANSIENT); - return res; } catch (Exception e) { + allErrors.addAll(vse.getAllErrors()); + e.printStackTrace(); } // if that failed, we try to expand on the server if (noTerminologyServer) { - return new ValueSetExpansionOutcome(formatMessage(I18nConstants.ERROR_EXPANDING_VALUESET_RUNNING_WITHOUT_TERMINOLOGY_SERVICES), TerminologyServiceErrorClass.NOSERVICE); + return new ValueSetExpansionOutcome(formatMessage(I18nConstants.ERROR_EXPANDING_VALUESET_RUNNING_WITHOUT_TERMINOLOGY_SERVICES), TerminologyServiceErrorClass.NOSERVICE, allErrors); } Map params = new HashMap(); params.put("_limit", Integer.toString(expandCodesLimit )); @@ -644,13 +653,12 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } res = new ValueSetExpansionOutcome(result).setTxLink(txLog.getLastId()); } catch (Exception e) { - res = new ValueSetExpansionOutcome(e.getMessage() == null ? e.getClass().getName() : e.getMessage(), TerminologyServiceErrorClass.UNKNOWN).setTxLink(txLog == null ? null : txLog.getLastId()); + res = new ValueSetExpansionOutcome(e.getMessage() == null ? e.getClass().getName() : e.getMessage(), TerminologyServiceErrorClass.UNKNOWN, allErrors).setTxLink(txLog == null ? null : txLog.getLastId()); } txCache.cacheExpansion(cacheToken, res, TerminologyCache.PERMANENT); return res; } - private boolean hasTooCostlyExpansion(ValueSet valueset) { return valueset != null && valueset.hasExpansion() && ToolingExtensions.hasExtension(valueset.getExpansion(), ToolingExtensions.EXT_EXP_TOOCOSTLY); } @@ -842,6 +850,9 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte // -------------------------------------------------------------------------------------------------------------------------------------------------------- public void initTS(String cachePath) throws Exception { + if (!new File(cachePath).exists()) { + Utilities.createDirectory(cachePath); + } txCache = new TerminologyCache(lock, cachePath); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpander.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpander.java index b50e36189..8b4f98c2f 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpander.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpander.java @@ -33,6 +33,8 @@ package org.hl7.fhir.r5.terminologies; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.hl7.fhir.r5.model.Parameters; import org.hl7.fhir.r5.model.ValueSet; @@ -65,6 +67,7 @@ public interface ValueSetExpander { private String error; private TerminologyServiceErrorClass errorClass; private String txLink; + private List allErrors = new ArrayList<>(); public ValueSetExpansionOutcome(ValueSet valueset) { super(); @@ -76,18 +79,31 @@ public interface ValueSetExpander { this.valueset = valueset; this.error = error; this.errorClass = errorClass; + allErrors.add(error); } public ValueSetExpansionOutcome(ValueSetChecker service, String error, TerminologyServiceErrorClass errorClass) { super(); this.valueset = null; this.error = error; this.errorClass = errorClass; + allErrors.add(error); } public ValueSetExpansionOutcome(String error, TerminologyServiceErrorClass errorClass) { this.valueset = null; this.error = error; this.errorClass = errorClass; + allErrors.add(error); } + public ValueSetExpansionOutcome(String error, TerminologyServiceErrorClass errorClass, List errList) { + this.valueset = null; + this.error = error; + this.errorClass = errorClass; + this.allErrors.addAll(errList); + if (!allErrors.contains(error)) { + allErrors.add(error); + } + } + public ValueSet getValueset() { return valueset; } @@ -104,7 +120,9 @@ public interface ValueSetExpander { this.txLink = txLink; return this; } - + public List getAllErrors() { + return allErrors; + } } /** diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpanderSimple.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpanderSimple.java index 8848b3133..c8dfad813 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpanderSimple.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/ValueSetExpanderSimple.java @@ -66,6 +66,7 @@ import java.io.IOException; */ import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -104,9 +105,6 @@ import org.hl7.fhir.r5.model.ValueSet.ValueSetComposeComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionParameterComponent; -import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple.AllConceptsFilter; -import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple.IConceptFilter; -import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple.PropertyFilter; import org.hl7.fhir.r5.utils.ToolingExtensions; import org.hl7.fhir.utilities.Utilities; @@ -128,18 +126,18 @@ public class ValueSetExpanderSimple implements ValueSetExpander { if (pc != null) { String v = pc.getValue().isPrimitive() ? pc.getValue().primitiveValue() : null; switch (filter.getOp()) { - case DESCENDENTOF: throw new FHIRException("not supported yet"); + case DESCENDENTOF: throw fail("not supported yet: "+filter.getOp().toCode()); case EQUAL: return filter.getValue().equals(v); - case EXISTS: throw new FHIRException("not supported yet"); - case GENERALIZES: throw new FHIRException("not supported yet"); - case IN: throw new FHIRException("not supported yet"); - case ISA: throw new FHIRException("not supported yet"); - case ISNOTA: throw new FHIRException("not supported yet"); - case NOTIN: throw new FHIRException("not supported yet"); - case NULL: throw new FHIRException("not supported yet"); - case REGEX: throw new FHIRException("not supported yet"); + case EXISTS: throw fail("not supported yet: "+filter.getOp().toCode()); + case GENERALIZES: throw fail("not supported yet: "+filter.getOp().toCode()); + case IN: throw fail("not supported yet: "+filter.getOp().toCode()); + case ISA: throw fail("not supported yet: "+filter.getOp().toCode()); + case ISNOTA: throw fail("not supported yet: "+filter.getOp().toCode()); + case NOTIN: throw fail("not supported yet: "+filter.getOp().toCode()); + case NULL: throw fail("not supported yet: "+filter.getOp().toCode()); + case REGEX: throw fail("not supported yet: "+filter.getOp().toCode()); default: - throw new FHIRException("Shouldn't get here"); + throw fail("Shouldn't get here"); } } else if (property.getType() == PropertyType.BOOLEAN && filter.getOp() == FilterOperator.EQUAL) { return "false".equals(filter.getValue()); @@ -183,14 +181,22 @@ public class ValueSetExpanderSimple implements ValueSetExpander { private Set excludeSystems = new HashSet(); private ValueSet focus; private int maxExpansionSize = 500; + private List allErrors = new ArrayList<>(); private int total; + private boolean checkCodesWhenExpanding; public ValueSetExpanderSimple(IWorkerContext context) { super(); this.context = context; } + public ValueSetExpanderSimple(IWorkerContext context, List allErrors) { + super(); + this.context = context; + this.allErrors = allErrors; + } + public void setMaxExpansionSize(int theMaxExpansionSize) { maxExpansionSize = theMaxExpansionSize; } @@ -318,7 +324,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { private void addCodes(ValueSetExpansionComponent expand, List params, Parameters expParams, List filters) throws ETooCostly, FHIRException { if (expand != null) { if (expand.getContains().size() > maxExpansionSize) - throw new ETooCostly("Too many codes to display (>" + Integer.toString(expand.getContains().size()) + ")"); + throw failCostly("Too many codes to display (>" + Integer.toString(expand.getContains().size()) + ")"); for (ValueSetExpansionParameterComponent p : expand.getParameter()) { if (!existsInParams(params, p.getName(), p.getValue())) params.add(p); @@ -343,7 +349,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { } if (exc.hasValueSet()) - throw new Error("Processing Value set references in exclude is not yet done in "+ctxt); + throw fail("Processing Value set references in exclude is not yet done in "+ctxt); // importValueSet(imp.getValue(), params, expParams); CodeSystem cs = context.fetchCodeSystem(exc.getSystem()); @@ -351,7 +357,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { ValueSetExpansionOutcome vse = context.expandVS(exc, false); ValueSet valueset = vse.getValueset(); if (valueset == null) - throw new TerminologyServiceException("Error Expanding ValueSet: "+vse.getError()); + throw failTSE("Error Expanding ValueSet: "+vse.getError()); excludeCodes(valueset.getExpansion(), params); return; } @@ -361,9 +367,11 @@ public class ValueSetExpanderSimple implements ValueSetExpander { } if (exc.getFilter().size() > 0) - throw new NotImplementedException("not done yet"); + throw fail("not done yet - multiple filters"); } + + private void excludeCodes(ValueSetExpansionComponent expand, List params) { for (ValueSetExpansionContainsComponent c : expand.getContains()) { excludeCode(c.getSystem(), c.getCode()); @@ -380,22 +388,23 @@ public class ValueSetExpanderSimple implements ValueSetExpander { @Override public ValueSetExpansionOutcome expand(ValueSet source, Parameters expParams) { + allErrors.clear(); try { - return doExpand(source, expParams); + return expandInternal(source, expParams); } catch (NoTerminologyServiceException e) { // well, we couldn't expand, so we'll return an interface to a checker that can check membership of the set // that might fail too, but it might not, later. - return new ValueSetExpansionOutcome(e.getMessage(), TerminologyServiceErrorClass.NOSERVICE); - } catch (RuntimeException e) { - // TODO: we should put something more specific instead of just Exception below, since - // it swallows bugs.. what would be expected to be caught there? - throw e; + return new ValueSetExpansionOutcome(e.getMessage(), TerminologyServiceErrorClass.NOSERVICE, allErrors); } catch (Exception e) { // well, we couldn't expand, so we'll return an interface to a checker that can check membership of the set // that might fail too, but it might not, later. - return new ValueSetExpansionOutcome(e.getMessage(), TerminologyServiceErrorClass.UNKNOWN); + return new ValueSetExpansionOutcome(e.getMessage(), TerminologyServiceErrorClass.UNKNOWN, allErrors); } } + + public ValueSetExpansionOutcome expandInternal(ValueSet source, Parameters expParams) throws FHIRException, FileNotFoundException, ETooCostly, IOException { + return doExpand(source, expParams); + } public ValueSetExpansionOutcome doExpand(ValueSet source, Parameters expParams) throws FHIRException, ETooCostly, FileNotFoundException, IOException { if (expParams == null) @@ -467,18 +476,24 @@ public class ValueSetExpanderSimple implements ValueSetExpander { canBeHeirarchy = false; includeCodes(inc, exp, expParams, canBeHeirarchy, extensions); } - } private ValueSet importValueSet(String value, ValueSetExpansionComponent exp, Parameters expParams) throws ETooCostly, TerminologyServiceException, FileNotFoundException, IOException, FHIRFormatError { if (value == null) - throw new TerminologyServiceException("unable to find value set with no identity"); + throw fail("unable to find value set with no identity"); ValueSet vs = context.fetchResource(ValueSet.class, value); - if (vs == null) - throw new TerminologyServiceException("Unable to find imported value set " + value); - ValueSetExpansionOutcome vso = new ValueSetExpanderSimple(context).expand(vs, expParams); - if (vso.getError() != null) - throw new TerminologyServiceException("Unable to expand imported value set: " + vso.getError()); + if (vs == null) { + if (context.fetchResource(CodeSystem.class, value) != null) { + throw fail("Cannot include value set "+value+" because it's actually a code system"); + } else { + throw fail("Unable to find imported value set " + value); + } + } + ValueSetExpansionOutcome vso = new ValueSetExpanderSimple(context, allErrors).expand(vs, expParams); + if (vso.getError() != null) { + addErrors(vso.getAllErrors()); + throw fail("Unable to expand imported value set "+vs.getUrl()+": " + vso.getError()); + } if (vs.hasVersion()) if (!existsInParams(exp.getParameter(), "version", new UriType(vs.getUrl() + "|" + vs.getVersion()))) exp.getParameter().add(new ValueSetExpansionParameterComponent().setName("version").setValue(new UriType(vs.getUrl() + "|" + vs.getVersion()))); @@ -499,6 +514,14 @@ public class ValueSetExpanderSimple implements ValueSetExpander { return vso.getValueset(); } + private void addErrors(List errs) { + for (String s : errs) { + if (!allErrors.contains(s)) { + allErrors.add(s); + } + } + } + private void copyImportContains(List list, ValueSetExpansionContainsComponent parent, Parameters expParams, List filter) throws FHIRException { for (ValueSetExpansionContainsComponent c : list) { c.checkNoModifiers("Imported Expansion in Code System", "expanding"); @@ -534,7 +557,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { private void doServerIncludeCodes(ConceptSetComponent inc, boolean heirarchical, ValueSetExpansionComponent exp, List imports, Parameters expParams, List extensions) throws FHIRException { ValueSetExpansionOutcome vso = context.expandVS(inc, heirarchical); if (vso.getError() != null) { - throw new TerminologyServiceException("Unable to expand imported value set: " + vso.getError()); + throw failTSE("Unable to expand imported value set: " + vso.getError()); } ValueSet vs = vso.getValueset(); if (vs.hasVersion()) { @@ -571,13 +594,13 @@ public class ValueSetExpanderSimple implements ValueSetExpander { public void doInternalIncludeCodes(ConceptSetComponent inc, ValueSetExpansionComponent exp, Parameters expParams, List imports, CodeSystem cs) throws NoTerminologyServiceException, TerminologyServiceException, FHIRException { if (cs == null) { if (context.isNoTerminologyServer()) - throw new NoTerminologyServiceException("Unable to find code system " + inc.getSystem().toString()); + throw failTSE("Unable to find code system " + inc.getSystem().toString()); else - throw new TerminologyServiceException("Unable to find code system " + inc.getSystem().toString()); + throw failTSE("Unable to find code system " + inc.getSystem().toString()); } cs.checkNoModifiers("Code System", "expanding"); if (cs.getContent() != CodeSystemContentMode.COMPLETE && cs.getContent() != CodeSystemContentMode.FRAGMENT) - throw new TerminologyServiceException("Code system " + inc.getSystem().toString() + " is incomplete"); + throw failTSE("Code system " + inc.getSystem().toString() + " is incomplete"); if (cs.hasVersion()) if (!existsInParams(exp.getParameter(), "version", new UriType(cs.getUrl() + "|" + cs.getVersion()))) exp.getParameter().add(new ValueSetExpansionParameterComponent().setName("version").setValue(new UriType(cs.getUrl() + "|" + cs.getVersion()))); @@ -602,7 +625,9 @@ public class ValueSetExpanderSimple implements ValueSetExpander { if (cs.getContent() == CodeSystemContentMode.FRAGMENT) { addFragmentWarning(exp, cs); } else { - throw new TerminologyServiceException("Unable to find code '" + c.getCode() + "' in code system " + cs.getUrl()); + if (checkCodesWhenExpanding) { + throw failTSE("Unable to find code '" + c.getCode() + "' in code system " + cs.getUrl()); + } } } else { inactive = CodeSystemUtilities.isInactive(cs, def); @@ -612,7 +637,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { } if (inc.getFilter().size() > 1) { canBeHeirarchy = false; // which will bt the case if we get around to supporting this - throw new TerminologyServiceException("Multiple filters not handled yet"); // need to and them, and this isn't done yet. But this shouldn't arise in non loinc and snomed value sets + throw failTSE("Multiple filters not handled yet"); // need to and them, and this isn't done yet. But this shouldn't arise in non loinc and snomed value sets } if (inc.getFilter().size() == 1) { if (cs.getContent() == CodeSystemContentMode.FRAGMENT) { @@ -623,13 +648,13 @@ public class ValueSetExpanderSimple implements ValueSetExpander { // special: all codes in the target code system under the value ConceptDefinitionComponent def = getConceptForCode(cs.getConcept(), fc.getValue()); if (def == null) - throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'"); + throw failTSE("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'"); addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null, new AllConceptsFilter()); } else if ("concept".equals(fc.getProperty()) && fc.getOp() == FilterOperator.ISNOTA) { // special: all codes in the target code system that are not under the value ConceptDefinitionComponent defEx = getConceptForCode(cs.getConcept(), fc.getValue()); if (defEx == null) - throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'"); + throw failTSE("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'"); for (ConceptDefinitionComponent def : cs.getConcept()) { addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, defEx, new AllConceptsFilter()); } @@ -637,7 +662,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { // special: all codes in the target code system under the value ConceptDefinitionComponent def = getConceptForCode(cs.getConcept(), fc.getValue()); if (def == null) - throw new TerminologyServiceException("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'"); + throw failTSE("Code '" + fc.getValue() + "' not found in system '" + inc.getSystem() + "'"); for (ConceptDefinitionComponent c : def.getConcept()) addCodeAndDescendents(cs, inc.getSystem(), c, null, expParams, imports, null, new AllConceptsFilter()); if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) { @@ -663,7 +688,7 @@ public class ValueSetExpanderSimple implements ValueSetExpander { addCodeAndDescendents(cs, inc.getSystem(), def, null, expParams, imports, null, new PropertyFilter(fc, getPropertyDefinition(cs, fc.getProperty()))); } } else { - throw new NotImplementedException("Search by property[" + fc.getProperty() + "] and op[" + fc.getOp() + "] is not supported yet"); + throw fail("Search by property[" + fc.getProperty() + "] and op[" + fc.getOp() + "] is not supported yet"); } } } @@ -714,4 +739,31 @@ public class ValueSetExpanderSimple implements ValueSetExpander { return key(c.getSystem(), c.getCode()); } + private FHIRException fail(String msg) { + allErrors.add(msg); + return new FHIRException(msg); + } + + private ETooCostly failCostly(String msg) { + allErrors.add(msg); + return new ETooCostly(msg); + } + + private TerminologyServiceException failTSE(String msg) { + allErrors.add(msg); + return new TerminologyServiceException(msg); + } + + public Collection getAllErrors() { + return allErrors; + } + + public boolean isCheckCodesWhenExpanding() { + return checkCodesWhenExpanding; + } + + public void setCheckCodesWhenExpanding(boolean checkCodesWhenExpanding) { + this.checkCodesWhenExpanding = checkCodesWhenExpanding; + } + } \ No newline at end of file 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 2e28c4485..24df4db80 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 @@ -2,12 +2,14 @@ package org.hl7.fhir.utilities.i18n; public class I18nConstants { + public static final String ADDING_WRONG_PATH = "Adding_wrong_path"; public static final String ADDING_WRONG_PATH_IN_PROFILE___VS_ = "Adding_wrong_path_in_profile___vs_"; public static final String ADDING_WRONG_PATH__OUTCOMEGETPATH___RESULTPATHBASE__ = "Adding_wrong_path__outcomegetPath___resultPathBase__"; public static final String ALL_OBSERVATIONS_SHOULD_HAVE_AN_EFFECTIVEDATETIME_OR_AN_EFFECTIVEPERIOD = "All_observations_should_have_an_effectiveDateTime_or_an_effectivePeriod"; public static final String ALL_OBSERVATIONS_SHOULD_HAVE_A_PERFORMER = "All_observations_should_have_a_performer"; public static final String ALL_OBSERVATIONS_SHOULD_HAVE_A_SUBJECT = "All_observations_should_have_a_subject"; + public static final String ALL_OK = "ALL_OK"; public static final String ATTEMPT_TO_A_SLICE_AN_ELEMENT_THAT_DOES_NOT_REPEAT__FROM__IN_ = "Attempt_to_a_slice_an_element_that_does_not_repeat__from__in_"; public static final String ATTEMPT_TO_REPLACE_ELEMENT_NAME_FOR_A_NONCHOICE_TYPE = "Attempt_to_replace_element_name_for_a_nonchoice_type"; public static final String ATTEMPT_TO_USE_A_SNAPSHOT_ON_PROFILE__AS__BEFORE_IT_IS_GENERATED = "Attempt_to_use_a_snapshot_on_profile__as__before_it_is_generated"; @@ -79,6 +81,7 @@ public class I18nConstants { public static final String ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_ = "Error_at_path__Slice_name_must_be__but_is_"; public static final String ERROR_AT__THE_TARGET_PROFILE__IS_NOT__VALID_CONSTRAINT_ON_THE_BASE_ = "Error_at__The_target_profile__is_not__valid_constraint_on_the_base_"; public static final String ERROR_EXPANDING_VALUESET_RUNNING_WITHOUT_TERMINOLOGY_SERVICES = "Error_expanding_ValueSet_running_without_terminology_services"; + public static final String ERROR_GENERATING_SNAPSHOT = "ERROR_GENERATING_SNAPSHOT"; public static final String ERROR_GENERATING_TABLE_FOR_PROFILE__ = "Error_generating_table_for_profile__"; public static final String ERROR_IN_PROFILE__AT__BASE_ISSUMMARY___DERIVED_ISSUMMARY__ = "Error_in_profile__at__Base_isSummary___derived_isSummary__"; public static final String ERROR_PARSING_ = "Error_parsing_"; @@ -103,7 +106,6 @@ public class I18nConstants { public static final String EXTENSION_EXT_SIMPLE = "Extension_EXT_Simple"; public static final String EXTENSION_EXT_SUBEXTENSION_INVALID = "Extension_EXT_SubExtension_Invalid"; public static final String EXTENSION_EXT_TYPE = "Extension_EXT_Type"; - public static final String EXTENSION_PROF_TYPE = "Extension_PROF_Type"; public static final String EXTENSION_EXT_UNKNOWN = "Extension_EXT_Unknown"; public static final String EXTENSION_EXT_UNKNOWN_NOTHERE = "Extension_EXT_Unknown_NotHere"; public static final String EXTENSION_EXT_URL_ABSOLUTE = "Extension_EXT_URL_Absolute"; @@ -112,6 +114,50 @@ public class I18nConstants { public static final String EXTENSION_EXT_VERSION_INVALID = "Extension_EXT_Version_Invalid"; public static final String EXTENSION_EXT_VERSION_INVALIDID = "Extension_EXT_Version_InvalidId"; public static final String EXTENSION_EXT_VERSION_NOCHANGE = "Extension_EXT_Version_NoChange"; + public static final String EXTENSION_PROF_TYPE = "Extension_PROF_Type"; + public static final String FHIRPATH_ALIAS_COLLECTION = "FHIRPATH_ALIAS_COLLECTION"; + public static final String FHIRPATH_CANNOT_USE = "FHIRPATH_CANNOT_USE"; + public static final String FHIRPATH_CANT_COMPARE = "FHIRPATH_CANT_COMPARE"; + public static final String FHIRPATH_CHECK_FAILED = "FHIRPATH_CHECK_FAILED"; + public static final String FHIRPATH_CODED_ONLY = "FHIRPATH_CODED_ONLY"; + public static final String FHIRPATH_DISCRIMINATOR_BAD_NAME = "FHIRPATH_DISCRIMINATOR_BAD_NAME"; + public static final String FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = "FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST"; + public static final String FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = "FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP"; + public static final String FHIRPATH_DISCRIMINATOR_CANT_FIND = "FHIRPATH_DISCRIMINATOR_CANT_FIND"; + public static final String FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES = "FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES"; + public static final String FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES = "FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES"; + public static final String FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = "FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED"; + public static final String FHIRPATH_DISCRIMINATOR_NOTYPE = "FHIRPATH_DISCRIMINATOR_NOTYPE"; + public static final String FHIRPATH_DISCRIMINATOR_NO_CODE = "FHIRPATH_DISCRIMINATOR_NO_CODE"; + public static final String FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES = "FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES"; + public static final String FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = "FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE"; + public static final String FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = "FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE"; + public static final String FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND = "FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND"; + public static final String FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE = "FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE"; + public static final String FHIRPATH_DISCRIMINATOR_TYPE_NONE = "FHIRPATH_DISCRIMINATOR_TYPE_NONE"; + public static final String FHIRPATH_HO_HOST_SERVICES = "FHIRPATH_HO_HOST_SERVICES"; + public static final String FHIRPATH_LEFT_VALUE_PLURAL = "FHIRPATH_LEFT_VALUE_PLURAL"; + public static final String FHIRPATH_LEFT_VALUE_WRONG_TYPE = "FHIRPATH_LEFT_VALUE_WRONG_TYPE"; + public static final String FHIRPATH_LOCATION = "FHIRPATH_LOCATION"; + public static final String FHIRPATH_NOT_IMPLEMENTED = "FHIRPATH_NOT_IMPLEMENTED"; + public static final String FHIRPATH_NO_COLLECTION = "FHIRPATH_NO_COLLECTION"; + public static final String FHIRPATH_NO_TYPE = "FHIRPATH_NO_TYPE"; + public static final String FHIRPATH_OP_INCOMPATIBLE = "FHIRPATH_OP_INCOMPATIBLE"; + public static final String FHIRPATH_ORDERED_ONLY = "FHIRPATH_ORDERED_ONLY"; + public static final String FHIRPATH_PARAM_WRONG = "FHIRPATH_PARAM_WRONG"; + public static final String FHIRPATH_PRIMITIVE_ONLY = "FHIRPATH_PRIMITIVE_ONLY"; + public static final String FHIRPATH_REFERENCE_ONLY = "FHIRPATH_ORDERED_ONLY"; + public static final String FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = "FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND"; + public static final String FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET = "FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET"; + public static final String FHIRPATH_RIGHT_VALUE_PLURAL = "FHIRPATH_RIGHT_VALUE_PLURAL"; + public static final String FHIRPATH_RIGHT_VALUE_WRONG_TYPE = "FHIRPATH_RIGHT_VALUE_WRONG_TYPE"; + public static final String FHIRPATH_STRING_ONLY = "FHIRPATH_STRING_ONLY"; + public static final String FHIRPATH_UNABLE_BOOLEAN = "FHIRPATH_UNABLE_BOOLEAN"; + public static final String FHIRPATH_UNKNOWN_CONSTANT = "FHIRPATH_UNKNOWN_CONSTANT"; + public static final String FHIRPATH_UNKNOWN_CONTEXT = "FHIRPATH_UNKNOWN_CONTEXT"; + public static final String FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = "FHIRPATH_UNKNOWN_CONTEXT_ELEMENT"; + public static final String FHIRPATH_UNKNOWN_NAME = "FHIRPATH_UNWKNOWN_NAME"; + public static final String FHIRPATH_WRONG_PARAM_TYPE = "FHIRPATH_WRONG_PARAM_TYPE"; public static final String FIXED_TYPE_CHECKS_DT_ADDRESS_LINE = "Fixed_Type_Checks_DT_Address_Line"; public static final String FIXED_TYPE_CHECKS_DT_NAME_FAMILY = "Fixed_Type_Checks_DT_Name_Family"; public static final String FIXED_TYPE_CHECKS_DT_NAME_GIVEN = "Fixed_Type_Checks_DT_Name_Given"; @@ -125,8 +171,8 @@ public class I18nConstants { public static final String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_EXCEEDS_64_CHARS_IN_LENGTH = "Illegal_path__in_differential_in__name_portion_exceeds_64_chars_in_length"; public static final String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_MISING_ = "Illegal_path__in_differential_in__name_portion_mising_"; public static final String ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NO_UNICODE_WHITESPACE = "Illegal_path__in_differential_in__no_unicode_whitespace"; - public static final String INTERNAL_ERROR___TYPE_NOT_KNOWN_ = "Internal_error___type_not_known_"; public static final String INTERNAL_ERROR = "Internal_error"; + public static final String INTERNAL_ERROR___TYPE_NOT_KNOWN_ = "Internal_error___type_not_known_"; public static final String INTERNAL_INT_BAD_TYPE = "Internal_INT_Bad_Type"; public static final String INTERNAL_RECURSION_DETECTION_FIND_LOOP_PATH_RECURSION____CHECK_PATHS_ARE_VALID_FOR_PATH_ = "Internal_recursion_detection_find_loop_path_recursion____check_paths_are_valid_for_path_"; public static final String INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST = "Invalid_slicing__there_is_more_than_one_type_slice_at__but_one_of_them__has_min__1_so_the_other_slices_cannot_exist"; @@ -210,6 +256,7 @@ public class I18nConstants { public static final String NO_VALUE_SET_IN_URL = "no_value_set"; public static final String NULL_MIN = "null_min"; public static final String OBJECT_MUST_HAVE_SOME_CONTENT = "Object_must_have_some_content"; + public static final String PACKAGE_VERSION_MISMATCH = "PACKAGE_VERSION_MISMATCH"; public static final String PARSER_TYPE__NOT_SUPPORTED = "Parser_Type__not_supported"; public static final String PROBLEM_EVALUATING_SLICING_EXPRESSION_FOR_ELEMENT_IN_PROFILE__PATH__FHIRPATH___ = "Problem_evaluating_slicing_expression_for_element_in_profile__path__fhirPath___"; public static final String PROBLEM_PROCESSING_EXPRESSION__IN_PROFILE__PATH__ = "Problem_processing_expression__in_profile__path__"; @@ -286,12 +333,17 @@ public class I18nConstants { public static final String RESOURCE_RES_ID_PROHIBITED = "Resource_RES_ID_Prohibited"; public static final String RESOURCE_TYPE_MISMATCH_FOR___ = "Resource_type_mismatch_for___"; public static final String SAME_ID_ON_MULTIPLE_ELEMENTS__IN_ = "Same_id_on_multiple_elements__in_"; + public static final String SEARCHPARAMETER_BASE_WRONG = "SEARCHPARAMETER_BASE_WRONG"; + public static final String SEARCHPARAMETER_EXP_WRONG = "SEARCHPARAMETER_EXP_WRONG"; + public static final String SEARCHPARAMETER_NOTFOUND = "SEARCHPARAMETER_NOTFOUND"; + public static final String SEARCHPARAMETER_TYPE_WRONG = "SEARCHPARAMETER_TYPE_WRONG"; public static final String SECURITY_STRING_CONTENT_ERROR = "SECURITY_STRING_CONTENT_ERROR"; public static final String SECURITY_STRING_CONTENT_WARNING = "SECURITY_STRING_CONTENT_WARNING"; public static final String SLICE_ENCOUNTERED_MIDWAY_THROUGH_SET_PATH___ID___ = "Slice_encountered_midway_through_set_path___id___"; public static final String SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___DISCIMINATOR___ = "Slicing_rules_on_differential__do_not_match_those_on_base___disciminator___"; public static final String SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___ORDER___ = "Slicing_rules_on_differential__do_not_match_those_on_base___order___"; public static final String SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___RULE___ = "Slicing_rules_on_differential__do_not_match_those_on_base___rule___"; + public static final String SNAPSHOT_EXISTING_PROBLEM = "SNAPSHOT_EXISTING_PROBLEM"; public static final String STRUCTUREDEFINITION__AT__ILLEGAL_CONSTRAINED_TYPE__FROM__IN_ = "StructureDefinition__at__illegal_constrained_type__from__in_"; public static final String TERMINOLOGY_PASSTHROUGH_TX_MESSAGE = "Terminology_PassThrough_TX_Message"; public static final String TERMINOLOGY_TX_BINDING_CANTCHECK = "Terminology_TX_Binding_CantCheck"; @@ -360,6 +412,10 @@ public class I18nConstants { public static final String THIS_PROPERTY_MUST_BE_A_URI_OR_BNODE_NOT_A_ = "This_property_must_be_a_URI_or_bnode_not_a_"; public static final String THIS_PROPERTY_MUST_BE__NOT_ = "This_property_must_be__not_"; public static final String THIS__CANNOT_BE_PARSED_AS_A_FHIR_OBJECT_NO_NAMESPACE = "This__cannot_be_parsed_as_a_FHIR_object_no_namespace"; + public static final String TYPE_CHECKS_FIXED_CC = "TYPE_CHECKS_FIXED_CC"; + public static final String TYPE_CHECKS_FIXED_CC_US = "TYPE_CHECKS_FIXED_CC_US"; + public static final String TYPE_CHECKS_PATTERN_CC = "TYPE_CHECKS_PATTERN_CC"; + public static final String TYPE_CHECKS_PATTERN_CC_US = "TYPE_CHECKS_PATTERN_CC_US"; public static final String TYPE_ON_FIRST_DIFFERENTIAL_ELEMENT = "type_on_first_differential_element"; public static final String TYPE_ON_FIRST_SNAPSHOT_ELEMENT_FOR__IN__FROM_ = "type_on_first_snapshot_element_for__in__from_"; public static final String TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE = "TYPE_SPECIFIC_CHECKS_CANONICAL_ABSOLUTE"; @@ -466,6 +522,7 @@ public class I18nConstants { public static final String UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT = "Unxpected_internal_condition__no_source_on_diff_element"; public static final String VALIDATION_BUNDLE_MESSAGE = "Validation_BUNDLE_Message"; public static final String VALIDATION_VAL_CONTENT_UNKNOWN = "Validation_VAL_Content_Unknown"; + public static final String VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = "VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN"; public static final String VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT = "VALIDATION_VAL_ILLEGAL_TYPE_CONSTRAINT"; public static final String VALIDATION_VAL_NOTYPE = "Validation_VAL_NoType"; public static final String VALIDATION_VAL_PROFILE_MATCHMULTIPLE = "Validation_VAL_Profile_MatchMultiple"; @@ -481,12 +538,21 @@ public class I18nConstants { public static final String VALIDATION_VAL_PROFILE_NOTSLICE = "Validation_VAL_Profile_NotSlice"; public static final String VALIDATION_VAL_PROFILE_NOTYPE = "Validation_VAL_Profile_NoType"; public static final String VALIDATION_VAL_PROFILE_OUTOFORDER = "Validation_VAL_Profile_OutOfOrder"; + public static final String VALIDATION_VAL_PROFILE_SIGNPOST = "VALIDATION_VAL_PROFILE_SIGNPOST"; + public static final String VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = "VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL"; + public static final String VALIDATION_VAL_PROFILE_SIGNPOST_META = "VALIDATION_VAL_PROFILE_SIGNPOST_META"; public static final String VALIDATION_VAL_PROFILE_SLICEORDER = "Validation_VAL_Profile_SliceOrder"; public static final String VALIDATION_VAL_PROFILE_UNKNOWN = "Validation_VAL_Profile_Unknown"; - public static final String VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN = "VALIDATION_VAL_GLOBAL_PROFILE_UNKNOWN"; public static final String VALIDATION_VAL_PROFILE_WRONGTYPE = "Validation_VAL_Profile_WrongType"; public static final String VALIDATION_VAL_PROFILE_WRONGTYPE2 = "Validation_VAL_Profile_WrongType2"; public static final String VALIDATION_VAL_UNKNOWN_PROFILE = "Validation_VAL_Unknown_Profile"; + public static final String VALUESET_INCLUDE_INVALID_CONCEPT_CODE = "VALUESET_INCLUDE_INVALID_CONCEPT_CODE"; + public static final String VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = "VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER"; + public static final String VALUESET_NO_SYSTEM_WARNING = "VALUESET_NO_SYSTEM_WARNING"; + public static final String VALUESET_REFERENCE_INVALID_TYPE = "VALUESET_REFERENCE_INVALID_TYPE"; + public static final String VALUESET_REFERENCE_UNKNOWN = "VALUESET_REFERENCE_UNKNOWN"; + public static final String VALUESET_UNC_SYSTEM_WARNING = "VALUESET_UNC_SYSTEM_WARNING"; + public static final String VALUESET_UNC_SYSTEM_WARNING_VER = "VALUESET_UNC_SYSTEM_WARNING_VER"; public static final String VERSION_MISMATCH_THE_CONTEXT_HAS_VERSION__LOADED_AND_THE_NEW_CONTENT_BEING_LOADED_IS_VERSION_ = "Version_mismatch_The_context_has_version__loaded_and_the_new_content_being_loaded_is_version_"; public static final String WRONG_NAMESPACE__EXPECTED_ = "Wrong_namespace__expected_"; public static final String WRONG_TYPE_FOR_RESOURCE = "Wrong_type_for_resource"; @@ -494,6 +560,7 @@ public class I18nConstants { public static final String XHTML_URL_INVALID = "XHTML_URL_INVALID"; public static final String XHTML_URL_INVALID_CHARS = "XHTML_URL_INVALID_CHARS"; public static final String XHTML_XHTML_ATTRIBUTE_ILLEGAL = "XHTML_XHTML_Attribute_Illegal"; + public static final String XHTML_XHTML_DOCTYPE_ILLEGAL = "XHTML_XHTML_DOCTYPE_ILLEGAL"; public static final String XHTML_XHTML_ELEMENT_ILLEGAL = "XHTML_XHTML_Element_Illegal"; public static final String XHTML_XHTML_NAME_INVALID = "XHTML_XHTML_Name_Invalid"; public static final String XHTML_XHTML_NS_INVALID = "XHTML_XHTML_NS_InValid"; @@ -504,69 +571,5 @@ public class I18nConstants { public static final String _HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_ = "_has_children__and_multiple_types__in_profile_"; public static final String _HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE = "_has_children__for_type__in_profile__but_cant_find_type"; public static final String _HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_ = "_has_no_children__and_no_types_in_profile_"; - public static final String ALL_OK = "ALL_OK"; - public static final String SEARCHPARAMETER_NOTFOUND = "SEARCHPARAMETER_NOTFOUND"; - public static final String SEARCHPARAMETER_BASE_WRONG = "SEARCHPARAMETER_BASE_WRONG"; - public static final String SEARCHPARAMETER_TYPE_WRONG = "SEARCHPARAMETER_TYPE_WRONG"; - public static final String SEARCHPARAMETER_EXP_WRONG = "SEARCHPARAMETER_EXP_WRONG"; - public static final String VALUESET_NO_SYSTEM_WARNING = "VALUESET_NO_SYSTEM_WARNING"; - public static final String VALUESET_UNC_SYSTEM_WARNING = "VALUESET_UNC_SYSTEM_WARNING"; - public static final String VALUESET_UNC_SYSTEM_WARNING_VER = "VALUESET_UNC_SYSTEM_WARNING_VER"; - public static final String VALUESET_INCLUDE_INVALID_CONCEPT_CODE = "VALUESET_INCLUDE_INVALID_CONCEPT_CODE"; - public static final String VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER = "VALUESET_INCLUDE_INVALID_CONCEPT_CODE_VER"; - public static final String TYPE_CHECKS_PATTERN_CC = "TYPE_CHECKS_PATTERN_CC"; - public static final String TYPE_CHECKS_PATTERN_CC_US = "TYPE_CHECKS_PATTERN_CC_US"; - public static final String TYPE_CHECKS_FIXED_CC = "TYPE_CHECKS_FIXED_CC"; - public static final String TYPE_CHECKS_FIXED_CC_US = "TYPE_CHECKS_FIXED_CC_US"; - public static final String VALIDATION_VAL_PROFILE_SIGNPOST = "VALIDATION_VAL_PROFILE_SIGNPOST"; - public static final String VALIDATION_VAL_PROFILE_SIGNPOST_META = "VALIDATION_VAL_PROFILE_SIGNPOST_META"; - public static final String VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL = "VALIDATION_VAL_PROFILE_SIGNPOST_GLOBAL"; - public static final String ERROR_GENERATING_SNAPSHOT = "ERROR_GENERATING_SNAPSHOT"; - public static final String SNAPSHOT_EXISTING_PROBLEM = "SNAPSHOT_EXISTING_PROBLEM"; - public static final String FHIRPATH_LOCATION = "FHIRPATH_LOCATION"; - public static final String FHIRPATH_UNKNOWN_CONTEXT = "FHIRPATH_UNKNOWN_CONTEXT"; - public static final String FHIRPATH_UNKNOWN_CONTEXT_ELEMENT = "FHIRPATH_UNKNOWN_CONTEXT_ELEMENT"; - public static final String FHIRPATH_ALIAS_COLLECTION = "FHIRPATH_ALIAS_COLLECTION"; - public static final String FHIRPATH_UNKNOWN_NAME = "FHIRPATH_UNWKNOWN_NAME"; - public static final String FHIRPATH_UNKNOWN_CONSTANT = "FHIRPATH_UNKNOWN_CONSTANT"; - public static final String FHIRPATH_CANNOT_USE = "FHIRPATH_CANNOT_USE"; - public static final String FHIRPATH_CANT_COMPARE = "FHIRPATH_CANT_COMPARE"; - public static final String FHIRPATH_LEFT_VALUE_PLURAL = "FHIRPATH_LEFT_VALUE_PLURAL"; - public static final String FHIRPATH_LEFT_VALUE_WRONG_TYPE = "FHIRPATH_LEFT_VALUE_WRONG_TYPE"; - public static final String FHIRPATH_RIGHT_VALUE_PLURAL = "FHIRPATH_RIGHT_VALUE_PLURAL"; - public static final String FHIRPATH_RIGHT_VALUE_WRONG_TYPE = "FHIRPATH_RIGHT_VALUE_WRONG_TYPE"; - public static final String FHIRPATH_OP_INCOMPATIBLE = "FHIRPATH_OP_INCOMPATIBLE"; - public static final String FHIRPATH_HO_HOST_SERVICES = "FHIRPATH_HO_HOST_SERVICES"; - public static final String FHIRPATH_WRONG_PARAM_TYPE = "FHIRPATH_WRONG_PARAM_TYPE"; - public static final String FHIRPATH_ORDERED_ONLY = "FHIRPATH_ORDERED_ONLY"; - public static final String FHIRPATH_REFERENCE_ONLY = "FHIRPATH_ORDERED_ONLY"; - public static final String FHIRPATH_CODED_ONLY = "FHIRPATH_CODED_ONLY"; - public static final String FHIRPATH_STRING_ONLY = "FHIRPATH_STRING_ONLY"; - public static final String FHIRPATH_PRIMITIVE_ONLY = "FHIRPATH_PRIMITIVE_ONLY"; - public static final String FHIRPATH_NO_COLLECTION = "FHIRPATH_NO_COLLECTION"; - public static final String FHIRPATH_NOT_IMPLEMENTED = "FHIRPATH_NOT_IMPLEMENTED"; - public static final String FHIRPATH_PARAM_WRONG = "FHIRPATH_PARAM_WRONG"; - public static final String FHIRPATH_CHECK_FAILED = "FHIRPATH_CHECK_FAILED"; - public static final String FHIRPATH_NO_TYPE = "FHIRPATH_NO_TYPE"; - public static final String FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED = "FHIRPATH_DISCRIMINATOR_NAME_ALREADY_SLICED"; - public static final String FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND = "FHIRPATH_DISCRIMINATOR_THIS_CANNOT_FIND"; - public static final String FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE = "FHIRPATH_DISCRIMINATOR_RESOLVE_NO_TYPE"; - public static final String FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES = "FHIRPATH_DISCRIMINATOR_RESOLVE_MULTIPLE_TYPES"; - public static final String FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE = "FHIRPATH_DISCRIMINATOR_RESOLVE_NOT_REFERENCE"; - public static final String FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET = "FHIRPATH_RESOLVE_DISCRIMINATOR_NO_TARGET"; - public static final String FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND = "FHIRPATH_RESOLVE_DISCRIMINATOR_CANT_FIND"; - public static final String FHIRPATH_DISCRIMINATOR_TYPE_NONE = "FHIRPATH_DISCRIMINATOR_TYPE_NONE"; - public static final String FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE = "FHIRPATH_DISCRIMINATOR_TYPE_MULTIPLE"; - public static final String FHIRPATH_DISCRIMINATOR_NO_CODE = "FHIRPATH_DISCRIMINATOR_NO_CODE"; - public static final String FHIRPATH_DISCRIMINATOR_BAD_NAME = "FHIRPATH_DISCRIMINATOR_BAD_NAME"; - public static final String FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP = "FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_GROUP"; - public static final String FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST = "FHIRPATH_DISCRIMINATOR_BAD_SYNTAX_CONST"; - public static final String FHIRPATH_DISCRIMINATOR_CANT_FIND = "FHIRPATH_DISCRIMINATOR_CANT_FIND"; - public static final String FHIRPATH_DISCRIMINATOR_NOTYPE = "FHIRPATH_DISCRIMINATOR_NOTYPE"; - public static final String FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES = "FHIRPATH_DISCRIMINATOR_MULTIPLE_TYPES"; - public static final String FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES = "FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES"; - public static final String FHIRPATH_UNABLE_BOOLEAN = "FHIRPATH_UNABLE_BOOLEAN"; - public static final String XHTML_XHTML_DOCTYPE_ILLEGAL = "XHTML_XHTML_DOCTYPE_ILLEGAL"; - public static final String PACKAGE_VERSION_MISMATCH = "PACKAGE_VERSION_MISMATCH"; } diff --git a/org.hl7.fhir.utilities/src/main/resources/Messages.properties b/org.hl7.fhir.utilities/src/main/resources/Messages.properties index 87b1ad6af..924f2d7c8 100644 --- a/org.hl7.fhir.utilities/src/main/resources/Messages.properties +++ b/org.hl7.fhir.utilities/src/main/resources/Messages.properties @@ -568,3 +568,5 @@ FHIRPATH_DISCRIMINATOR_MULTIPLE_PROFILES = Error in discriminator at {0}: no chi FHIRPATH_UNABLE_BOOLEAN = Unable to evaluate as a boolean: {0} XHTML_XHTML_DOCTYPE_ILLEGAL = Malformed XHTML: Found a DocType declaration, and these are not allowed (XXE security vulnerability protection) PACKAGE_VERSION_MISMATCH = FHIR Version mismatch in package {0}: version is {2} but must be {1} (path: {3}) +VALUESET_REFERENCE_UNKNOWN = The value set import {0} could not be found so cannot be checked +VALUESET_REFERENCE_INVALID_TYPE = The value set import {0} points to a resource of type {1} which is not valid diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java index 42938d1fd..2d8631aa5 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ValueSetValidator.java @@ -2,10 +2,13 @@ package org.hl7.fhir.validation.instance.type; import java.util.List; +import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; import org.hl7.fhir.r5.elementmodel.Element; +import org.hl7.fhir.r5.model.CodeSystem; import org.hl7.fhir.r5.model.Coding; +import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.terminologies.ValueSetExpander.TerminologyServiceErrorClass; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; @@ -56,6 +59,23 @@ public class ValueSetValidator extends BaseValidator { String system = include.getChildValue("system"); String version = include.getChildValue("version"); boolean systemOk = true; + List valuesets = include.getChildrenByName("valueSet"); + int i = 0; + for (Element ve : valuesets) { + String v = ve.getValue(); + ValueSet vs = context.fetchResource(ValueSet.class, v); + if (vs == null) { + NodeStack ns = stack.push(ve, i, ve.getProperty().getDefinition(), ve.getProperty().getDefinition()); + + Resource rs = context.fetchResource(Resource.class, v); + if (rs != null) { + warning(errors, IssueType.BUSINESSRULE, ns.getLiteralPath(), false, I18nConstants.VALUESET_REFERENCE_INVALID_TYPE, v, rs.fhirType()); + } else { + warning(errors, IssueType.BUSINESSRULE, ns.getLiteralPath(), false, I18nConstants.VALUESET_REFERENCE_UNKNOWN, v); + } + } + i++; + } List concepts = include.getChildrenByName("concept"); List filters = include.getChildrenByName("filter"); if (!Utilities.noString(system)) {