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