From 6a3fa72793eaebdf9bc680b13de786565d6ce2ce Mon Sep 17 00:00:00 2001 From: Jens Kristian Villadsen Date: Mon, 18 Aug 2025 22:41:02 +0200 Subject: [PATCH 1/2] Adding more configuration options --- .../fhir/r4/hapi/fluentpath/FhirPathR4.java | 7 +++- .../validator/FhirInstanceValidator.java | 11 ++++++ .../validator/ValidatorWrapper.java | 35 ++++++++++++++----- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/hapi-fhir-structures-r4/src/main/java/org/hl7/fhir/r4/hapi/fluentpath/FhirPathR4.java b/hapi-fhir-structures-r4/src/main/java/org/hl7/fhir/r4/hapi/fluentpath/FhirPathR4.java index fe9732c5ad12..3570c2760a9d 100644 --- a/hapi-fhir-structures-r4/src/main/java/org/hl7/fhir/r4/hapi/fluentpath/FhirPathR4.java +++ b/hapi-fhir-structures-r4/src/main/java/org/hl7/fhir/r4/hapi/fluentpath/FhirPathR4.java @@ -19,8 +19,10 @@ import org.hl7.fhir.r4.model.IdType; import org.hl7.fhir.r4.model.ValueSet; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; public class FhirPathR4 implements IFhirPath { @@ -101,7 +103,10 @@ public List resolveConstant( boolean beforeContext, boolean explicitConstant) throws PathEngineException { - return null; + return Collections.unmodifiableList( + theEvaluationContext.resolveConstant(appContext, name, beforeContext).stream() + .map(Base.class::cast) + .collect(Collectors.toList())); } @Override diff --git a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java index e6cda6e082d0..b8e9902762fc 100644 --- a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java +++ b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java @@ -42,6 +42,7 @@ public class FhirInstanceValidator extends BaseValidatorBridge implements IInsta private IValidatorResourceFetcher validatorResourceFetcher; private IValidationPolicyAdvisor validatorPolicyAdvisor = new FhirDefaultPolicyAdvisor(); private boolean myAllowExamples; + private FHIRPathEngine.IEvaluationContext evaluationContext; /** * Constructor @@ -253,6 +254,7 @@ protected List validate(IValidationContext theValidationCt .setValidatorResourceFetcher(getValidatorResourceFetcher()) .setAssumeValidRestReferences(isAssumeValidRestReferences()) .setAllowExamples(isAllowExamples()) + .setEvaluationContext(getEvaluationContext()) .validate(wrappedWorkerContext, theValidationCtx); } @@ -296,6 +298,15 @@ public void setAssumeValidRestReferences(boolean assumeValidRestReferences) { this.assumeValidRestReferences = assumeValidRestReferences; } + public FHIRPathEngine.IEvaluationContext getEvaluationContext() { + return evaluationContext; + } + + public void setEvaluationContext(FHIRPathEngine.IEvaluationContext evaluationContext) { + this.evaluationContext = evaluationContext; + } + + /** * Clear any cached data held by the validator or any of its internal stores. This is mostly intended * for unit tests, but could be used for production uses too. diff --git a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java index d1d198b4f0d8..749db86bd7ef 100644 --- a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java +++ b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java @@ -55,6 +55,7 @@ class ValidatorWrapper { private Collection myExtensionDomains; private IValidatorResourceFetcher myValidatorResourceFetcher; private IValidationPolicyAdvisor myValidationPolicyAdvisor; + private FHIRPathEngine.IEvaluationContext evaluationContext; private boolean myAllowExamples; /** @@ -123,17 +124,15 @@ public ValidatorWrapper setValidatorResourceFetcher(IValidatorResourceFetcher va return this; } + public ValidatorWrapper setEvaluationContext(FHIRPathEngine.IEvaluationContext evaluationContext) { + this.evaluationContext = evaluationContext; + return this; + } + + public List validate( IWorkerContext theWorkerContext, IValidationContext theValidationContext) { - InstanceValidator v; - FHIRPathEngine.IEvaluationContext evaluationCtx = new FhirInstanceValidator.NullEvaluationContext(); - XVerExtensionManager xverManager = new XVerExtensionManager(theWorkerContext); - try { - v = new InstanceValidator( - theWorkerContext, evaluationCtx, xverManager, new ValidatorSession(), new ValidatorSettings()); - } catch (Exception e) { - throw new ConfigurationException(Msg.code(648) + e.getMessage(), e); - } + InstanceValidator v = getInstanceValidator(theWorkerContext); v.setAssumeValidRestReferences(isAssumeValidRestReferences()); v.setBestPracticeWarningLevel(myBestPracticeWarningLevel); @@ -235,6 +234,24 @@ public List validate( return messages; } + private InstanceValidator getInstanceValidator(IWorkerContext theWorkerContext) { + InstanceValidator v; + FHIRPathEngine.IEvaluationContext evaluationCtx; + if( evaluationContext == null ) {} + evaluationCtx= new FhirInstanceValidator.NullEvaluationContext(); + if (evaluationContext != null) { + evaluationCtx = evaluationContext; + } + XVerExtensionManager xverManager = new XVerExtensionManager(theWorkerContext); + try { + v = new InstanceValidator( + theWorkerContext, evaluationCtx, xverManager, new ValidatorSession(), new ValidatorSettings()); + } catch (Exception e) { + throw new ConfigurationException(Msg.code(648) + e.getMessage(), e); + } + return v; + } + private ReaderInputStream constructNewReaderInputStream(Reader theReader) { try { return ReaderInputStream.builder() From 35bd4d59ef8cec0f1d76129082be486eb6cb518d Mon Sep 17 00:00:00 2001 From: Jens Kristian Villadsen Date: Mon, 18 Aug 2025 22:42:17 +0200 Subject: [PATCH 2/2] Applied spotless --- .../hapi/validation/validator/FhirInstanceValidator.java | 1 - .../common/hapi/validation/validator/ValidatorWrapper.java | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java index b8e9902762fc..95e98725e8d3 100644 --- a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java +++ b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/FhirInstanceValidator.java @@ -306,7 +306,6 @@ public void setEvaluationContext(FHIRPathEngine.IEvaluationContext evaluationCon this.evaluationContext = evaluationContext; } - /** * Clear any cached data held by the validator or any of its internal stores. This is mostly intended * for unit tests, but could be used for production uses too. diff --git a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java index 749db86bd7ef..43fc64abd7e0 100644 --- a/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java +++ b/hapi-fhir-validation/src/main/java/org/hl7/fhir/common/hapi/validation/validator/ValidatorWrapper.java @@ -129,7 +129,6 @@ public ValidatorWrapper setEvaluationContext(FHIRPathEngine.IEvaluationContext e return this; } - public List validate( IWorkerContext theWorkerContext, IValidationContext theValidationContext) { InstanceValidator v = getInstanceValidator(theWorkerContext); @@ -237,15 +236,15 @@ public List validate( private InstanceValidator getInstanceValidator(IWorkerContext theWorkerContext) { InstanceValidator v; FHIRPathEngine.IEvaluationContext evaluationCtx; - if( evaluationContext == null ) {} - evaluationCtx= new FhirInstanceValidator.NullEvaluationContext(); + if (evaluationContext == null) {} + evaluationCtx = new FhirInstanceValidator.NullEvaluationContext(); if (evaluationContext != null) { evaluationCtx = evaluationContext; } XVerExtensionManager xverManager = new XVerExtensionManager(theWorkerContext); try { v = new InstanceValidator( - theWorkerContext, evaluationCtx, xverManager, new ValidatorSession(), new ValidatorSettings()); + theWorkerContext, evaluationCtx, xverManager, new ValidatorSession(), new ValidatorSettings()); } catch (Exception e) { throw new ConfigurationException(Msg.code(648) + e.getMessage(), e); }