fix the issue (#5214)
This commit is contained in:
parent
fdfda37f73
commit
3512f82a6d
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
type: fix
|
||||||
|
issue: 5212
|
||||||
|
title: "Previously, when a CDS hook was registered and called with a empty context, the server returned a 500. This behaviour has been fixed."
|
|
@ -22,6 +22,7 @@ package ca.uhn.hapi.fhir.cdshooks.api.json;
|
||||||
import ca.uhn.fhir.model.api.IModelJson;
|
import ca.uhn.fhir.model.api.IModelJson;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -39,7 +40,7 @@ public class CdsServiceRequestContextJson extends BaseCdsServiceJson implements
|
||||||
|
|
||||||
public List<String> getArray(String theKey) {
|
public List<String> getArray(String theKey) {
|
||||||
if (myMap == null) {
|
if (myMap == null) {
|
||||||
return null;
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
return (List<String>) myMap.get(theKey);
|
return (List<String>) myMap.get(theKey);
|
||||||
}
|
}
|
||||||
|
@ -59,14 +60,23 @@ public class CdsServiceRequestContextJson extends BaseCdsServiceJson implements
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getKeys() {
|
public Set<String> getKeys() {
|
||||||
|
if (myMap == null) {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
return myMap.keySet();
|
return myMap.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object get(String theKey) {
|
public Object get(String theKey) {
|
||||||
|
if (myMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return myMap.get(theKey);
|
return myMap.get(theKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsKey(String theKey) {
|
public boolean containsKey(String theKey) {
|
||||||
|
if (myMap == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return myMap.containsKey(theKey);
|
return myMap.containsKey(theKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package ca.uhn.hapi.fhir.cdshooks.module;
|
package ca.uhn.hapi.fhir.cdshooks.module;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceRequestContextJson;
|
||||||
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceRequestJson;
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceRequestJson;
|
||||||
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseCardJson;
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseCardJson;
|
||||||
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseJson;
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseJson;
|
||||||
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseSuggestionActionJson;
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseSuggestionActionJson;
|
||||||
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseSuggestionJson;
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseSuggestionJson;
|
||||||
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseSystemActionJson;
|
import ca.uhn.hapi.fhir.cdshooks.api.json.CdsServiceResponseSystemActionJson;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
@ -23,17 +23,17 @@ import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.contains;
|
import static org.hamcrest.Matchers.contains;
|
||||||
import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace;
|
import static org.hamcrest.Matchers.equalToCompressingWhiteSpace;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotSame;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
|
||||||
@ExtendWith(SpringExtension.class)
|
@ExtendWith(SpringExtension.class)
|
||||||
public class SerializationTest {
|
class SerializationTest {
|
||||||
public static final String HOOK_NAME = "Hook Name";
|
public static final String HOOK_NAME = "Hook Name";
|
||||||
public static final String FHIR_SERVER = "https://localhost:2401";
|
public static final String FHIR_SERVER = "https://localhost:2401";
|
||||||
public static final String FAMILY = "Jehoshaphat";
|
public static final String FAMILY = "Jehoshaphat";
|
||||||
|
@ -60,7 +60,7 @@ public class SerializationTest {
|
||||||
private String myRequestJson;
|
private String myRequestJson;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void loadJson() throws IOException {
|
public void loadJson() throws Exception {
|
||||||
myRequestJson = IOUtils.toString(myRequestJsonResource.getInputStream(), Charsets.UTF_8);
|
myRequestJson = IOUtils.toString(myRequestJsonResource.getInputStream(), Charsets.UTF_8);
|
||||||
myResponseJson = IOUtils.toString(myResponseJsonResource.getInputStream(), Charsets.UTF_8);
|
myResponseJson = IOUtils.toString(myResponseJsonResource.getInputStream(), Charsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ public class SerializationTest {
|
||||||
// These tests verify that nulls prefetch values are preserved in serialization and deserialization so their
|
// These tests verify that nulls prefetch values are preserved in serialization and deserialization so their
|
||||||
// missing status is properly determined
|
// missing status is properly determined
|
||||||
@Test
|
@Test
|
||||||
public void testSerializeRequest() throws JsonProcessingException {
|
void testSerializeRequest() throws Exception {
|
||||||
CdsServiceRequestJson cdsServiceRequestJson = new CdsServiceRequestJson();
|
CdsServiceRequestJson cdsServiceRequestJson = new CdsServiceRequestJson();
|
||||||
cdsServiceRequestJson.setHook(HOOK_NAME);
|
cdsServiceRequestJson.setHook(HOOK_NAME);
|
||||||
cdsServiceRequestJson.setFhirServer(FHIR_SERVER);
|
cdsServiceRequestJson.setFhirServer(FHIR_SERVER);
|
||||||
|
@ -106,11 +106,11 @@ public class SerializationTest {
|
||||||
|
|
||||||
String json = ourObjectMapper.writeValueAsString(cdsServiceRequestJson);
|
String json = ourObjectMapper.writeValueAsString(cdsServiceRequestJson);
|
||||||
ourLog.debug(json);
|
ourLog.debug(json);
|
||||||
assertThat(json, equalToIgnoringWhiteSpace(myRequestJson));
|
assertThat(json, equalToCompressingWhiteSpace(myRequestJson));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDeserializeRequest() throws JsonProcessingException {
|
void testDeserializeRequest() throws Exception {
|
||||||
CdsServiceRequestJson cdsServiceRequestJson = ourObjectMapper.readValue(myRequestJson, CdsServiceRequestJson.class);
|
CdsServiceRequestJson cdsServiceRequestJson = ourObjectMapper.readValue(myRequestJson, CdsServiceRequestJson.class);
|
||||||
assertEquals(HOOK_NAME, cdsServiceRequestJson.getHook());
|
assertEquals(HOOK_NAME, cdsServiceRequestJson.getHook());
|
||||||
|
|
||||||
|
@ -127,11 +127,11 @@ public class SerializationTest {
|
||||||
assertEquals(CONTEXT_PATIENT_VALUE, cdsServiceRequestJson.getContext().getString(CONTEXT_PATIENT_KEY));
|
assertEquals(CONTEXT_PATIENT_VALUE, cdsServiceRequestJson.getContext().getString(CONTEXT_PATIENT_KEY));
|
||||||
List<String> selections = cdsServiceRequestJson.getContext().getArray(CONTEXT_SELECTIONS_KEY);
|
List<String> selections = cdsServiceRequestJson.getContext().getArray(CONTEXT_SELECTIONS_KEY);
|
||||||
assertThat(selections, contains(CONTEXT_SELECTIONS_VALUE1, CONTEXT_SELECTIONS_VALUE2));
|
assertThat(selections, contains(CONTEXT_SELECTIONS_VALUE1, CONTEXT_SELECTIONS_VALUE2));
|
||||||
Bundle bundle = (Bundle) cdsServiceRequestJson.getContext().getResource(CONTEXT_DRAFT_ORDERS_KEY);
|
cdsServiceRequestJson.getContext().getResource(CONTEXT_DRAFT_ORDERS_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSerializeResponse() throws JsonProcessingException {
|
void testSerializeResponse() throws Exception {
|
||||||
Patient patient = new Patient();
|
Patient patient = new Patient();
|
||||||
patient.addName().setFamily(FAMILY);
|
patient.addName().setFamily(FAMILY);
|
||||||
CdsServiceResponseSystemActionJson systemAction = new CdsServiceResponseSystemActionJson();
|
CdsServiceResponseSystemActionJson systemAction = new CdsServiceResponseSystemActionJson();
|
||||||
|
@ -151,13 +151,41 @@ public class SerializationTest {
|
||||||
|
|
||||||
String json = ourObjectMapper.writeValueAsString(cdsServiceRequestJson);
|
String json = ourObjectMapper.writeValueAsString(cdsServiceRequestJson);
|
||||||
ourLog.debug(json);
|
ourLog.debug(json);
|
||||||
assertThat(json, equalToIgnoringWhiteSpace(myResponseJson));
|
assertThat(json, equalToCompressingWhiteSpace(myResponseJson));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDeserializeResponse() throws JsonProcessingException {
|
void testDeserializeResponse() throws Exception {
|
||||||
CdsServiceResponseJson cdsServiceResponseJson = ourObjectMapper.readValue(myResponseJson, CdsServiceResponseJson.class);
|
CdsServiceResponseJson cdsServiceResponseJson = ourObjectMapper.readValue(myResponseJson, CdsServiceResponseJson.class);
|
||||||
Patient patient = (Patient) cdsServiceResponseJson.getServiceActions().get(0).getResource();
|
Patient patient = (Patient) cdsServiceResponseJson.getServiceActions().get(0).getResource();
|
||||||
assertEquals(FAMILY, patient.getNameFirstRep().getFamily());
|
assertEquals(FAMILY, patient.getNameFirstRep().getFamily());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSerializeDeserializeEmptyRequest() throws Exception {
|
||||||
|
// setup
|
||||||
|
final CdsServiceRequestJson expected = new CdsServiceRequestJson();
|
||||||
|
final String expectedAsJson = ourObjectMapper.writeValueAsString(expected);
|
||||||
|
// execute
|
||||||
|
final CdsServiceRequestJson actual = ourObjectMapper.readValue(expectedAsJson, CdsServiceRequestJson.class);
|
||||||
|
// validate
|
||||||
|
final String actualAsJson = ourObjectMapper.writeValueAsString(actual);
|
||||||
|
assertNotSame(expected, actual);
|
||||||
|
assertEquals(expectedAsJson, actualAsJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSerializeDeserializeRequestWithEmptyContext() throws Exception {
|
||||||
|
// setup
|
||||||
|
final CdsServiceRequestJson expected = new CdsServiceRequestJson();
|
||||||
|
expected.setContext(new CdsServiceRequestContextJson());
|
||||||
|
final String expectedAsJson = ourObjectMapper.writeValueAsString(expected);
|
||||||
|
// execute
|
||||||
|
final CdsServiceRequestJson actual = ourObjectMapper.readValue(expectedAsJson, CdsServiceRequestJson.class);
|
||||||
|
// validate
|
||||||
|
final String actualAsJson = ourObjectMapper.writeValueAsString(actual);
|
||||||
|
assertNotSame(expected, actual);
|
||||||
|
assertEquals(expectedAsJson, actualAsJson);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue