diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/ProfileUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/ProfileUtilities.java index 2ee18d375..d40cd3cc5 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/ProfileUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/conformance/ProfileUtilities.java @@ -20,10 +20,6 @@ package org.hl7.fhir.r5.conformance; * #L% */ - - -import static org.hl7.fhir.utilities.I18nConstants.formatMessage; - import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; @@ -42,7 +38,6 @@ import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.FHIRFormatError; -import org.hl7.fhir.r5.conformance.ProfileUtilities.BaseTypeSlice; import org.hl7.fhir.r5.conformance.ProfileUtilities.ProfileKnowledgeProvider.BindingResolution; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContext.ValidationResult; @@ -101,7 +96,6 @@ import org.hl7.fhir.r5.utils.formats.CSVWriter; import org.hl7.fhir.r5.utils.formats.XLSXWriter; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.I18nConstants; -import org.hl7.fhir.utilities.TerminologyServiceOptions; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; import org.hl7.fhir.utilities.validation.ValidationOptions; @@ -280,12 +274,7 @@ public class ProfileUtilities extends TranslatingUtilities { this.messages = messages; this.pkp = pkp; } - - public ProfileUtilities(IWorkerContext theContext, List messages, ProfileKnowledgeProvider pkp, ResourceBundle i18Nmessages) { - this(theContext, messages, pkp); - this.i18nMessages = i18Nmessages; - } - + private class UnusedTracker { private boolean used; } @@ -334,7 +323,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (element.getContentReference().equals("#"+e.getId())) return getChildMap(profile, e); } - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_RESOLVE_NAME_REFERENCE__AT_PATH_, element.getContentReference(), element.getPath())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_NAME_REFERENCE__AT_PATH_, element.getContentReference(), element.getPath())); } else { List res = new ArrayList(); @@ -356,7 +345,7 @@ public class ProfileUtilities extends TranslatingUtilities { public List getSliceList(StructureDefinition profile, ElementDefinition element) throws DefinitionException { if (!element.hasSlicing()) - throw new Error(formatMessage(i18nMessages, I18nConstants.GETSLICELIST_SHOULD_ONLY_BE_CALLED_WHEN_THE_ELEMENT_HAS_SLICING)); + throw new Error(context.formatMessage(I18nConstants.GETSLICELIST_SHOULD_ONLY_BE_CALLED_WHEN_THE_ELEMENT_HAS_SLICING)); List res = new ArrayList(); List elements = profile.getSnapshot().getElement(); @@ -395,9 +384,9 @@ public class ProfileUtilities extends TranslatingUtilities { List list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); for (ElementDefinition e : list) { if (e == null) - throw new Error(formatMessage(i18nMessages, I18nConstants.ELEMENT__NULL_, profile.getUrl())); + throw new Error(context.formatMessage(I18nConstants.ELEMENT__NULL_, profile.getUrl())); if (e.getId() == null) - throw new Error(formatMessage(i18nMessages, I18nConstants.ELEMENT_ID__NULL__ON_, e.toString(), profile.getUrl())); + throw new Error(context.formatMessage(I18nConstants.ELEMENT_ID__NULL__ON_, e.toString(), profile.getUrl())); if (!capturing && id!=null && e.getId().equals(id)) { capturing = true; @@ -438,9 +427,9 @@ public class ProfileUtilities extends TranslatingUtilities { public void updateMaps(StructureDefinition base, StructureDefinition derived) throws DefinitionException { if (base == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NO_BASE_PROFILE_PROVIDED)); + throw new DefinitionException(context.formatMessage(I18nConstants.NO_BASE_PROFILE_PROVIDED)); if (derived == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NO_DERIVED_STRUCTURE_PROVIDED)); + throw new DefinitionException(context.formatMessage(I18nConstants.NO_DERIVED_STRUCTURE_PROVIDED)); for (StructureDefinitionMappingComponent baseMap : base.getMapping()) { boolean found = false; @@ -471,30 +460,30 @@ public class ProfileUtilities extends TranslatingUtilities { */ public void generateSnapshot(StructureDefinition base, StructureDefinition derived, String url, String webUrl, String profileName) throws DefinitionException, FHIRException { if (base == null) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NO_BASE_PROFILE_PROVIDED)); + throw new DefinitionException(context.formatMessage(I18nConstants.NO_BASE_PROFILE_PROVIDED)); } if (derived == null) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NO_DERIVED_STRUCTURE_PROVIDED)); + throw new DefinitionException(context.formatMessage(I18nConstants.NO_DERIVED_STRUCTURE_PROVIDED)); } checkNotGenerating(base, "Base for generating a snapshot for the profile "+derived.getUrl()); checkNotGenerating(derived, "Focus for generating a snapshot"); derived.setUserData("profileutils.snapshot.generating", true); if (!base.hasType()) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.BASE_PROFILE__HAS_NO_TYPE, base.getUrl())); + throw new DefinitionException(context.formatMessage(I18nConstants.BASE_PROFILE__HAS_NO_TYPE, base.getUrl())); } if (!derived.hasType()) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.DERIVED_PROFILE__HAS_NO_TYPE, derived.getUrl())); + throw new DefinitionException(context.formatMessage(I18nConstants.DERIVED_PROFILE__HAS_NO_TYPE, derived.getUrl())); } if (!derived.hasDerivation()) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.DERIVED_PROFILE__HAS_NO_DERIVATION_VALUE_AND_SO_CANT_BE_PROCESSED, derived.getUrl())); + throw new DefinitionException(context.formatMessage(I18nConstants.DERIVED_PROFILE__HAS_NO_DERIVATION_VALUE_AND_SO_CANT_BE_PROCESSED, derived.getUrl())); } if (!base.getType().equals(derived.getType()) && derived.getDerivation() == TypeDerivationRule.CONSTRAINT) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.BASE__DERIVED_PROFILES_HAVE_DIFFERENT_TYPES____VS___, base.getUrl(), base.getType(), derived.getUrl(), derived.getType())); + throw new DefinitionException(context.formatMessage(I18nConstants.BASE__DERIVED_PROFILES_HAVE_DIFFERENT_TYPES____VS___, base.getUrl(), base.getType(), derived.getUrl(), derived.getType())); } if (snapshotStack.contains(derived.getUrl())) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.CIRCULAR_SNAPSHOT_REFERENCES_DETECTED_CANNOT_GENERATE_SNAPSHOT_STACK__, snapshotStack.toString())); + throw new DefinitionException(context.formatMessage(I18nConstants.CIRCULAR_SNAPSHOT_REFERENCES_DETECTED_CANNOT_GENERATE_SNAPSHOT_STACK__, snapshotStack.toString())); } snapshotStack.add(derived.getUrl()); @@ -518,7 +507,7 @@ public class ProfileUtilities extends TranslatingUtilities { int diffCursor = 0; // we need a diff cursor because we can only look ahead, in the bound scoped by longer paths if (derived.hasDifferential() && !derived.getDifferential().getElementFirstRep().getPath().contains(".") && !derived.getDifferential().getElementFirstRep().getType().isEmpty()) - throw new Error(formatMessage(i18nMessages, I18nConstants.TYPE_ON_FIRST_DIFFERENTIAL_ELEMENT)); + throw new Error(context.formatMessage(I18nConstants.TYPE_ON_FIRST_DIFFERENTIAL_ELEMENT)); for (ElementDefinition e : derived.getDifferential().getElement()) e.clearUserData(GENERATED_IN_SNAPSHOT); @@ -549,7 +538,7 @@ public class ProfileUtilities extends TranslatingUtilities { } if (!derived.getSnapshot().getElementFirstRep().getType().isEmpty()) - throw new Error(formatMessage(i18nMessages, I18nConstants.TYPE_ON_FIRST_SNAPSHOT_ELEMENT_FOR__IN__FROM_, derived.getSnapshot().getElementFirstRep().getPath(), derived.getUrl(), base.getUrl())); + throw new Error(context.formatMessage(I18nConstants.TYPE_ON_FIRST_SNAPSHOT_ELEMENT_FOR__IN__FROM_, derived.getSnapshot().getElementFirstRep().getPath(), derived.getUrl(), base.getUrl())); updateMaps(base, derived); if (debug) { @@ -566,7 +555,7 @@ public class ProfileUtilities extends TranslatingUtilities { int ce = 0; for (ElementDefinition e : diff.getElement()) { if (!e.hasUserData("diff-source")) - throw new Error(formatMessage(i18nMessages, I18nConstants.UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT)); + throw new Error(context.formatMessage(I18nConstants.UNXPECTED_INTERNAL_CONDITION__NO_SOURCE_ON_DIFF_ELEMENT)); else { if (e.hasUserData(DERIVATION_EQUALS)) ((Base) e.getUserData("diff-source")).setUserData(DERIVATION_EQUALS, e.getUserData(DERIVATION_EQUALS)); @@ -645,14 +634,14 @@ public class ProfileUtilities extends TranslatingUtilities { boolean first = true; for (ElementDefinition ed : elements) { if (!ed.hasPath()) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.NO_PATH_ON_ELEMENT_IN_DIFFERENTIAL_IN_, url)); + throw new FHIRException(context.formatMessage(I18nConstants.NO_PATH_ON_ELEMENT_IN_DIFFERENTIAL_IN_, url)); } String p = ed.getPath(); if (p == null) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.NO_PATH_VALUE_ON_ELEMENT_IN_DIFFERENTIAL_IN_, url)); + throw new FHIRException(context.formatMessage(I18nConstants.NO_PATH_VALUE_ON_ELEMENT_IN_DIFFERENTIAL_IN_, url)); } if (!((first && type.equals(p)) || p.startsWith(type+"."))) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__MUST_START_WITH_, p, url, type, (first ? " (o be '"+type+"')" : ""))); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__MUST_START_WITH_, p, url, type, (first ? " (o be '"+type+"')" : ""))); } if (p.contains(".")) { // Element names (the parts of a path delineated by the '.' character) SHALL NOT contain whitespace (i.e. Unicode characters marked as whitespace) @@ -662,25 +651,25 @@ public class ProfileUtilities extends TranslatingUtilities { String[] pl = p.split("\\."); for (String pp : pl) { if (pp.length() < 1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_MISING_, p, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_MISING_, p, url)); } if (pp.length() > 64) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_EXCEEDS_64_CHARS_IN_LENGTH, p, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NAME_PORTION_EXCEEDS_64_CHARS_IN_LENGTH, p, url)); } for (char ch : pp.toCharArray()) { if (Character.isWhitespace(ch)) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NO_UNICODE_WHITESPACE, p, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__NO_UNICODE_WHITESPACE, p, url)); } if (Utilities.existsInList(ch, ',', ':', ';', '\'', '"', '/', '|', '?', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}')) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_, p, url, ch)); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_, p, url, ch)); } if (ch < ' ' || ch > 'z') { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_, p, url, ch)); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTER_, p, url, ch)); } } if (pp.contains("[") || pp.contains("]")) { if (!pp.endsWith("[x]") || (pp.substring(0, pp.length()-3).contains("[") || (pp.substring(0, pp.length()-3).contains("]")))) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTERS_, p, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ILLEGAL_PATH__IN_DIFFERENTIAL_IN__ILLEGAL_CHARACTERS_, p, url)); } } } @@ -834,7 +823,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (resultPathBase == null) resultPathBase = outcome.getPath(); else if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH__OUTCOMEGETPATH___RESULTPATHBASE__, outcome.getPath(), resultPathBase)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH__OUTCOMEGETPATH___RESULTPATHBASE__, outcome.getPath(), resultPathBase)); result.getElement().add(outcome); if (hasInnerDiffMatches(differential, cpath, diffCursor, diffLimit, base.getElement(), true)) { // well, the profile walks into this, so we need to as well @@ -844,17 +833,17 @@ public class ProfileUtilities extends TranslatingUtilities { baseCursor = indexOfFirstNonChild(base, currentBase, baseCursor+1, baseLimit); } else { if (outcome.getType().size() == 0) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), profileName)); } if (outcome.getType().size() > 1) { for (TypeRefComponent t : outcome.getType()) { if (!t.getWorkingCode().equals("Reference")) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); } } StructureDefinition dt = getProfileForDataType(outcome.getType().get(0)); if (dt == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath())); contextName = dt.getUrl(); int start = diffCursor; while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+".")) @@ -874,7 +863,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (!sd.hasSnapshot()) { StructureDefinition sdb = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition()); if (sdb == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_FIND_BASE__FOR_, sd.getBaseDefinition(), sd.getUrl())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_BASE__FOR_, sd.getBaseDefinition(), sd.getUrl())); checkNotGenerating(sdb, "an extension base"); generateSnapshot(sdb, sd, sd.getUrl(), (sdb.hasUserData("path")) ? Utilities.extractBaseUrl(sdb.getUserString("path")) : webUrl, sd.getName()); } @@ -887,7 +876,7 @@ public class ProfileUtilities extends TranslatingUtilities { src = t; } if (src == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_FIND_ELEMENT__IN_, eid, p.getValue())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_ELEMENT__IN_, eid, p.getValue())); } else src = sd.getSnapshot().getElement().get(0); template = src.copy().setPath(currentBase.getPath()); @@ -920,7 +909,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (resultPathBase == null) resultPathBase = outcome.getPath(); else if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH)); result.getElement().add(outcome); baseCursor++; diffCursor = differential.getElement().indexOf(diffMatches.get(0))+1; @@ -947,7 +936,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (ed != diffMatches.get(0) && !ed.getPath().endsWith(".extension")) nonExtension = true; if (nonExtension) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); } } } @@ -957,7 +946,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (outcome.hasContentReference()) { ElementDefinition tgt = getElementById(base.getElement(), outcome.getContentReference()); if (tgt == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_RESOLVE_REFERENCE_TO_, outcome.getContentReference())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_REFERENCE_TO_, outcome.getContentReference())); replaceFromContentReference(outcome, tgt); int nbc = base.getElement().indexOf(tgt)+1; int nbl = nbc; @@ -967,7 +956,7 @@ public class ProfileUtilities extends TranslatingUtilities { } else { StructureDefinition dt = outcome.getType().size() == 1 ? getProfileForDataType(outcome.getType().get(0)) : getProfileForDataType("Element"); if (dt == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); contextName = dt.getUrl(); processPaths(indent+" ", result, dt.getSnapshot(), differential, 1 /* starting again on the data type, but skip the root */, start, dt.getSnapshot().getElement().size()-1, diffCursor - 1, url, getWebUrl(dt, webUrl, indent), profileName+pathTail(diffMatches, 0), diffMatches.get(0).getPath(), outcome.getPath(), trimDifferential, contextName, resultPathBase, false, null, new ArrayList(), srcSD); @@ -1017,18 +1006,18 @@ public class ProfileUtilities extends TranslatingUtilities { if (diffMatches.get(0).getSlicing().hasOrdered()) { if (diffMatches.get(0).getSlicing().getOrdered()) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE, cpath, url)); } } if (diffMatches.get(0).getSlicing().hasDiscriminator()) { if (diffMatches.get(0).getSlicing().getDiscriminator().size() != 1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1, cpath, url)); } if (diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getType() != DiscriminatorType.TYPE) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE, cpath, url)); } if (!"$this".equals(diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getPath())) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS, cpath, url)); } } // check the slice names too while we're at it... @@ -1041,14 +1030,14 @@ public class ProfileUtilities extends TranslatingUtilities { if (autoFixSliceNames) { ts.defn.setSliceName(tn); } else { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.getSliceName())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.getSliceName())); } } if (!ts.defn.hasType()) { ts.defn.addType().setCode(ts.type); } else if (ts.defn.getType().size() > 1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); } else if (!ts.defn.getType().get(0).getCode().equals(ts.type)) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); } } } @@ -1058,7 +1047,7 @@ public class ProfileUtilities extends TranslatingUtilities { ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst, trimDifferential, contextName, resultPathBase, true, null, redirector, srcSD); if (e==null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.DID_NOT_FIND_TYPE_ROOT_, diffMatches.get(0).getPath())); + throw new FHIRException(context.formatMessage(I18nConstants.DID_NOT_FIND_TYPE_ROOT_, diffMatches.get(0).getPath())); // now set up slicing on the e (cause it was wiped by what we called. e.setSlicing(new ElementDefinitionSlicingComponent()); e.getSlicing().addDiscriminator().setType(DiscriminatorType.TYPE).setPath("$this"); @@ -1073,7 +1062,7 @@ public class ProfileUtilities extends TranslatingUtilities { // our processing scope for the differential is the item in the list, and all the items before the next one in the list if (diffMatches.get(i).getMin() > 0) { if (diffMatches.size() > i+1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); + throw new FHIRException(context.formatMessage(I18nConstants.INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); } else { e.setMin(1); } @@ -1105,9 +1094,9 @@ public class ProfileUtilities extends TranslatingUtilities { if (!unbounded(currentBase) && !isSlicedToOneOnly(diffMatches.get(0))) // you can only slice an element that doesn't repeat if the sum total of your slices is limited to 1 // (but you might do that in order to split up constraints by type) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ATTEMPT_TO_A_SLICE_AN_ELEMENT_THAT_DOES_NOT_REPEAT__FROM__IN_, currentBase.getPath(), currentBase.getPath(), contextName, url)); + throw new DefinitionException(context.formatMessage(I18nConstants.ATTEMPT_TO_A_SLICE_AN_ELEMENT_THAT_DOES_NOT_REPEAT__FROM__IN_, currentBase.getPath(), currentBase.getPath(), contextName, url)); if (!diffMatches.get(0).hasSlicing() && !isExtension(currentBase)) // well, the diff has set up a slice, but hasn't defined it. this is an error - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.DIFFERENTIAL_DOES_NOT_HAVE_A_SLICE__B_OF_____IN_PROFILE_, currentBase.getPath(), baseCursor, baseLimit, diffCursor, diffLimit, url)); + throw new DefinitionException(context.formatMessage(I18nConstants.DIFFERENTIAL_DOES_NOT_HAVE_A_SLICE__B_OF_____IN_PROFILE_, currentBase.getPath(), baseCursor, baseLimit, diffCursor, diffLimit, url)); // well, if it passed those preconditions then we slice the dest. int start = 0; @@ -1119,7 +1108,7 @@ public class ProfileUtilities extends TranslatingUtilities { ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst, trimDifferential, contextName, resultPathBase, true, null, redirector, srcSD); if (e==null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.DID_NOT_FIND_SINGLE_SLICE_, diffMatches.get(0).getPath())); + throw new FHIRException(context.formatMessage(I18nConstants.DID_NOT_FIND_SINGLE_SLICE_, diffMatches.get(0).getPath())); e.setSlicing(diffMatches.get(0).getSlicing()); start++; } else { @@ -1133,7 +1122,7 @@ public class ProfileUtilities extends TranslatingUtilities { else outcome.setSlicing(diffMatches.get(0).getSlicing().copy()); if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH)); result.getElement().add(outcome); // differential - if the first one in the list has a name, we'll process it. Else we'll treat it as the base definition of the slice. @@ -1141,7 +1130,7 @@ public class ProfileUtilities extends TranslatingUtilities { updateFromDefinition(outcome, diffMatches.get(0), profileName, trimDifferential, url, srcSD); removeStatusExtensions(outcome); if (!outcome.hasContentReference() && !outcome.hasType()) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NOT_DONE_YET)); + throw new DefinitionException(context.formatMessage(I18nConstants.NOT_DONE_YET)); } start++; // result.getElement().remove(result.getElement().size()-1); @@ -1190,7 +1179,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (resultPathBase == null) resultPathBase = outcome.getPath(); else if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH)); result.getElement().add(outcome); // the profile walks into this, so we need to as well // did we implicitly step into a new type? @@ -1199,17 +1188,17 @@ public class ProfileUtilities extends TranslatingUtilities { baseCursor = indexOfFirstNonChild(base, currentBase, baseCursor, baseLimit); } else { if (outcome.getType().size() == 0) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_NO_CHILDREN__AND_NO_TYPES_IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), profileName)); } if (outcome.getType().size() > 1) { for (TypeRefComponent t : outcome.getType()) { if (!t.getWorkingCode().equals("Reference")) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); } } StructureDefinition dt = getProfileForDataType(outcome.getType().get(0)); if (dt == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath())); contextName = dt.getUrl(); int start = diffCursor; while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+".")) @@ -1225,7 +1214,7 @@ public class ProfileUtilities extends TranslatingUtilities { ElementDefinition outcome = updateURLs(url, webUrl, base.getElement().get(baseCursor).copy()); outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc)); if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH_IN_PROFILE___VS_, profileName, outcome.getPath(), resultPathBase)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH_IN_PROFILE___VS_, profileName, outcome.getPath(), resultPathBase)); result.getElement().add(outcome); // so we just copy it in baseCursor++; } @@ -1273,18 +1262,18 @@ public class ProfileUtilities extends TranslatingUtilities { if (diffMatches.get(0).getSlicing().hasOrdered()) { if (diffMatches.get(0).getSlicing().getOrdered()) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGORDERED__TRUE, cpath, url)); } } if (diffMatches.get(0).getSlicing().hasDiscriminator()) { if (diffMatches.get(0).getSlicing().getDiscriminator().size() != 1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORCOUNT__1, cpath, url)); } if (diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getType() != DiscriminatorType.TYPE) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORTYPE__TYPE, cpath, url)); } if (!"$this".equals(diffMatches.get(0).getSlicing().getDiscriminatorFirstRep().getPath())) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS, cpath, url)); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__IN__TYPE_SLICING_WITH_SLICINGDISCRIMINATORPATH__THIS, cpath, url)); } } // check the slice names too while we're at it... @@ -1294,13 +1283,13 @@ public class ProfileUtilities extends TranslatingUtilities { if (!ts.defn.hasSliceName()) { ts.defn.setSliceName(tn); } else if (!ts.defn.getSliceName().equals(tn)) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.getSliceName())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_NAME_MUST_BE__BUT_IS_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.getSliceName())); } if (!ts.defn.hasType()) { ts.defn.addType().setCode(ts.type); } else if (ts.defn.getType().size() > 1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_MORE_THAN_ONE_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); } else if (!ts.defn.getType().get(0).getCode().equals(ts.type)) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT_PATH__SLICE_FOR_TYPE__HAS_WRONG_TYPE_, (!Utilities.noString(contextPathSrc) ? contextPathSrc : cpath), tn, ts.defn.typeSummary())); } } } @@ -1310,7 +1299,7 @@ public class ProfileUtilities extends TranslatingUtilities { ElementDefinition e = processPaths(indent+" ", result, base, differential, baseCursor, ndc, nbl, ndl, url, webUrl, profileName+pathTail(diffMatches, 0), contextPathSrc, contextPathDst, trimDifferential, contextName, resultPathBase, true, cpath, redirector, srcSD); if (e==null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.DID_NOT_FIND_TYPE_ROOT_, diffMatches.get(0).getPath())); + throw new FHIRException(context.formatMessage(I18nConstants.DID_NOT_FIND_TYPE_ROOT_, diffMatches.get(0).getPath())); // now set up slicing on the e (cause it was wiped by what we called. e.setSlicing(new ElementDefinitionSlicingComponent()); e.getSlicing().addDiscriminator().setType(DiscriminatorType.TYPE).setPath("$this"); @@ -1327,7 +1316,7 @@ public class ProfileUtilities extends TranslatingUtilities { // our processing scope for the differential is the item in the list, and all the items before the next one in the list if (diffMatches.get(i).getMin() > 0) { if (diffMatches.size() > i+1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); + throw new FHIRException(context.formatMessage(I18nConstants.INVALID_SLICING__THERE_IS_MORE_THAN_ONE_TYPE_SLICE_AT__BUT_ONE_OF_THEM__HAS_MIN__1_SO_THE_OTHER_SLICES_CANNOT_EXIST, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); } fixedType = type; } @@ -1379,11 +1368,11 @@ public class ProfileUtilities extends TranslatingUtilities { ElementDefinitionSlicingComponent dSlice = diffMatches.get(0).getSlicing(); ElementDefinitionSlicingComponent bSlice = currentBase.getSlicing(); if (dSlice.hasOrderedElement() && bSlice.hasOrderedElement() && !orderMatches(dSlice.getOrderedElement(), bSlice.getOrderedElement())) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___ORDER___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName)); + throw new DefinitionException(context.formatMessage(I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___ORDER___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName)); if (!discriminatorMatches(dSlice.getDiscriminator(), bSlice.getDiscriminator())) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___DISCIMINATOR___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName)); + throw new DefinitionException(context.formatMessage(I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___DISCIMINATOR___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName)); if (!currentBase.isChoice() && !ruleMatches(dSlice.getRules(), bSlice.getRules())) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___RULE___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName)); + throw new DefinitionException(context.formatMessage(I18nConstants.SLICING_RULES_ON_DIFFERENTIAL__DO_NOT_MATCH_THOSE_ON_BASE___RULE___, summarizeSlicing(dSlice), summarizeSlicing(bSlice), path, contextName)); } ElementDefinition outcome = updateURLs(url, webUrl, currentBase.copy()); outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc)); @@ -1407,11 +1396,11 @@ public class ProfileUtilities extends TranslatingUtilities { int ndl = findEndOfElement(differential, ndx); if (nbl == baseCursor) { if (base.getElement().get(baseCursor).getType().size() != 1) { - throw new Error(formatMessage(i18nMessages, I18nConstants.DIFFERENTIAL_WALKS_INTO____BUT_THE_BASE_DOES_NOT_AND_THERE_IS_NOT_A_SINGLE_FIXED_TYPE_THE_TYPE_IS__THIS_IS_NOT_HANDLED_YET, cpath, diffMatches.get(0).toString(), base.getElement().get(baseCursor).typeSummary())); + throw new Error(context.formatMessage(I18nConstants.DIFFERENTIAL_WALKS_INTO____BUT_THE_BASE_DOES_NOT_AND_THERE_IS_NOT_A_SINGLE_FIXED_TYPE_THE_TYPE_IS__THIS_IS_NOT_HANDLED_YET, cpath, diffMatches.get(0).toString(), base.getElement().get(baseCursor).typeSummary())); } StructureDefinition dt = getProfileForDataType(base.getElement().get(baseCursor).getType().get(0)); if (dt == null) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath())); + throw new DefinitionException(context.formatMessage(I18nConstants.UNKNOWN_TYPE__AT_, outcome.getType().get(0), diffMatches.get(0).getPath())); } contextName = dt.getUrl(); while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), cpath+".")) @@ -1442,7 +1431,7 @@ public class ProfileUtilities extends TranslatingUtilities { outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc)); outcome.setSlicing(null); if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH)); if (diffpos < diffMatches.size() && diffMatches.get(diffpos).hasSliceName() && diffMatches.get(diffpos).getSliceName().equals(outcome.getSliceName())) { // if there's a diff, we update the outcome with diff // no? updateFromDefinition(outcome, diffMatches.get(diffpos), profileName, closed, url); @@ -1464,7 +1453,7 @@ public class ProfileUtilities extends TranslatingUtilities { outcome = updateURLs(url, webUrl, base.getElement().get(baseCursor).copy()); outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc)); if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH)); result.getElement().add(outcome); baseCursor++; } @@ -1479,7 +1468,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (currentBase.getPath().endsWith("[x]")) { checkImplicitTypes = true; } else { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.THE_BASE_SNAPSHOT_MARKS_A_SLICING_AS_CLOSED_BUT_THE_DIFFERENTIAL_TRIES_TO_EXTEND_IT_IN__AT__, profileName, path, cpath)); + throw new DefinitionException(context.formatMessage(I18nConstants.THE_BASE_SNAPSHOT_MARKS_A_SLICING_AS_CLOSED_BUT_THE_DIFFERENTIAL_TRIES_TO_EXTEND_IT_IN__AT__, profileName, path, cpath)); } } if (diffpos == diffMatches.size()) { @@ -1490,14 +1479,14 @@ public class ProfileUtilities extends TranslatingUtilities { ElementDefinition diffItem = diffMatches.get(diffpos); for (ElementDefinition baseItem : baseMatches) if (baseItem.getSliceName().equals(diffItem.getSliceName())) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NAMED_ITEMS_ARE_OUT_OF_ORDER_IN_THE_SLICE)); + throw new DefinitionException(context.formatMessage(I18nConstants.NAMED_ITEMS_ARE_OUT_OF_ORDER_IN_THE_SLICE)); outcome = updateURLs(url, webUrl, currentBase.copy()); // outcome = updateURLs(url, diffItem.copy()); outcome.setPath(fixedPathDest(contextPathDst, outcome.getPath(), redirector, contextPathSrc)); updateFromBase(outcome, currentBase); outcome.setSlicing(null); if (!outcome.getPath().startsWith(resultPathBase)) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.ADDING_WRONG_PATH)); + throw new DefinitionException(context.formatMessage(I18nConstants.ADDING_WRONG_PATH)); result.getElement().add(outcome); updateFromDefinition(outcome, diffItem, profileName, trimDifferential, url, srcSD); removeStatusExtensions(outcome); @@ -1509,7 +1498,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (outcome.getType().size() > 1) for (TypeRefComponent t : outcome.getType()) { if (!t.getCode().equals("Reference")) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__AND_MULTIPLE_TYPES__IN_PROFILE_, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); } TypeRefComponent t = outcome.getType().get(0); if (t.getCode().equals("BackboneElement")) { @@ -1529,7 +1518,7 @@ public class ProfileUtilities extends TranslatingUtilities { // lloydfix dt = // } if (dt == null) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants._HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); + throw new DefinitionException(context.formatMessage(I18nConstants._HAS_CHILDREN__FOR_TYPE__IN_PROFILE__BUT_CANT_FIND_TYPE, diffMatches.get(0).getPath(), differential.getElement().get(diffCursor).getPath(), typeCode(outcome.getType()), profileName)); contextName = dt.getUrl(); int start = diffCursor; while (differential.getElement().size() > diffCursor && pathStartsWith(differential.getElement().get(diffCursor).getPath(), diffMatches.get(0).getPath()+".")) @@ -1553,7 +1542,7 @@ public class ProfileUtilities extends TranslatingUtilities { for (ElementDefinition e : result.getElement()) { i++; if (e.hasMinElement() && e.getMinElement().getValue()==null) - throw new Error(formatMessage(i18nMessages, I18nConstants.NULL_MIN)); + throw new Error(context.formatMessage(I18nConstants.NULL_MIN)); } return res; } @@ -1561,7 +1550,7 @@ public class ProfileUtilities extends TranslatingUtilities { private void checkNotGenerating(StructureDefinition sd, String role) { if (sd.hasUserData("profileutils.snapshot.generating")) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ATTEMPT_TO_USE_A_SNAPSHOT_ON_PROFILE__AS__BEFORE_IT_IS_GENERATED, sd.getUrl(), role)); + throw new FHIRException(context.formatMessage(I18nConstants.ATTEMPT_TO_USE_A_SNAPSHOT_ON_PROFILE__AS__BEFORE_IT_IS_GENERATED, sd.getUrl(), role)); } } @@ -1586,12 +1575,12 @@ public class ProfileUtilities extends TranslatingUtilities { } else if (isPrimitive(Utilities.uncapitalize(t))) { fixedType = Utilities.uncapitalize(t); } else { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__10_AND_IMPLICIT_SLICE_NAME_DOES_NOT_CONTAIN_A_VALID_TYPE__AT_, t, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); + throw new FHIRException(context.formatMessage(I18nConstants.UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__10_AND_IMPLICIT_SLICE_NAME_DOES_NOT_CONTAIN_A_VALID_TYPE__AT_, t, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); } } else if (diffMatches.get(i).getType().size() == 1) { fixedType = diffMatches.get(i).getType().get(0).getCode(); } else { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__1_AT_, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); + throw new FHIRException(context.formatMessage(I18nConstants.UNEXPECTED_CONDITION_IN_DIFFERENTIAL_TYPESLICETYPELISTSIZE__1_AT_, diffMatches.get(i).getPath(), diffMatches.get(i).getSliceName())); } return fixedType; } @@ -2466,7 +2455,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (derived.hasIsSummaryElement()) { if (!Base.compareDeep(derived.getIsSummaryElement(), base.getIsSummaryElement(), false)) { if (base.hasIsSummary()) - throw new Error(formatMessage(i18nMessages, I18nConstants.ERROR_IN_PROFILE__AT__BASE_ISSUMMARY___DERIVED_ISSUMMARY__, pn, derived.getPath(), base.getIsSummaryElement().asStringValue(), derived.getIsSummaryElement().asStringValue())); + throw new Error(context.formatMessage(I18nConstants.ERROR_IN_PROFILE__AT__BASE_ISSUMMARY___DERIVED_ISSUMMARY__, pn, derived.getPath(), base.getIsSummaryElement().asStringValue(), derived.getIsSummaryElement().asStringValue())); base.setIsSummaryElement(derived.getIsSummaryElement().copy()); } else if (trimDifferential) derived.setIsSummaryElement(null); @@ -2605,7 +2594,7 @@ public class ProfileUtilities extends TranslatingUtilities { } if (!tgtOk) { if (messages == null) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_AT__THE_TARGET_PROFILE__IS_NOT__VALID_CONSTRAINT_ON_THE_BASE_, purl, derived.getPath(), url, td.getTargetProfile())); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_AT__THE_TARGET_PROFILE__IS_NOT__VALID_CONSTRAINT_ON_THE_BASE_, purl, derived.getPath(), url, td.getTargetProfile())); } else { messages.add(new ValidationMessage(Source.InstanceValidator, IssueType.BUSINESSRULE, derived.getPath(), "The target profile "+u.getValue()+" is not a valid constraint on the base ("+td.getTargetProfile()+") at "+derived.getPath(), IssueSeverity.ERROR)); } @@ -2614,7 +2603,7 @@ public class ProfileUtilities extends TranslatingUtilities { } } if (!ok) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.STRUCTUREDEFINITION__AT__ILLEGAL_CONSTRAINED_TYPE__FROM__IN_, purl, derived.getPath(), t, b.toString(), srcSD.getUrl())); + throw new DefinitionException(context.formatMessage(I18nConstants.STRUCTUREDEFINITION__AT__ILLEGAL_CONSTRAINED_TYPE__FROM__IN_, purl, derived.getPath(), t, b.toString(), srcSD.getUrl())); } } @@ -3181,7 +3170,7 @@ public class ProfileUtilities extends TranslatingUtilities { try { return gen.generate(model, imagePath, 0, outputTracker); } catch (org.hl7.fhir.exceptions.FHIRException e) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.ERROR_GENERATING_TABLE_FOR_PROFILE__, profile.getUrl(), e.getMessage()), e); + throw new FHIRException(context.formatMessage(I18nConstants.ERROR_GENERATING_TABLE_FOR_PROFILE__, profile.getUrl(), e.getMessage()), e); } } @@ -4006,7 +3995,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (ed.getPath().equals(path)) return ed; } - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_FIND_ELEMENT_, path)); + throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_ELEMENT_, path)); } @@ -4275,7 +4264,7 @@ public class ProfileUtilities extends TranslatingUtilities { return sd.getType(); if (Utilities.existsInList(value, "SimpleQuantity", "MoneyQuantity")) return "Quantity"; - throw new Error(formatMessage(i18nMessages, I18nConstants.INTERNAL_ERROR___TYPE_NOT_KNOWN_, value)); + throw new Error(context.formatMessage(I18nConstants.INTERNAL_ERROR___TYPE_NOT_KNOWN_, value)); } @@ -4575,7 +4564,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (ed.getType().isEmpty() || isAbstract(ed.getType().get(0).getWorkingCode()) || ed.getType().get(0).getWorkingCode().equals(ed.getPath())) { if (ed.hasType() && "Resource".equals(ed.getType().get(0).getWorkingCode()) && child.getSelf().getType().get(0).hasProfile()) { if (child.getSelf().getType().get(0).getProfile().size() > 1) { - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNHANDLED_SITUATION_RESOURCE_IS_PROFILED_TO_MORE_THAN_ONE_OPTION__CANNOT_SORT_PROFILE)); + throw new FHIRException(context.formatMessage(I18nConstants.UNHANDLED_SITUATION_RESOURCE_IS_PROFILED_TO_MORE_THAN_ONE_OPTION__CANNOT_SORT_PROFILE)); } StructureDefinition profile = context.fetchResource(StructureDefinition.class, child.getSelf().getType().get(0).getProfile().get(0).getValue()); while (profile != null && profile.getDerivation() == TypeDerivationRule.CONSTRAINT) { @@ -4598,12 +4587,12 @@ public class ProfileUtilities extends TranslatingUtilities { } else if (ed.getType().size() == 1 && !ed.getType().get(0).getWorkingCode().equals("*")) { StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode())); if (profile==null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath())); + throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath())); ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), ed.getType().get(0).getWorkingCode(), child.getSelf().getPath().length(), cmp.name); } else if (child.getSelf().getType().size() == 1) { StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(child.getSelf().getType().get(0).getWorkingCode())); if (profile==null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath())); + throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath())); ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), child.getSelf().getType().get(0).getWorkingCode(), child.getSelf().getPath().length(), cmp.name); } else if (ed.getPath().endsWith("[x]") && !child.getSelf().getPath().endsWith("[x]")) { String edLastNode = ed.getPath().replaceAll("(.*\\.)*(.*)", "$2"); @@ -4613,12 +4602,12 @@ public class ProfileUtilities extends TranslatingUtilities { p = Utilities.uncapitalize(p); StructureDefinition sd = context.fetchResource(StructureDefinition.class, sdNs(p)); if (sd == null) - throw new Error(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_FIND_PROFILE__AT_, p, ed.getId())); + throw new Error(context.formatMessage(I18nConstants.UNABLE_TO_FIND_PROFILE__AT_, p, ed.getId())); ccmp = new ElementDefinitionComparer(false, sd.getSnapshot().getElement(), p, child.getSelf().getPath().length(), cmp.name); } else if (child.getSelf().hasType() && child.getSelf().getType().get(0).getWorkingCode().equals("Reference")) { for (TypeRefComponent t: child.getSelf().getType()) { if (!t.getWorkingCode().equals("Reference")) { - throw new Error(formatMessage(i18nMessages, I18nConstants.CANT_HAVE_CHILDREN_ON_AN_ELEMENT_WITH_A_POLYMORPHIC_TYPE__YOU_MUST_SLICE_AND_CONSTRAIN_THE_TYPES_FIRST_SORTELEMENTS_, ed.getPath(), typeCode(ed.getType()))); + throw new Error(context.formatMessage(I18nConstants.CANT_HAVE_CHILDREN_ON_AN_ELEMENT_WITH_A_POLYMORPHIC_TYPE__YOU_MUST_SLICE_AND_CONSTRAIN_THE_TYPES_FIRST_SORTELEMENTS_, ed.getPath(), typeCode(ed.getType()))); } } StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode())); @@ -4626,7 +4615,7 @@ public class ProfileUtilities extends TranslatingUtilities { } else if (!child.getSelf().hasType() && ed.getType().get(0).getWorkingCode().equals("Reference")) { for (TypeRefComponent t: ed.getType()) { if (!t.getWorkingCode().equals("Reference")) { - throw new Error(formatMessage(i18nMessages, I18nConstants.NOT_HANDLED_YET_SORTELEMENTS_, ed.getPath(), typeCode(ed.getType()))); + throw new Error(context.formatMessage(I18nConstants.NOT_HANDLED_YET_SORTELEMENTS_, ed.getPath(), typeCode(ed.getType()))); } } StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs(ed.getType().get(0).getWorkingCode())); @@ -4635,7 +4624,7 @@ public class ProfileUtilities extends TranslatingUtilities { // this is allowed if we only profile the extensions StructureDefinition profile = context.fetchResource(StructureDefinition.class, sdNs("Element")); if (profile==null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath())); + throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_RESOLVE_PROFILE__IN_ELEMENT_, sdNs(ed.getType().get(0).getWorkingCode()), ed.getPath())); ccmp = new ElementDefinitionComparer(false, profile.getSnapshot().getElement(), "Element", child.getSelf().getPath().length(), cmp.name); // throw new Error("Not handled yet (sortElements: "+ed.getPath()+":"+typeCode(ed.getType())+")"); } @@ -4704,9 +4693,9 @@ public class ProfileUtilities extends TranslatingUtilities { // generate schematrons for the rules in a structure definition public void generateSchematrons(OutputStream dest, StructureDefinition structure) throws IOException, DefinitionException { if (structure.getDerivation() != TypeDerivationRule.CONSTRAINT) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NOT_THE_RIGHT_KIND_OF_STRUCTURE_TO_GENERATE_SCHEMATRONS_FOR)); + throw new DefinitionException(context.formatMessage(I18nConstants.NOT_THE_RIGHT_KIND_OF_STRUCTURE_TO_GENERATE_SCHEMATRONS_FOR)); if (!structure.hasSnapshot()) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NEEDS_A_SNAPSHOT)); + throw new DefinitionException(context.formatMessage(I18nConstants.NEEDS_A_SNAPSHOT)); StructureDefinition base = context.fetchResource(StructureDefinition.class, structure.getBaseDefinition()); @@ -4722,7 +4711,7 @@ public class ProfileUtilities extends TranslatingUtilities { // generate a CSV representation of the structure definition public void generateCsvs(OutputStream dest, StructureDefinition structure, boolean asXml) throws IOException, DefinitionException, Exception { if (!structure.hasSnapshot()) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NEEDS_A_SNAPSHOT)); + throw new DefinitionException(context.formatMessage(I18nConstants.NEEDS_A_SNAPSHOT)); CSVWriter csv = new CSVWriter(dest, structure, asXml); @@ -4738,7 +4727,7 @@ public class ProfileUtilities extends TranslatingUtilities { System.out.println("no structure!"); } if (!structure.hasSnapshot()) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NEEDS_A_SNAPSHOT)); + throw new DefinitionException(context.formatMessage(I18nConstants.NEEDS_A_SNAPSHOT)); } XLSXWriter xlsx = new XLSXWriter(dest, structure, asXml, hideMustSupportFalse); @@ -4898,7 +4887,7 @@ public class ProfileUtilities extends TranslatingUtilities { for (ElementDefinition ed : list) { List paths = new ArrayList(); if (!ed.hasPath()) - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.NO_PATH_ON_ELEMENT_DEFINITION__IN_, Integer.toString(list.indexOf(ed)), name)); + throw new DefinitionException(context.formatMessage(I18nConstants.NO_PATH_ON_ELEMENT_DEFINITION__IN_, Integer.toString(list.indexOf(ed)), name)); sliceInfo.seeElement(ed); String[] pl = ed.getPath().split("\\."); for (int i = paths.size(); i < pl.length; i++) // -1 because the last path is in focus @@ -4922,7 +4911,7 @@ public class ProfileUtilities extends TranslatingUtilities { ed.setId(bs); if (idList.containsKey(bs)) { if (exception || messages == null) { - throw new DefinitionException(formatMessage(i18nMessages, I18nConstants.SAME_ID_ON_MULTIPLE_ELEMENTS__IN_, bs, idList.get(bs), ed.getPath(), name)); + throw new DefinitionException(context.formatMessage(I18nConstants.SAME_ID_ON_MULTIPLE_ELEMENTS__IN_, bs, idList.get(bs), ed.getPath(), name)); } else messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.BUSINESSRULE, name+"."+bs, "Duplicate Element id "+bs, ValidationMessage.IssueSeverity.ERROR)); } @@ -5116,7 +5105,7 @@ public class ProfileUtilities extends TranslatingUtilities { if (sd.hasBaseDefinition()) { StructureDefinition base = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition()); if (base == null) - throw new FHIRException(formatMessage(i18nMessages, I18nConstants.UNABLE_TO_FIND_BASE_DEFINITION_FOR_LOGICAL_MODEL__FROM_, sd.getBaseDefinition(), sd.getUrl())); + throw new FHIRException(context.formatMessage(I18nConstants.UNABLE_TO_FIND_BASE_DEFINITION_FOR_LOGICAL_MODEL__FROM_, sd.getBaseDefinition(), sd.getUrl())); copyElements(sd, base.getSnapshot().getElement()); } copyElements(sd, sd.getDifferential().getElement()); 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 867f39771..1c7555d06 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 @@ -22,17 +22,18 @@ package org.hl7.fhir.r5.context; import java.io.FileNotFoundException; import java.io.IOException; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; -import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.ResourceBundle; import java.util.Set; import org.apache.commons.lang3.StringUtils; @@ -41,7 +42,6 @@ import org.hl7.fhir.exceptions.DefinitionException; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.exceptions.TerminologyServiceException; import org.hl7.fhir.r5.conformance.ProfileUtilities; -import org.hl7.fhir.r5.context.BaseWorkerContext.MetadataResourceVersionComparator; import org.hl7.fhir.r5.context.IWorkerContext.ILoggingService.LogCategory; import org.hl7.fhir.r5.context.TerminologyCache.CacheToken; import org.hl7.fhir.r5.model.BooleanType; @@ -95,6 +95,7 @@ import com.google.gson.JsonObject; public abstract class BaseWorkerContext implements IWorkerContext { + private ResourceBundle i18Nmessages; private Locale locale; public class MetadataResourceVersionComparator implements Comparator { @@ -166,19 +167,23 @@ public abstract class BaseWorkerContext implements IWorkerContext { private boolean tlogging = true; public BaseWorkerContext() throws FileNotFoundException, IOException, FHIRException { - super(); txCache = new TerminologyCache(lock, null); + setValidationMessageLanguage(getLocale()); } - public BaseWorkerContext(CanonicalResourceManager codeSystems, CanonicalResourceManager valueSets, CanonicalResourceManager maps, CanonicalResourceManager profiles, + public BaseWorkerContext(Locale locale) throws FileNotFoundException, IOException, FHIRException { + txCache = new TerminologyCache(lock, null); + setValidationMessageLanguage(locale); + } + + public BaseWorkerContext(CanonicalResourceManager codeSystems, CanonicalResourceManager valueSets, CanonicalResourceManager maps, CanonicalResourceManager profiles, CanonicalResourceManager guides) throws FileNotFoundException, IOException, FHIRException { - super(); + this(); this.codeSystems = codeSystems; this.valueSets = valueSets; this.maps = maps; this.structures = profiles; this.guides = guides; - txCache = new TerminologyCache(lock, null); } protected void copy(BaseWorkerContext other) { @@ -1288,5 +1293,20 @@ public abstract class BaseWorkerContext implements IWorkerContext { return binaries; } + @Override + public String formatMessage(String theMessage, Object... theMessageArguments) { + String message; + if (theMessageArguments != null && theMessageArguments.length > 0) { + message = MessageFormat.format(i18Nmessages.getString(theMessage), theMessageArguments); + } else if (i18Nmessages.containsKey(theMessage)) { + message = i18Nmessages.getString(theMessage); + } else { + message = theMessage; + } + return message; + } + public void setValidationMessageLanguage(Locale locale) { + i18Nmessages = ResourceBundle.getBundle("Messages", locale ); + } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java index 0b500b26e..28987f401 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/IWorkerContext.java @@ -326,13 +326,15 @@ public interface IWorkerContext { * @return * @throws FHIRException */ - public ValueSetExpansionOutcome expandVS(ConceptSetComponent inc, boolean hierarchical) throws TerminologyServiceException; + ValueSetExpansionOutcome expandVS(ConceptSetComponent inc, boolean hierarchical) throws TerminologyServiceException; - Locale getLocale(); + Locale getLocale(); - void setLocale(Locale locale); + void setLocale(Locale locale); - public class ValidationResult { + String formatMessage(String theMessage, Object... theMessageArguments); + + class ValidationResult { private ConceptDefinitionComponent definition; private IssueSeverity severity; private String message; diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/I18nConstants.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/I18nConstants.java index af11c451b..5c76e3d61 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/I18nConstants.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/I18nConstants.java @@ -5,18 +5,6 @@ import java.util.ResourceBundle; public class I18nConstants { - public static String formatMessage(ResourceBundle resourceBundle, String theMessage, Object... theMessageArguments) { - String message; - if (theMessageArguments != null && theMessageArguments.length > 0) { - message = MessageFormat.format(resourceBundle.getString(theMessage), theMessageArguments); - } else if (resourceBundle.containsKey(theMessage)) { - message = resourceBundle.getString(theMessage); - } else { - message = theMessage; - } - return message; - } - public final static String BUNDLE_BUNDLE_ENTRY_CANONICAL = "Bundle_BUNDLE_Entry_Canonical"; public final static String BUNDLE_BUNDLE_ENTRY_DOCUMENT = "Bundle_BUNDLE_Entry_Document"; public final static String BUNDLE_BUNDLE_ENTRY_IDURLMISMATCH = "Bundle_BUNDLE_Entry_IdUrlMismatch"; diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java index e17e5d005..e1f616090 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/BaseValidator.java @@ -64,17 +64,16 @@ public class BaseValidator { protected Source source; protected IWorkerContext context; - private ResourceBundle i18Nmessages; + public BaseValidator(IWorkerContext context){ this.context = context; - i18Nmessages = ResourceBundle.getBundle("Messages", context.getLocale() ); } - public void setContext(IWorkerContext context) { - this.context = context; - i18Nmessages = ResourceBundle.getBundle("Messages", context.getLocale() ); - } +// public void setContext(IWorkerContext context) { +// this.context = context; +// i18Nmessages = ResourceBundle.getBundle("Messages", context.getLocale() ); +// } /** * Test a rule and add a {@link IssueSeverity#FATAL} validation message if the validation fails @@ -93,7 +92,7 @@ public class BaseValidator { protected boolean fail(List errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { - String msg = formatMessage(theMessage, theMessageArguments); + String msg = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, line, col, path, msg, IssueSeverity.FATAL); } return thePass; @@ -124,7 +123,7 @@ public class BaseValidator { protected boolean fail(List errors, IssueType type, List pathParts, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { String path = toPath(pathParts); - addValidationMessage(errors, type, -1, -1, path, formatMessage(theMessage, theMessageArguments), IssueSeverity.FATAL); + addValidationMessage(errors, type, -1, -1, path, context.formatMessage(theMessage, theMessageArguments), IssueSeverity.FATAL); } return thePass; } @@ -143,21 +142,6 @@ public class BaseValidator { return thePass; } - - protected String formatMessage(String theMessage, Object... theMessageArguments) { - String message = ""; - if (i18Nmessages.containsKey(theMessage)) { - if (theMessageArguments != null && theMessageArguments.length > 0) { - message = MessageFormat.format(i18Nmessages.getString(theMessage), theMessageArguments); - } else if (i18Nmessages.containsKey(theMessage)) { - message = i18Nmessages.getString(theMessage); - } - } else { - message = theMessage; - } - return message; - } - protected boolean grammarWord(String w) { return w.equals("and") || w.equals("or") || w.equals("a") || w.equals("the") || w.equals("for") || w.equals("this") || w.equals("that") || w.equals("of"); } @@ -171,7 +155,7 @@ public class BaseValidator { */ protected boolean hint(List errors, IssueType type, int line, int col, String path, boolean thePass, String msg) { if (!thePass) { - String message = formatMessage(msg); + String message = context.formatMessage(msg); addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION); } return thePass; @@ -201,7 +185,7 @@ public class BaseValidator { */ protected boolean hint(List errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION); } return thePass; @@ -209,7 +193,7 @@ public class BaseValidator { protected boolean txHint(List errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, line, col, path, message, IssueSeverity.INFORMATION, Source.TerminologyEngine).setTxLink(txLink); } return thePass; @@ -225,7 +209,7 @@ public class BaseValidator { protected boolean hint(List errors, IssueType type, List pathParts, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { String path = toPath(pathParts); - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.INFORMATION); } return thePass; @@ -254,7 +238,7 @@ public class BaseValidator { */ protected boolean rule(List errors, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, line, col, path, message, IssueSeverity.ERROR); } return thePass; @@ -262,7 +246,7 @@ public class BaseValidator { protected boolean txRule(List errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); errors.add(new ValidationMessage(Source.TerminologyEngine, type, line, col, path, message, IssueSeverity.ERROR).setTxLink(txLink)); } return thePass; @@ -293,7 +277,7 @@ public class BaseValidator { protected boolean rule(List errors, IssueType type, List pathParts, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { String path = toPath(pathParts); - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.ERROR); } return thePass; @@ -317,7 +301,7 @@ public class BaseValidator { protected boolean rule(List errors, IssueType type, String path, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.ERROR); } return thePass; @@ -381,7 +365,7 @@ public class BaseValidator { */ protected boolean warning(List errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) { if (!thePass) { - msg = formatMessage(msg, theMessageArguments); + msg = context.formatMessage(msg, theMessageArguments); IssueSeverity severity = IssueSeverity.WARNING; addValidationMessage(errors, type, line, col, path, msg, severity); } @@ -409,7 +393,7 @@ public class BaseValidator { */ protected boolean txWarning(List errors, String txLink, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) { if (!thePass) { - msg = formatMessage(msg, theMessageArguments); + msg = context.formatMessage(msg, theMessageArguments); errors.add(new ValidationMessage(Source.TerminologyEngine, type, line, col, path, msg, IssueSeverity.WARNING).setTxLink(txLink)); } return thePass; @@ -418,7 +402,7 @@ public class BaseValidator { protected boolean warningOrError(boolean isError, List errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) { if (!thePass) { - msg = formatMessage(msg, theMessageArguments); + msg = context.formatMessage(msg, theMessageArguments); addValidationMessage(errors, type, line, col, path, msg, isError ? IssueSeverity.ERROR : IssueSeverity.WARNING); } return thePass; @@ -435,7 +419,7 @@ public class BaseValidator { protected boolean warning(List errors, IssueType type, List pathParts, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { String path = toPath(pathParts); - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.WARNING); } return thePass; @@ -478,7 +462,7 @@ public class BaseValidator { */ protected boolean warning(List errors, IssueType type, String path, boolean thePass, String msg, String html, Object... theMessageArguments) { if (!thePass) { - msg = formatMessage(msg, theMessageArguments); + msg = context.formatMessage(msg, theMessageArguments); addValidationMessage(errors, type, path, msg, html, IssueSeverity.WARNING); } return thePass; @@ -494,7 +478,7 @@ public class BaseValidator { */ protected boolean suppressedwarning(List errors, IssueType type, int line, int col, String path, boolean thePass, String msg, Object... theMessageArguments) { if (!thePass) { - msg = formatMessage(msg, theMessageArguments); + msg = context.formatMessage(msg, theMessageArguments); addValidationMessage(errors, type, line, col, path, msg, IssueSeverity.INFORMATION); } return thePass; @@ -511,7 +495,7 @@ public class BaseValidator { protected boolean suppressedwarning(List errors, IssueType type, List pathParts, boolean thePass, String theMessage, Object... theMessageArguments) { if (!thePass) { String path = toPath(pathParts); - String message = formatMessage(theMessage, theMessageArguments); + String message = context.formatMessage(theMessage, theMessageArguments); addValidationMessage(errors, type, -1, -1, path, message, IssueSeverity.INFORMATION); } return thePass; @@ -559,13 +543,9 @@ public class BaseValidator { */ protected boolean suppressedwarning(List errors, IssueType type, String path, boolean thePass, String msg, String html, Object... theMessageArguments) { if (!thePass) { - msg = formatMessage(msg, theMessageArguments); + msg = context.formatMessage(msg, theMessageArguments); addValidationMessage(errors, type, path, msg, html, IssueSeverity.INFORMATION); } return thePass; } - - public ResourceBundle getI18Nmessages() { - return i18Nmessages; - } } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java index b43cace30..87c1bcd3c 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidator.java @@ -3191,8 +3191,9 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat Identifier ii = (Identifier) pattern; expression.append(" and "); buildIdentifierExpression(ed, expression, discriminator, ii); - } else + } else { throw new DefinitionException(formatMessage(I18nConstants.UNSUPPORTED_FIXED_PATTERN_TYPE_FOR_DISCRIMINATOR_FOR_SLICE__, discriminator, ed.getId(), pattern.getClass().getName())); + } } private void buildIdentifierExpression(ElementDefinition ed, StringBuilder expression, String discriminator, Identifier ii)