Fix an NPE in validation

This commit is contained in:
James Agnew 2019-05-10 12:49:34 -04:00
parent 92bd2c7173
commit 444730373b
12 changed files with 533 additions and 12 deletions

View File

@ -401,11 +401,11 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- <dependency>--> <dependency>
<!-- <groupId>com.sun.activation</groupId>--> <groupId>com.sun.activation</groupId>
<!-- <artifactId>javax.activation</artifactId>--> <artifactId>javax.activation</artifactId>
<!-- <version>1.2.0</version>--> <version>1.2.0</version>
<!-- </dependency>--> </dependency>
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>javax.transaction</groupId>--> <!--<groupId>javax.transaction</groupId>-->
<!--<artifactId>javax.transaction-api</artifactId>--> <!--<artifactId>javax.transaction-api</artifactId>-->

View File

@ -1,10 +1,15 @@
package ca.uhn.fhir.jpa.provider.dstu3; package ca.uhn.fhir.jpa.provider.dstu3;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.jpa.dao.dstu3.FhirResourceDaoDstu3TerminologyTest; import ca.uhn.fhir.jpa.dao.dstu3.FhirResourceDaoDstu3TerminologyTest;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.TestUtil;
import com.google.common.base.Charsets;
import org.apache.commons.io.IOUtils;
import org.hl7.fhir.dstu3.model.*; import org.hl7.fhir.dstu3.model.*;
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
@ -12,11 +17,14 @@ import org.junit.Test;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class ResourceProviderDstu3CodeSystemTest extends BaseResourceProviderDstu3Test { public class ResourceProviderDstu3CodeSystemTest extends BaseResourceProviderDstu3Test {
public static FhirContext ourCtx = FhirContext.forDstu3();
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderDstu3CodeSystemTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderDstu3CodeSystemTest.class);
private IIdType myExtensionalVsId; private IIdType myExtensionalVsId;
@ -254,6 +262,42 @@ public class ResourceProviderDstu3CodeSystemTest extends BaseResourceProviderDst
assertEquals(false, ((BooleanType) respParam.getParameter().get(2).getValue()).booleanValue()); assertEquals(false, ((BooleanType) respParam.getParameter().get(2).getValue()).booleanValue());
} }
@Test
public void testValidationOfUploadedCodeSystems() throws IOException {
CodeSystem csYesNo = loadResource("/dstu3/fmc01-cs-yesnounk.json", CodeSystem.class);
ourClient.update().resource(csYesNo).execute();
CodeSystem csBinderRecommended = loadResource("/dstu3/fmc03-cs-binderrecommend.json", CodeSystem.class);
ourClient.update().resource(csBinderRecommended).execute();
ValueSet vsBinderRequired = loadResource("/dstu3/fmc03-vs-binderrecommend.json", ValueSet.class);
ourClient.update().resource(vsBinderRequired);
ValueSet vsYesNo = loadResource("/dstu3/fmc03-vs-fmcyesno.json", ValueSet.class);
ourClient.update().resource(vsYesNo).execute();
Questionnaire q = loadResource("/dstu3/fmc03-questionnaire.json", Questionnaire.class);
ourClient.update().resource(q).execute();
QuestionnaireResponse qr = loadResource("/dstu3/fmc03-questionnaireresponse.json", QuestionnaireResponse.class);
IBaseOperationOutcome oo = ourClient.validate().resource(qr).execute().getOperationOutcome();
String encoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(oo);
ourLog.info("Encoded:\n{}", encoded);
}
private String loadResource(String theFileName) throws IOException {
InputStream resourceAsStream = ResourceProviderDstu3CodeSystemTest.class.getResourceAsStream(theFileName);
if (resourceAsStream == null) {
resourceAsStream = ResourceProviderDstu3CodeSystemTest.class.getResourceAsStream(theFileName.substring(1));
}
return IOUtils.toString(resourceAsStream, Charsets.UTF_8);
}
private <T extends IBaseResource> T loadResource(String theFilename, Class<T> theType) throws IOException {
return ourCtx.newJsonParser().parseResource(theType, loadResource(theFilename));
}
@AfterClass @AfterClass
public static void afterClassClearContext() { public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest(); TestUtil.clearAllStaticFieldsForUnitTest();

View File

@ -15,7 +15,7 @@ import static org.junit.Assert.*;
public class JsonPatchUtilsTest extends BaseJpaTest { public class JsonPatchUtilsTest extends BaseJpaTest {
public static final FhirContext ourCtx = FhirContext.forR4(); private static final FhirContext ourCtx = FhirContext.forR4();
private static final Logger ourLog = LoggerFactory.getLogger(JsonPatchUtilsTest.class); private static final Logger ourLog = LoggerFactory.getLogger(JsonPatchUtilsTest.class);
@Test @Test

View File

@ -0,0 +1,36 @@
{
"resourceType": "CodeSystem",
"id": "FMCYesNoUnk",
"meta": {
"versionId": "1",
"lastUpdated": "2019-04-17T12:50:19.996+00:00"
},
"url": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"identifier": {
"value": "FMCYesNoUnk"
},
"name": "FMCYesNoUnk",
"status": "active",
"publisher": "FMCNA",
"description": "CodeSystem for Yes or No or Unknown",
"hierarchyMeaning": "grouped-by",
"content": "complete",
"concept": [
{
"code": "Yes",
"display": "Yes"
},
{
"code": "No",
"display": "No"
},
{
"code": "UnKnown",
"display": "UnKnown"
},
{
"code": "Pending",
"display": "Pending"
}
]
}

View File

@ -0,0 +1,41 @@
{
"resourceType": "CodeSystem",
"id": "FMCBinderRecommendation",
"meta": {
"versionId": "1",
"lastUpdated": "2019-05-02T16:57:22.705+00:00"
},
"url": "http://fkcfhir.org/fhir/cs/FMCBinderRecommendation",
"identifier": {
"value": "FMCBinderRecommendation"
},
"name": "FMCBinderRecommendation",
"title": "Binder recommendation",
"status": "active",
"publisher": "FMCNA",
"description": "CodeSystem for Binder recommendation.",
"hierarchyMeaning": "grouped-by",
"content": "complete",
"concept": [
{
"code": "Velphoro",
"display": "Velphoro"
},
{
"code": "Fosrenal",
"display": "Fosrenal"
},
{
"code": "Auryxia",
"display": "Auryxia"
},
{
"code": "Renvela",
"display": "Renvela"
},
{
"code": "Maintain current binder",
"display": "Maintain current binder"
}
]
}

View File

@ -0,0 +1,188 @@
{
"resourceType": "Questionnaire",
"id": "FMCBinderOptimizationAssessmentTest",
"meta": {
"versionId": "8",
"lastUpdated": "2019-05-07T18:55:20.151+00:00"
},
"url": "http://fkcfhir.org/fhir/Questionnaire/FMCBinderOptimizationAssessmentTest",
"status": "active",
"item": [
{
"linkId": "Binder Optimization Assessment Test",
"text": "Binder Optimization Assessment Test",
"type": "group",
"item": [
{
"linkId": "BINDER OPTIMIZATION ASSESSMENT TEST",
"text": "BINDER OPTIMIZATION ASSESSMENT TEST",
"type": "group",
"item": [
{
"linkId": "CLINICID",
"text": "CLINICID",
"type": "reference"
},
{
"linkId": "Home Medications",
"text": "Home Medications",
"type": "group",
"item": [
{
"linkId": "BO_ConsPharm",
"text": "Pharmacist consult",
"type": "choice",
"options": {
"reference": "ValueSet/FMCYesNo"
}
},
{
"linkId": "BO_ConsTxt",
"text": "Pharmacy consult notes",
"type": "text"
},
{
"linkId": "BO_RecCons",
"text": "Recommendation consistent with binder optimization guidelines",
"type": "choice",
"enableWhen": [
{
"question": "BO_RecNotCons",
"hasAnswer": false
}
],
"options": {
"reference": "ValueSet/FMCYesNo"
},
"item": [
{
"linkId": "BO_ConsDrop",
"text": "Binder recommended",
"type": "choice",
"enableWhen": [
{
"question": "BO_RecCons",
"answerCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "Yes"
}
}
],
"options": {
"reference": "ValueSet/FMCBinderRecommended"
}
}
]
},
{
"linkId": "BO_RecNotCons",
"text": "Recommendation not consistent with binder optimization guidelines",
"type": "choice",
"enableWhen": [
{
"question": "BO_RecCons",
"hasAnswer": false
}
],
"options": {
"reference": "ValueSet/FMCYesNo"
},
"item": [
{
"linkId": "BO_NotConsDrop",
"text": "Recommendation not consistent with binder optimization guidelines",
"type": "text",
"enableWhen": [
{
"question": "BO_RecNotCons",
"answerCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "Yes"
}
}
],
"item": [
{
"linkId": "BO_OtherTxt",
"text": "Other",
"type": "text",
"enableWhen": [
{
"question": "BO_NotConsDrop",
"hasAnswer": true
}
]
}
]
},
{
"linkId": "BO_Recommend",
"text": "What is your recommendation",
"type": "choice",
"enableWhen": [
{
"question": "BO_RecNotCons",
"answerCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "Yes"
}
}
],
"options": {
"reference": "ValueSet/FMCBinderRecommendation"
}
}
]
}
]
},
{
"linkId": "Plan",
"text": "Plan",
"type": "group",
"item": [
{
"linkId": "BO_CommPres",
"text": "Binder recommendation communicated to prescriber",
"type": "choice",
"options": {
"reference": "ValueSet/FMCYesNo"
}
},
{
"linkId": "BO_ComAssmt",
"text": "Referred to MSW for expressed co-pay concerns",
"type": "choice",
"options": {
"reference": "ValueSet/FMCYesNo"
}
},
{
"linkId": "BO_RefMSW",
"text": "Referred to MSW for potential medication adherence issues",
"type": "choice",
"options": {
"reference": "ValueSet/FMCYesNo"
}
},
{
"linkId": "BO_AdjHyp",
"text": "Continue adjustments per CMAB Hyperphosphatemia Algorithm",
"type": "choice",
"options": {
"reference": "ValueSet/FMCYesNo"
}
},
{
"linkId": "BO_AdjTxt",
"text": "Adjustment Text",
"type": "text"
}
]
}
]
}
]
}
]
}

