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..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
@@ -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,14 @@ 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..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
@@ -55,6 +55,7 @@ class ValidatorWrapper {
private Collection extends String> myExtensionDomains;
private IValidatorResourceFetcher myValidatorResourceFetcher;
private IValidationPolicyAdvisor myValidationPolicyAdvisor;
+ private FHIRPathEngine.IEvaluationContext evaluationContext;
private boolean myAllowExamples;
/**
@@ -123,17 +124,14 @@ 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 +233,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()