Add support for validator session for internal cache management

This commit is contained in:
Grahame Grieve 2024-11-16 21:18:07 +11:00
parent ce06b3f9c5
commit 05cc3b47da
22 changed files with 121 additions and 67 deletions

View File

@ -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()));
}

View File

@ -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<String, Object> objects = new HashMap<>();
protected String sessionId;
public ValidatorSession() {
super();
sessionId = Utilities.makeUuidLC();
}
public String getSessionId() {
return sessionId;
}
public Map<String, Object> getObjects() {
return objects;
}
public void close() {
objects.clear();
}
}

View File

@ -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<String> 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<UsageContext> usageContexts = new ArrayList<UsageContext>(); // @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);
}
}

View File

@ -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);

View File

@ -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<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public BCP47Checker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
}

View File

@ -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<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public CPTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
}
@Override

View File

@ -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<ValidationMessage> errors, CodeSystem cs) {
super(context, xverManager, debug, errors);
public CodeSystemBasedChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, CodeSystem cs, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
this.cs = cs;
}

View File

@ -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<ValidationMessage> errors;
protected CodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
super(context, xverManager, debug);
protected CodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, session);
this.errors = errors;
}

View File

@ -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;
}

View File

@ -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<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public GeneralCodeSystemChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
// TODO Auto-generated constructor stub
}

View File

@ -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<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public LoincChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
}

View File

@ -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<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public RxNormChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
}

View File

@ -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<String> tags = new ArrayList<>();
public SnomedCTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public SnomedCTChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
}
public void checkConcept(String code, String display) {

View File

@ -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<ValidationMessage> errors) {
super(context, xverManager, debug, errors);
public UcumChecker(IWorkerContext context, XVerExtensionManager xverManager, boolean debug, List<ValidationMessage> errors, ValidatorSession session) {
super(context, xverManager, debug, errors, session);
}

View File

@ -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();

View File

@ -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);
}
}

View File

@ -75,7 +75,6 @@ public class BundleValidator extends BaseValidator {
public boolean validateBundle(List<ValidationMessage> 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);

View File

@ -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<ValidationMessage> errors, Element ig, NodeStack stack) {

View File

@ -132,21 +132,21 @@ public class ValueSetValidator extends BaseValidator {
private CodeSystemChecker getSystemValidator(String system, List<ValidationMessage> 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);
}
}
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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()));