View File

@ -0,0 +1,146 @@
{
"resourceType": "QuestionnaireResponse",
"identifier": {
"system": "urn:oid:2.16.840.1.113883.3.7418.21.1",
"value": "sfId"
},
"questionnaire": {
"reference": "Questionnaire/FMCBinderOptimizationAssessmentTest"
},
"status": "completed",
"subject": {
"reference": "Patient/P123456"
},
"context": {
"reference": "EpisodeOfCare/EC12345"
},
"authored": "2019-05-02T10:41:00-04:00",
"author": {
"reference": "Practitioner/PRLoginID"
},
"item": [{
"linkId": "Binder Optimization Assessment Test",
"text": "Binder Optimization Assessment Test",
"item": [{
"linkId": "BINDER OPTIMIZATION ASSESSMENT TEST",
"text": "BINDER OPTIMIZATION ASSESSMENT TEST",
"item": [{
"linkId": "Home Medications",
"text": "Home Medications",
"item": [{
"linkId": "BO_ConsPharm",
"text": "Pharmacist consult",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "Yes",
"display": "Yes"
}
}]
},
{
"linkId": "BO_ConsTxt",
"text": "Pharmacy consult notes",
"answer": [{
"valueString": "Pharmacy consult notes comes here"
}]
},
{
"linkId": "BO_RecNotCons",
"text": "Recommendation not consistent with binder optimization guidelines",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "Yes",
"display": "Yes"
}
}],
"item": [{
"linkId": "BO_NotConsDrop",
"text": "Recommendation not consistent with binder optimization guidelines",
"answer": [{
"valueString": "Chewing difficulty,Other"
}],
"item": [{
"linkId": "BO_OtherTxt",
"text": "Other",
"answer": [{
"valueString": "Other difficulty"
}]
}]
},
{
"linkId": "BO_Recommend",
"text": "What is your recommendation",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCBinderRecommendation",
"code": "Renvela",
"display": "Renvela"
}
}]
}
]
}
]
},
{
"linkId": "Plan",
"text": "Plan",
"item": [{
"linkId": "BO_CommPres",
"text": "Binder recommendation communicated to prescriber",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "No",
"display": "No"
}
}]
},
{
"linkId": "BO_ComAssmt",
"text": "Referred to MSW for expressed co-pay concerns",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "No",
"display": "No"
}
}]
},
{
"linkId": "BO_RefMSW",
"text": "Referred to MSW for potential medication adherence issues",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "No",
"display": "No"
}
}]
},
{
"linkId": "BO_AdjHyp",
"text": "Continue adjustments per CMAB Hyperphosphatemia Algorithm",
"answer": [{
"valueCoding": {
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"code": "No",
"display": "No"
}
}]
},
{
"linkId": "BO_AdjTxt",
"text": "Adjustment Text",
"answer": [{
"valueString": "Adjustment Text comes here"
}]
}
]
}
]
}]
}]
}

