From 05cc3b47dad10c748561a1a73efb4a22e4324158 Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Sat, 16 Nov 2024 21:18:07 +1100 Subject: [PATCH] Add support for validator session for internal cache management --- .../fhir/r5/context/SimpleWorkerContext.java | 7 ++-- .../r5/utils/validation/ValidatorSession.java | 35 ++++++++++++++++ .../hl7/fhir/validation/BaseValidator.java | 40 ++++++++++--------- .../hl7/fhir/validation/ValidationEngine.java | 3 +- .../validation/codesystem/BCP47Checker.java | 5 ++- .../validation/codesystem/CPTChecker.java | 5 ++- .../codesystem/CodeSystemBasedChecker.java | 5 ++- .../codesystem/CodeSystemChecker.java | 5 ++- .../codesystem/CodingsObserver.java | 5 ++- .../codesystem/GeneralCodeSystemChecker.java | 5 ++- .../validation/codesystem/LoincChecker.java | 5 ++- .../validation/codesystem/RxNormChecker.java | 5 ++- .../codesystem/SnomedCTChecker.java | 5 ++- .../validation/codesystem/UcumChecker.java | 5 ++- .../instance/InstanceValidator.java | 11 ++--- .../instance/InstanceValidatorFactory.java | 9 +++-- .../instance/type/BundleValidator.java | 1 - .../type/ImplementationGuideValidator.java | 5 ++- .../instance/type/ValueSetValidator.java | 18 ++++----- .../validation/profile/ProfileValidator.java | 5 ++- .../validation/special/R4R5MapTester.java | 2 +- .../instance/InstanceValidatorTests.java | 2 +- 22 files changed, 121 insertions(+), 67 deletions(-) create mode 100644 org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/validation/ValidatorSession.java diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java index cee46ecd8..22d89b4e5 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/SimpleWorkerContext.java @@ -71,6 +71,7 @@ import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager; import org.hl7.fhir.r5.terminologies.client.TerminologyClientManager.ITerminologyClientFactory; import org.hl7.fhir.r5.terminologies.client.TerminologyClientR5; import org.hl7.fhir.r5.utils.validation.IResourceValidator; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.r5.utils.R5Hacker; import org.hl7.fhir.r5.utils.UserDataNames; import org.hl7.fhir.r5.utils.XVerExtensionManager; @@ -140,8 +141,8 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon } public interface IValidatorFactory { - IResourceValidator makeValidator(IWorkerContext ctxt) throws FHIRException; - IResourceValidator makeValidator(IWorkerContext ctxts, XVerExtensionManager xverManager) throws FHIRException; + IResourceValidator makeValidator(IWorkerContext ctxt, ValidatorSession session) throws FHIRException; + IResourceValidator makeValidator(IWorkerContext ctxts, XVerExtensionManager xverManager, ValidatorSession session) throws FHIRException; } private Questionnaire questionnaire; @@ -611,7 +612,7 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon public IResourceValidator newValidator() throws FHIRException { if (validatorFactory == null) throw new Error(formatMessage(I18nConstants.NO_VALIDATOR_CONFIGURED)); - return validatorFactory.makeValidator(this, xverManager).setJurisdiction(JurisdictionUtilities.getJurisdictionCodingFromLocale(Locale.getDefault().getCountry())); + return validatorFactory.makeValidator(this, xverManager, null).setJurisdiction(JurisdictionUtilities.getJurisdictionCodingFromLocale(Locale.getDefault().getCountry())); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/validation/ValidatorSession.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/validation/ValidatorSession.java new file mode 100644 index 000000000..6400d8553 --- /dev/null +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/validation/ValidatorSession.java @@ -0,0 +1,35 @@ +package org.hl7.fhir.r5.utils.validation; + +import java.util.HashMap; +import java.util.Map; + +import org.hl7.fhir.utilities.Utilities; + +/** + * Used by the validation infrastructure to cache internal infrastructure that + * will be cast away when the session is closed by the application + */ +public class ValidatorSession { + + public static final String VIEW_DEFINITION_CONTEXT = "VIEW_DEFINITION_CONTEXT"; + + private Map objects = new HashMap<>(); + protected String sessionId; + + public ValidatorSession() { + super(); + sessionId = Utilities.makeUuidLC(); + } + + public String getSessionId() { + return sessionId; + } + + public Map getObjects() { + return objects; + } + + public void close() { + objects.clear(); + } +} 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 fb0bcf3f7..a1bad4902 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 @@ -72,6 +72,7 @@ import org.hl7.fhir.r5.utils.validation.IMessagingServices; import org.hl7.fhir.r5.utils.validation.IResourceValidator; import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor; import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.IValidationContextResourceLoader; import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel; import org.hl7.fhir.r5.utils.validation.constants.ReferenceValidationPolicy; @@ -169,7 +170,6 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi protected final String BUNDLE = "Bundle"; protected final String LAST_UPDATED = "lastUpdated"; - protected String sessionId; protected BaseValidator parent; protected IWorkerContext context; protected ValidationTimeTracker timeTracker = new ValidationTimeTracker(); @@ -184,6 +184,7 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi // don't repeatedly raise the same warnings all the time protected Set statusWarnings = new HashSet<>(); + protected ValidatorSession session; protected Source source; // @configuration protected ValidationLevel level = ValidationLevel.HINTS; // @configuration protected Coding jurisdiction; // @configuration @@ -195,15 +196,18 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi protected List usageContexts = new ArrayList(); // @configuration protected ValidationOptions baseOptions = new ValidationOptions(FhirPublication.R5); // @configuration - public BaseValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug) { + public BaseValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, ValidatorSession session) { super(); this.context = context; + this.session = session; + if (this.session == null) { + this.session = new ValidatorSession(); + } this.xverManager = xverManager; if (this.xverManager == null) { this.xverManager = new XVerExtensionManager(context); } this.debug = debug; - sessionId = Utilities.makeUuidLC(); policyAdvisor = new BasePolicyAdvisorForFullValidation(ReferenceValidationPolicy.CHECK_VALID); urlRegex = Constants.URI_REGEX_XVER.replace("$$", CommaSeparatedStringBuilder.join("|", context.getResourceNames())); } @@ -211,6 +215,7 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi public BaseValidator(BaseValidator parent) { super(); this.parent = parent; + this.session = parent.session; this.context = parent.context; this.xverManager = parent.xverManager; this.debug = parent.debug; @@ -229,7 +234,6 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi this.usageContexts.addAll(parent.usageContexts); this.baseOptions = parent.baseOptions; this.fetcher = parent.fetcher; - this.sessionId = parent.sessionId; this.policyAdvisor = parent.policyAdvisor; } @@ -1076,8 +1080,8 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi String tt = extractResourceType(ref); ok = VersionUtilities.getCanonicalResourceNames(context.getVersion()).contains(tt); } - if (!ok && stack != null && !sessionId.equals(source.getUserString(UserDataNames.validation_bundle_error))) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + if (!ok && stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) { + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); hintOrError(!isWarning, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND, ref, name); } return null; @@ -1085,17 +1089,17 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi if (fragment != null) { int i = countFragmentMatches(el.get(0), fragment); if (i == 0) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); hintOrError(isNLLink, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_FRAGMENT, ref, fragment, name); } else if (i > 1) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE_FRAGMENT, i, ref, fragment, name); } } return el.get(0); } else { - if (stack != null && !sessionId.equals(source.getUserString(UserDataNames.validation_bundle_error))) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) { + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE, el.size(), ref, name); } return null; @@ -1111,8 +1115,8 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi if (el.size() == 1) { return el.get(0); } else { - if (stack != null && !sessionId.equals(source.getUserString(UserDataNames.validation_bundle_error))) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) { + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); rule(errors, "2023-11-15", IssueType.INVALID, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_FOUND_MULTIPLE, el.size(), ref, name); } return null; @@ -1133,17 +1137,17 @@ public class BaseValidator implements IValidationContextResourceLoader, IMessagi if (!VersionUtilities.isR4Plus(context.getVersion())) { if (el.size() == 1) { return el.get(0); - } else if (stack != null && !sessionId.equals(source.getUserString(UserDataNames.validation_bundle_error))) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + } else if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) { + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); rulePlural(errors, "2023-11-15", IssueType.INVALID, stack, false, el.size(), I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT, ref, name, CommaSeparatedStringBuilder.join(",", Utilities.sorted(tl))); } - } else if (stack != null && !sessionId.equals(source.getUserString(UserDataNames.validation_bundle_error))) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + } else if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) { + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); rulePlural(errors, "2023-11-15", IssueType.INVALID, stack, false, el.size(), I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND_APPARENT, ref, name, CommaSeparatedStringBuilder.join(",", Utilities.sorted(tl))); } } else { - if (stack != null && !sessionId.equals(source.getUserString(UserDataNames.validation_bundle_error))) { - source.setUserData(UserDataNames.validation_bundle_error, sessionId); + if (stack != null && !session.getSessionId().equals(source.getUserString(UserDataNames.validation_bundle_error))) { + source.setUserData(UserDataNames.validation_bundle_error, session.getSessionId()); hintOrError(!isWarning, errors, NO_RULE_DATE, IssueType.NOTFOUND, stack, false, I18nConstants.BUNDLE_BUNDLE_ENTRY_NOTFOUND, ref, name); } } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java index bc642efb3..11e8022bc 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java @@ -71,6 +71,7 @@ import org.hl7.fhir.r5.utils.validation.IMessagingServices; import org.hl7.fhir.r5.utils.validation.IResourceValidator; import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor; import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel; import org.hl7.fhir.r5.utils.validation.constants.BindingKind; import org.hl7.fhir.r5.utils.validation.constants.CheckDisplayOption; @@ -865,7 +866,7 @@ public class ValidationEngine implements IValidatorResourceFetcher, IValidationP } public InstanceValidator getValidator(FhirFormat format) throws FHIRException, IOException { - InstanceValidator validator = new InstanceValidator(context, null, null); + InstanceValidator validator = new InstanceValidator(context, null, null, new ValidatorSession()); context.getTxClientManager().setUsage("validation"); validator.setHintAboutNonMustSupport(hintAboutNonMustSupport); validator.setAnyExtensionsAllowed(anyExtensionsAllowed); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/BCP47Checker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/BCP47Checker.java index 9049f4544..2359351f9 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/BCP47Checker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/BCP47Checker.java @@ -5,14 +5,15 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyOperation; import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidationRules; public class BCP47Checker extends CodeSystemChecker { - public BCP47Checker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public BCP47Checker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CPTChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CPTChecker.java index 07a0d9235..f3974f930 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CPTChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CPTChecker.java @@ -7,6 +7,7 @@ import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent; import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule; import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType; @@ -15,8 +16,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio public class CPTChecker extends CodeSystemChecker { - public CPTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public CPTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); } @Override diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemBasedChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemBasedChecker.java index a55bf7048..480760d5a 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemBasedChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemBasedChecker.java @@ -10,6 +10,7 @@ import org.hl7.fhir.r5.model.CodeSystem.CodeSystemFilterComponent; import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent; import org.hl7.fhir.r5.model.Enumerations.FilterOperator; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule; @@ -21,8 +22,8 @@ public class CodeSystemBasedChecker extends CodeSystemChecker { private CodeSystem cs; - public CodeSystemBasedChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, CodeSystem cs) { - super(context, xverManager, debug, errors); + public CodeSystemBasedChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, CodeSystem cs, ValidatorSession session) { + super(context, xverManager, debug, errors, session); this.cs = cs; } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemChecker.java index 9508896c3..3567516fb 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodeSystemChecker.java @@ -6,6 +6,7 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.i18n.I18nConstants; import org.hl7.fhir.utilities.validation.ValidationMessage; @@ -23,8 +24,8 @@ public abstract class CodeSystemChecker extends BaseValidator { private boolean hasDisplay = false; protected List errors; - protected CodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug); + protected CodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, session); this.errors = errors; } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java index 0e1555dd4..4fdb05f41 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/CodingsObserver.java @@ -14,6 +14,7 @@ import org.hl7.fhir.r5.model.CodeableConcept; import org.hl7.fhir.r5.model.Coding; import org.hl7.fhir.r5.terminologies.utilities.CodingValidationRequest; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.i18n.I18nConstants; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; @@ -33,8 +34,8 @@ public class CodingsObserver extends BaseValidator { } } - public CodingsObserver(@Nonnull IWorkerContext context, @Nonnull XVerExtensionManager xverManager, boolean debug) { - super(context, xverManager, debug); + public CodingsObserver(@Nonnull IWorkerContext context, @Nonnull XVerExtensionManager xverManager, boolean debug, ValidatorSession session) { + super(context, xverManager, debug, session); this.context = context; } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/GeneralCodeSystemChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/GeneralCodeSystemChecker.java index a314eea22..f0c5a26d8 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/GeneralCodeSystemChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/GeneralCodeSystemChecker.java @@ -4,12 +4,13 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.validation.ValidationMessage; public class GeneralCodeSystemChecker extends CodeSystemChecker { - public GeneralCodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public GeneralCodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); // TODO Auto-generated constructor stub } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/LoincChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/LoincChecker.java index 0618af6b2..c5ffd4415 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/LoincChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/LoincChecker.java @@ -5,6 +5,7 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule; @@ -14,8 +15,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio public class LoincChecker extends CodeSystemChecker { - public LoincChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public LoincChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/RxNormChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/RxNormChecker.java index 9de081831..a11ea027f 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/RxNormChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/RxNormChecker.java @@ -5,6 +5,7 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule; import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType; @@ -13,8 +14,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio public class RxNormChecker extends CodeSystemChecker { - public RxNormChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public RxNormChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/SnomedCTChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/SnomedCTChecker.java index 048f906d5..1424c0005 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/SnomedCTChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/SnomedCTChecker.java @@ -7,6 +7,7 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.i18n.I18nConstants; import org.hl7.fhir.utilities.validation.ValidationMessage; @@ -23,8 +24,8 @@ public class SnomedCTChecker extends CodeSystemChecker { private boolean hasTag = false; private List tags = new ArrayList<>(); - public SnomedCTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public SnomedCTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); } public void checkConcept(String code, String display) { diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/UcumChecker.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/UcumChecker.java index e18cf56f7..0a35345b3 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/UcumChecker.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/codesystem/UcumChecker.java @@ -5,6 +5,7 @@ import java.util.List; import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.validation.instance.type.ValueSetValidator.CodeValidationRule; import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyFilterType; @@ -13,8 +14,8 @@ import org.hl7.fhir.validation.instance.type.ValueSetValidator.PropertyValidatio public class UcumChecker extends CodeSystemChecker { - public UcumChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors) { - super(context, xverManager, debug, errors); + public UcumChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List errors, ValidatorSession session) { + super(context, xverManager, debug, errors, session); } 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 805ae5226..3880b7322 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 @@ -172,6 +172,7 @@ import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor.CodedContentVal import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor.ElementValidationAction; import org.hl7.fhir.r5.utils.validation.IValidationProfileUsageTracker; import org.hl7.fhir.r5.utils.validation.IValidatorResourceFetcher; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel; import org.hl7.fhir.r5.utils.validation.constants.BindingKind; import org.hl7.fhir.r5.utils.validation.constants.CheckDisplayOption; @@ -618,8 +619,8 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat private boolean unknownCodeSystemsCauseErrors; private boolean noExperimentalContent; - public InstanceValidator(@Nonnull IWorkerContext theContext, @Nonnull IEvaluationContext hostServices, @Nonnull XVerExtensionManager xverManager) { - super(theContext, xverManager, false); + public InstanceValidator(@Nonnull IWorkerContext theContext, @Nonnull IEvaluationContext hostServices, @Nonnull XVerExtensionManager xverManager, ValidatorSession session) { + super(theContext, xverManager, false, session); start = System.currentTimeMillis(); this.externalHostServices = hostServices; this.profileUtilities = new ProfileUtilities(theContext, null, null); @@ -632,7 +633,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat source = Source.InstanceValidator; fpe.setDoNotEnforceAsSingletonRule(!VersionUtilities.isR5VerOrLater(theContext.getVersion())); fpe.setAllowDoubleQuotes(allowDoubleQuotesInFHIRPath); - codingObserver = new CodingsObserver(theContext, xverManager, debug); + codingObserver = new CodingsObserver(theContext, xverManager, debug, session); } @Override @@ -5946,9 +5947,9 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat } else if (element.getType().equals("ValueSet")) { return new ValueSetValidator(this).validateValueSet(valContext, errors, element, stack) && ok; } else if (element.getType().equals("ViewDefinition")) { - return new ViewDefinitionValidator(this, fpe).validateViewDefinition(valContext, errors, element, stack) && ok; + return new ViewDefinitionValidator(this).validateViewDefinition(valContext, errors, element, stack) && ok; } else if (element.getType().equals("ImplementationGuide")) { - return new ImplementationGuideValidator(this.context, xverManager, debug).validateImplementationGuide(valContext, errors, element, stack) && ok; + return new ImplementationGuideValidator(this.context, xverManager, debug, session).validateImplementationGuide(valContext, errors, element, stack) && ok; } else if ("http://hl7.org/fhir/uv/sql-on-fhir/StructureDefinition/ViewDefinition".equals(element.getProperty().getStructure().getUrl())) { if (element.getNativeObject() != null && element.getNativeObject() instanceof JsonObject) { JsonObject json = (JsonObject) element.getNativeObject(); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidatorFactory.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidatorFactory.java index 67bc55ba2..2533ee911 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidatorFactory.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/InstanceValidatorFactory.java @@ -37,17 +37,18 @@ import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.SimpleWorkerContext.IValidatorFactory; import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.r5.utils.validation.IResourceValidator; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; public class InstanceValidatorFactory implements IValidatorFactory { @Override - public IResourceValidator makeValidator(IWorkerContext ctxt, XVerExtensionManager xverManager) throws FHIRException { - return new InstanceValidator(ctxt, null, xverManager); + public IResourceValidator makeValidator(IWorkerContext ctxt, XVerExtensionManager xverManager, ValidatorSession session) throws FHIRException { + return new InstanceValidator(ctxt, null, xverManager, session); } @Override - public IResourceValidator makeValidator(IWorkerContext ctxt) throws FHIRException { - return new InstanceValidator(ctxt, null, null); + public IResourceValidator makeValidator(IWorkerContext ctxt, ValidatorSession session) throws FHIRException { + return new InstanceValidator(ctxt, null, null, session); } } \ No newline at end of file diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/BundleValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/BundleValidator.java index a4ec1a17d..4f4cc0bc7 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/BundleValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/BundleValidator.java @@ -75,7 +75,6 @@ public class BundleValidator extends BaseValidator { public boolean validateBundle(List errors, Element bundle, NodeStack stack, boolean checkSpecials, ValidationContext hostContext, PercentageTracker pct, ValidationMode mode) { boolean ok = true; - sessionId = Utilities.makeUuidLC(); String type = bundle.getNamedChildValue(TYPE, false); type = StringUtils.defaultString(type); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ImplementationGuideValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ImplementationGuideValidator.java index c7a7081a8..39f41308f 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ImplementationGuideValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/instance/type/ImplementationGuideValidator.java @@ -29,6 +29,7 @@ import org.hl7.fhir.r5.terminologies.utilities.TerminologyServiceErrorClass; import org.hl7.fhir.r5.terminologies.utilities.ValidationResult; import org.hl7.fhir.r5.utils.XVerExtensionManager; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier.ValidationContextResourceProxy; import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; import org.hl7.fhir.utilities.FhirPublication; @@ -53,8 +54,8 @@ import ca.uhn.fhir.util.ObjectUtil; public class ImplementationGuideValidator extends BaseValidator { - public ImplementationGuideValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug) { - super(context, xverManager, debug); + public ImplementationGuideValidator(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, ValidatorSession session) { + super(context, xverManager, debug, session); } public boolean validateImplementationGuide(ValidationContext valContext, List errors, Element ig, NodeStack stack) { 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 47bc5b25d..f75d72247 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 @@ -132,21 +132,21 @@ public class ValueSetValidator extends BaseValidator { private CodeSystemChecker getSystemValidator(String system, List errors) { if (system == null) { - return new GeneralCodeSystemChecker(context, xverManager, debug, errors); + return new GeneralCodeSystemChecker(context, xverManager, debug, errors, session); } switch (system) { - case "http://snomed.info/sct" :return new SnomedCTChecker(context, xverManager, debug, errors); - case "http://loinc.org": return new LoincChecker(context, xverManager, debug, errors); - case "http://www.nlm.nih.gov/research/umls/rxnorm": return new RxNormChecker(context, xverManager, debug, errors); - case "http://unitsofmeasure.org": return new UcumChecker(context, xverManager, debug, errors); - case "http://www.ama-assn.org/go/cpt": return new CPTChecker(context, xverManager, debug, errors); - case "urn:ietf:bcp:47": return new BCP47Checker(context, xverManager, debug, errors); + case "http://snomed.info/sct" :return new SnomedCTChecker(context, xverManager, debug, errors, session); + case "http://loinc.org": return new LoincChecker(context, xverManager, debug, errors, session); + case "http://www.nlm.nih.gov/research/umls/rxnorm": return new RxNormChecker(context, xverManager, debug, errors, session); + case "http://unitsofmeasure.org": return new UcumChecker(context, xverManager, debug, errors, session); + case "http://www.ama-assn.org/go/cpt": return new CPTChecker(context, xverManager, debug, errors, session); + case "urn:ietf:bcp:47": return new BCP47Checker(context, xverManager, debug, errors, session); default: CodeSystem cs = context.fetchCodeSystem(system); if (cs != null) { - return new CodeSystemBasedChecker(context, xverManager, debug, errors, cs); + return new CodeSystemBasedChecker(context, xverManager, debug, errors, cs, session); } else { - return new GeneralCodeSystemChecker(context, xverManager, debug, errors); + return new GeneralCodeSystemChecker(context, xverManager, debug, errors, session); } } } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/profile/ProfileValidator.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/profile/ProfileValidator.java index a02dd685d..a1ea3b290 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/profile/ProfileValidator.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/profile/ProfileValidator.java @@ -42,6 +42,7 @@ import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent; import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind; import org.hl7.fhir.r5.utils.XVerExtensionManager; +import org.hl7.fhir.r5.utils.validation.ValidatorSession; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.validation.ValidationMessage; import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType; @@ -54,8 +55,8 @@ public class ProfileValidator extends BaseValidator { private boolean allowDoubleQuotesInFHIRPath = false; private FHIRPathEngine fpe; - public ProfileValidator(IWorkerContext context, XVerExtensionManager xverManager) { - super(context, xverManager, false); + public ProfileValidator(IWorkerContext context, XVerExtensionManager xverManager, ValidatorSession session) { + super(context, xverManager, false, session); fpe = new FHIRPathEngine(context); fpe.setAllowDoubleQuotes(allowDoubleQuotesInFHIRPath); } diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java index 0679966dc..0aca9bbe5 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/special/R4R5MapTester.java @@ -187,7 +187,7 @@ public class R4R5MapTester implements IValidatorResourceFetcher { loadPackage("hl7.fhir.r4.core#4.0.1", false); loadPackage("hl7.fhir.r4b.core#4.3.0", false); - validator = new InstanceValidator(context, null, null); + validator = new InstanceValidator(context, null, null, null); validator.setSuppressLoincSnomedMessages(true); validator.setResourceIdRule(IdStatus.REQUIRED); validator.setBestPracticeWarningLevel(BestPracticeWarningLevel.Warning); diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/instance/InstanceValidatorTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/instance/InstanceValidatorTests.java index dd57e41e5..09234c908 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/instance/InstanceValidatorTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/instance/InstanceValidatorTests.java @@ -37,7 +37,7 @@ class InstanceValidatorTests { IWorkerContext context = mock(IWorkerContext.class); when(context.getLocale()).thenReturn(Locale.KOREA); when(context.getVersion()).thenReturn("5.0.1"); - InstanceValidator instanceValidator = new InstanceValidator(context, null, null); + InstanceValidator instanceValidator = new InstanceValidator(context, null, null, null); when(context.validateCode((ValidationOptions) any(ValidationOptions.class), (CodeableConcept) any(CodeableConcept.class), (ValueSet)any(ValueSet.class))).thenReturn(new ValidationResult(ValidationMessage.IssueSeverity.NULL, "Blah!", Collections.emptyList()));