Open holger-stenzhorn opened 3 years ago
I notice you don't have InMemoryTerminologyServerValidationSupport
in your chain. Does the situation improve if you add it?
Yes, you are absolutely right: For the above test class the addition of InMemoryTerminologyServerValidationSupport
resolves the issue indeed.
Therefore I have "updated" the test class in such a way that the exception occurs. The NPMs used in it can be found at:
package de.beispiel.fhir;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.support.DefaultProfileValidationSupport;
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport;
import org.hl7.fhir.common.hapi.validation.support.PrePopulatedValidationSupport;
import org.hl7.fhir.common.hapi.validation.support.SnapshotGeneratingValidationSupport;
import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain;
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
import org.hl7.fhir.r4.model.ValueSet;
import org.hl7.fhir.utilities.npm.NpmPackage;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
import static org.apache.commons.lang3.function.Failable.asFunction;
import static org.hl7.fhir.r4.model.codesystems.ResourceTypes.STRUCTUREDEFINITION;
import static org.hl7.fhir.r4.model.codesystems.ResourceTypes.VALUESET;
import static org.hl7.fhir.r4.model.codesystems.ResourceTypes.fromCode;
public class Test {
public static void main(String[] args) throws Exception {
var condition = """
{
"resourceType": "Procedure",
"meta": {
"profile": [ "https://www.netzwerk-universitaetsmedizin.de/fhir/StructureDefinition/dialysis" ]
}
}
""";
var profiles = Path.of("/Users/holger/Developer/hapi-test/profiles");
var fhirContext = FhirContext.forR4();
var jsonParser = fhirContext.newJsonParser();
var prePopulatedValidationSupport = new PrePopulatedValidationSupport(fhirContext);
Stream.of(profiles.resolve("de.gecco-1.0.3.tgz"),
profiles.resolve("de.medizininformatikinitiative.kerndatensatz.prozedur-1.0.5.tgz"))
.map(asFunction(Files::newInputStream))
.map(asFunction(NpmPackage::fromPackage))
.flatMap(asFunction(npmPackage ->
npmPackage.listResources(STRUCTUREDEFINITION.toCode(), VALUESET.toCode()).stream()
.map(asFunction(npmPackage::loadResource))))
.map(jsonParser::parseResource)
.forEach(resource -> {
switch (fromCode(resource.fhirType())) {
case STRUCTUREDEFINITION: prePopulatedValidationSupport.addStructureDefinition(resource); break;
case VALUESET: prePopulatedValidationSupport.addValueSet((ValueSet) resource);
}
});
var validationSupportChain = new ValidationSupportChain(
new DefaultProfileValidationSupport(fhirContext),
new InMemoryTerminologyServerValidationSupport(fhirContext),
new SnapshotGeneratingValidationSupport(fhirContext),
prePopulatedValidationSupport);
var fhirInstanceValidator = new FhirInstanceValidator(validationSupportChain);
fhirContext.newValidator().registerValidatorModule(fhirInstanceValidator).validateWithResult(condition);
}
}
Describe the bug
When trying to validate resources against profiles, value sets and code lists contained in the modules of https://simplifier.net/organization/koordinationsstellemii I receive
ca.uhn.fhir.rest.server.exceptions.InternalErrorException: Failed to generate snapshot
caused byjava.lang.NullPointerException: Cannot invoke "ca.uhn.fhir.context.support.IValidationSupport$ValueSetExpansionOutcome.getValueSet()" because "expanded" is null
.To Reproduce To demonstratre the behavior I have created a minimal test class with some minimal profiles and value sets.
If you run the following class...
...then one receives the following stack trace...
After some debugging I was actually able to fix this issue for me by extending
org.hl7.fhir.common.hapi.validation.support.PrePopulatedValidationSupport
makingexpandValueSet(...)
not returnnull
butnew ValueSetExpansionOutcome(theValueSetToExpand)
:Expected behavior The given FHIR resource should validate without any error or excpetion.
Screenshots n/a
Environment (please complete the following information):
Additional context Add any other context about the problem here.