View File

@ -0,0 +1,26 @@
{
"resourceType": "ValueSet",
"id": "FMCBinderRecommendation",
"meta": {
"versionId": "1",
"lastUpdated": "2019-05-02T16:58:46.423+00:00"
},
"url": "http://fkcfhir.org/fhir/vs/FMCBinderRecommendation",
"identifier": [
{
"value": "FMCBinderRecommendation"
}
],
"name": "FMCBinderRecommendation",
"title": "Binder recommendation",
"status": "active",
"publisher": "FMCNA",
"description": "ValueSet for Binder recommendation.",
"compose": {
"include": [
{
"system": "http://fkcfhir.org/fhir/cs/FMCBinderRecommendation"
}
]
}
}

View File

@ -0,0 +1,36 @@
{
"resourceType": "ValueSet",
"id": "FMCYesNo",
"meta": {
"versionId": "3",
"lastUpdated": "2019-05-03T16:50:45.195+00:00"
},
"url": "http://fkcfhir.org/fhir/vs/FMCYesNo",
"identifier": [
{
"value": "FMCYesNo"
}
],
"name": "FMCYesNo",
"title": "Yes or No Choice",
"status": "active",
"publisher": "FMCNA",
"description": "ValueSet for Yes or No Choice",
"compose": {
"include": [
{
"system": "http://fkcfhir.org/fhir/cs/FMCYesNoUnk",
"concept": [
{
"code": "Yes",
"display": "Yes"
},
{
"code": "No",
"display": "No"
}
]
}
]
}
}

View File

@ -155,8 +155,10 @@ public class ValidationSupportChain implements IValidationSupport {
for (IValidationSupport next : myChain) { for (IValidationSupport next : myChain) {
if (next.isCodeSystemSupported(theCtx, theCodeSystem)) { if (next.isCodeSystemSupported(theCtx, theCodeSystem)) {
CodeValidationResult result = next.validateCode(theCtx, theCodeSystem, theCode, theDisplay); CodeValidationResult result = next.validateCode(theCtx, theCodeSystem, theCode, theDisplay);
ourLog.debug("Chain item {} returned outcome {}", next, result.isOk()); if (result != null) {
return result; ourLog.debug("Chain item {} returned outcome {}", next, result.isOk());
return result;
}
} else { } else {
ourLog.debug("Chain item {} does not support code system {}", next, theCodeSystem); ourLog.debug("Chain item {} does not support code system {}", next, theCodeSystem);
} }

View File

@ -134,8 +134,10 @@ public class ValidationSupportChain implements IValidationSupport {
for (IValidationSupport next : myChain) { for (IValidationSupport next : myChain) {
if (next.isCodeSystemSupported(theCtx, theCodeSystem)) { if (next.isCodeSystemSupported(theCtx, theCodeSystem)) {
CodeValidationResult result = next.validateCode(theCtx, theCodeSystem, theCode, theDisplay); CodeValidationResult result = next.validateCode(theCtx, theCodeSystem, theCode, theDisplay);
ourLog.debug("Chain item {} returned outcome {}", next, result.isOk()); if (result != null) {
return result; ourLog.debug("Chain item {} returned outcome {}", next, result.isOk());
return result;
}
} else { } else {
ourLog.debug("Chain item {} does not support code system {}", next, theCodeSystem); ourLog.debug("Chain item {} does not support code system {}", next, theCodeSystem);
} }

View File

@ -153,7 +153,7 @@ public class FhirInstanceValidatorDstu3Test {
} }
} }
if (retVal == null) { if (retVal == null) {
ourLog.info("fetchResource({}, {}) : {}", new Object[] {type, id, retVal}); ourLog.info("fetchResource({}, {}) : {}", type, id, retVal);
} }
return retVal; return retVal;
} }