Skip to content

Commit 70e4eff

Browse files
Merge pull request #286 from HL7-DaVinci/Operation-Outcome-Support
Prefetch OperationOutcome support
2 parents 114b51c + aecbfa7 commit 70e4eff

File tree

8 files changed

+262
-119
lines changed

8 files changed

+262
-119
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.hl7.davinci.r4;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonProcessingException;
5+
import com.fasterxml.jackson.databind.DeserializationContext;
6+
import com.fasterxml.jackson.databind.JsonNode;
7+
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
9+
import org.hl7.fhir.instance.model.Bundle;
10+
import org.hl7.fhir.instance.model.api.IBaseResource;
11+
import org.hl7.fhir.r4.model.OperationOutcome;
12+
13+
import java.io.IOException;
14+
15+
public class JacksonIBaseResourceDeserializer extends StdDeserializer<IBaseResource> {
16+
17+
public JacksonIBaseResourceDeserializer() {
18+
this(null);
19+
}
20+
21+
public JacksonIBaseResourceDeserializer(Class<?> vc) {
22+
super(vc);
23+
}
24+
25+
@Override
26+
public IBaseResource deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
27+
FhirComponents fhirComponents = new FhirComponents();
28+
ObjectMapper mapper = (ObjectMapper) p.getCodec();
29+
JsonNode node = mapper.readTree(p);
30+
IBaseResource parsedResource = fhirComponents.getJsonParser().parseResource(mapper.writeValueAsString(node));
31+
return parsedResource;
32+
}
33+
}

resources/src/main/java/org/hl7/davinci/r4/crdhook/CrdPrefetch.java

Lines changed: 108 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
88
import org.hl7.davinci.r4.JacksonBundleDeserializer;
99
import org.hl7.davinci.r4.JacksonHapiSerializer;
10+
import org.hl7.davinci.r4.JacksonIBaseResourceDeserializer;
11+
import org.hl7.fhir.instance.model.api.IBase;
12+
import org.hl7.fhir.instance.model.api.IBaseResource;
1013
import org.hl7.fhir.r4.model.*;
1114
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
1215

@@ -17,128 +20,138 @@
1720
public class CrdPrefetch {
1821

1922
@JsonSerialize(using = JacksonHapiSerializer.class)
20-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
21-
private Bundle coverageBundle;
23+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
24+
private IBaseResource coverageBundle;
2225

2326
@JsonSerialize(using = JacksonHapiSerializer.class)
24-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
25-
private Bundle deviceRequestBundle;
27+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
28+
private IBaseResource deviceRequestBundle;
2629

2730
@JsonSerialize(using = JacksonHapiSerializer.class)
28-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
29-
private Bundle medicationRequestBundle;
31+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
32+
private IBaseResource medicationRequestBundle;
3033

3134
@JsonSerialize(using = JacksonHapiSerializer.class)
32-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
33-
private Bundle nutritionOrderBundle;
35+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
36+
private IBaseResource nutritionOrderBundle;
3437

3538
@JsonSerialize(using = JacksonHapiSerializer.class)
36-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
37-
private Bundle serviceRequestBundle;
39+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
40+
private IBaseResource serviceRequestBundle;
3841

3942
@JsonSerialize(using = JacksonHapiSerializer.class)
40-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
41-
private Bundle supplyRequestBundle;
43+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
44+
private IBaseResource supplyRequestBundle;
4245

4346
@JsonSerialize(using = JacksonHapiSerializer.class)
44-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
45-
private Bundle appointmentBundle;
47+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
48+
private IBaseResource appointmentBundle;
4649

4750
@JsonSerialize(using = JacksonHapiSerializer.class)
48-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
49-
private Bundle encounterBundle;
51+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
52+
private IBaseResource encounterBundle;
5053

5154
@JsonSerialize(using = JacksonHapiSerializer.class)
52-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
53-
private Bundle medicationDispenseBundle;
55+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
56+
private IBaseResource medicationDispenseBundle;
5457

5558
@JsonSerialize(using = JacksonHapiSerializer.class)
56-
@JsonDeserialize(using = JacksonBundleDeserializer.class)
57-
private Bundle medicationStatementBundle;
59+
@JsonDeserialize(using = JacksonIBaseResourceDeserializer.class)
60+
private IBaseResource medicationStatementBundle;
5861

59-
public Bundle getCoverageBundle() {
62+
public IBaseResource getCoverageBundle() {
6063
if (coverageBundle == null) {
6164
this.coverageBundle = new Bundle();
6265
}
66+
67+
if (coverageBundle.getClass() != Bundle.class) {
68+
return null;
69+
}
70+
6371
return coverageBundle;
6472
}
6573

66-
public void setCoverageBundle(Bundle coverageBundle) {
74+
public void setCoverageBundle(IBaseResource coverageBundle) {
6775
this.coverageBundle = coverageBundle;
6876
}
6977

70-
public Bundle getDeviceRequestBundle() {
78+
public IBaseResource getDeviceRequestBundle() {
7179
return deviceRequestBundle;
7280
}
7381

74-
public void setDeviceRequestBundle(Bundle deviceRequestBundle) {
82+
public void setDeviceRequestBundle(IBaseResource deviceRequestBundle) {
7583
this.deviceRequestBundle = deviceRequestBundle;
7684
}
7785

78-
public Bundle getMedicationRequestBundle() {
86+
public IBaseResource getMedicationRequestBundle() {
7987
return medicationRequestBundle;
8088
}
8189

82-
public void setMedicationRequestBundle(Bundle medicationRequestBundle) { this.medicationRequestBundle = medicationRequestBundle; }
90+
public void setMedicationRequestBundle(IBaseResource medicationRequestBundle) { this.medicationRequestBundle = medicationRequestBundle; }
8391

84-
public Bundle getMedicationDispenseBundle() {
92+
public IBaseResource getMedicationDispenseBundle() {
8593
return medicationDispenseBundle;
8694
}
8795

88-
public void setMedicationDispenseBundle(Bundle medicationDispenseBundle) { this.medicationDispenseBundle = medicationDispenseBundle; }
96+
public void setMedicationDispenseBundle(IBaseResource medicationDispenseBundle) { this.medicationDispenseBundle = medicationDispenseBundle; }
8997

90-
public Bundle getNutritionOrderBundle() {
98+
public IBaseResource getNutritionOrderBundle() {
9199
return nutritionOrderBundle;
92100
}
93101

94-
public void setNutritionOrderBundle(Bundle nutritionOrderBundle) {
102+
public void setNutritionOrderBundle(IBaseResource nutritionOrderBundle) {
95103
this.nutritionOrderBundle = nutritionOrderBundle;
96104
}
97105

98-
public Bundle getServiceRequestBundle() {
106+
public IBaseResource getServiceRequestBundle() {
99107
return serviceRequestBundle;
100108
}
101109

102-
public void setServiceRequestBundle(Bundle serviceRequestBundle) {
110+
public void setServiceRequestBundle(IBaseResource serviceRequestBundle) {
103111
this.serviceRequestBundle = serviceRequestBundle;
104112
}
105113

106-
public Bundle getSupplyRequestBundle() {
114+
public IBaseResource getSupplyRequestBundle() {
107115
return supplyRequestBundle;
108116
}
109117

110-
public void setSupplyRequestBundle(Bundle supplyRequestBundle) {
118+
public void setSupplyRequestBundle(IBaseResource supplyRequestBundle) {
111119
this.supplyRequestBundle = supplyRequestBundle;
112120
}
113121

114-
public Bundle getAppointmentBundle() { return appointmentBundle; }
122+
public IBaseResource getAppointmentBundle() {
123+
return appointmentBundle;
124+
}
115125

116-
public void setAppointmentBundle(Bundle appointmentBundle) { this.appointmentBundle = appointmentBundle; }
126+
public void setAppointmentBundle(IBaseResource appointmentBundle) { this.appointmentBundle = appointmentBundle; }
117127

118-
public Bundle getEncounterBundle() { return encounterBundle; }
128+
public IBaseResource getEncounterBundle() {
129+
return encounterBundle;
130+
}
119131

120-
public void setEncounterBundle(Bundle encounterBundle) { this.encounterBundle = encounterBundle; }
132+
public void setEncounterBundle(IBaseResource encounterBundle) { this.encounterBundle = encounterBundle; }
121133

122-
public Bundle getMedicationStatementBundle() { return medicationStatementBundle; }
134+
public IBaseResource getMedicationStatementBundle() {
135+
return medicationStatementBundle; }
123136

124-
public void setMedicationStatementBundle(Bundle medicationStatementBundle) { this.medicationStatementBundle = medicationStatementBundle; }
137+
public void setMedicationStatementBundle(IBaseResource medicationStatementBundle) { this.medicationStatementBundle = medicationStatementBundle; }
125138

126139
/**
127140
* Checks whether the given resource exists in the requested resource type.
128141
* @param id
129142
* @return
130143
*/
131144
public boolean containsRequestResourceId(String id) {
132-
return this.bundleContainsResourceId(this.coverageBundle, id)
133-
|| this.bundleContainsResourceId(this.deviceRequestBundle, id)
134-
|| this.bundleContainsResourceId(this.medicationRequestBundle, id)
135-
|| this.bundleContainsResourceId(this.nutritionOrderBundle, id)
136-
|| this.bundleContainsResourceId(this.serviceRequestBundle, id)
137-
|| this.bundleContainsResourceId(this.supplyRequestBundle, id)
138-
|| this.bundleContainsResourceId(this.appointmentBundle, id)
139-
|| this.bundleContainsResourceId(this.encounterBundle, id)
140-
|| this.bundleContainsResourceId(this.medicationDispenseBundle, id)
141-
|| this.bundleContainsResourceId(this.medicationStatementBundle, id);
145+
return this.bundleContainsResourceId(this.getCoverageBundle(), id)
146+
|| this.bundleContainsResourceId(this.getDeviceRequestBundle(), id)
147+
|| this.bundleContainsResourceId(this.getMedicationRequestBundle(), id)
148+
|| this.bundleContainsResourceId(this.getNutritionOrderBundle(), id)
149+
|| this.bundleContainsResourceId(this.getServiceRequestBundle(), id)
150+
|| this.bundleContainsResourceId(this.getSupplyRequestBundle(), id)
151+
|| this.bundleContainsResourceId(this.getAppointmentBundle(), id)
152+
|| this.bundleContainsResourceId(this.getEncounterBundle(), id)
153+
|| this.bundleContainsResourceId(this.getMedicationDispenseBundle(), id)
154+
|| this.bundleContainsResourceId(this.getMedicationStatementBundle(), id);
142155
}
143156

144157
/**
@@ -147,42 +160,64 @@ public boolean containsRequestResourceId(String id) {
147160
* @param id
148161
* @return
149162
*/
150-
private boolean bundleContainsResourceId(Bundle bundle, String id) {
151-
if (bundle == null) {
163+
private boolean bundleContainsResourceId(IBaseResource bundle, String id) {
164+
if (bundle == null || bundle.getClass() != Bundle.class) {
152165
return false;
153166
}
167+
154168
if (id.contains("/")) {
155169
String[] splitId = id.split("/");
156170
id = splitId[splitId.length-1];
157171
}
158172
final String idToCheck = id;
159-
return bundle.getEntry().stream().anyMatch(entry -> entry.getResource().getId().contains(idToCheck));
173+
return ((Bundle) bundle).getEntry().stream().anyMatch(entry -> entry.getResource().getId().contains(idToCheck));
160174
}
161175

162176
@Override
163177
public String toString() {
178+
164179
List<BundleEntryComponent> entries = new ArrayList<>();
165-
if(this.deviceRequestBundle != null) {
166-
entries.addAll(this.deviceRequestBundle.getEntry());
167-
} if(this.nutritionOrderBundle != null){
168-
entries.addAll(this.nutritionOrderBundle.getEntry());
169-
} if(this.serviceRequestBundle != null){
170-
entries.addAll(this.serviceRequestBundle.getEntry());
171-
} if(this.medicationDispenseBundle != null){
172-
entries.addAll(this.medicationDispenseBundle.getEntry());
173-
} if(this.medicationStatementBundle != null){
174-
entries.addAll(this.medicationStatementBundle.getEntry());
175-
} if(this.encounterBundle != null){
176-
entries.addAll(this.encounterBundle.getEntry());
177-
} if(this.appointmentBundle != null){
178-
entries.addAll(this.appointmentBundle.getEntry());
179-
} if(this.medicationRequestBundle != null){
180-
entries.addAll(this.medicationRequestBundle.getEntry());
181-
} if(this.supplyRequestBundle != null){
182-
entries.addAll(this.supplyRequestBundle.getEntry());
183-
} if(this.coverageBundle != null) {
184-
entries.addAll(this.coverageBundle.getEntry());
180+
181+
if(this.deviceRequestBundle != null && this.deviceRequestBundle.getClass() == Bundle.class) {
182+
entries.addAll(((Bundle)this.deviceRequestBundle).getEntry());
183+
}
184+
185+
if(this.nutritionOrderBundle != null && this.nutritionOrderBundle.getClass() == Bundle.class){
186+
entries.addAll(((Bundle)this.nutritionOrderBundle).getEntry());
187+
}
188+
189+
if(this.serviceRequestBundle != null && this.serviceRequestBundle.getClass() == Bundle.class){
190+
entries.addAll(((Bundle)this.serviceRequestBundle).getEntry());
191+
}
192+
193+
if(this.medicationDispenseBundle != null && this.medicationDispenseBundle.getClass() == Bundle.class){
194+
entries.addAll(((Bundle)this.medicationDispenseBundle).getEntry());
185195
}
196+
197+
if(this.medicationStatementBundle != null && this.medicationStatementBundle.getClass() == Bundle.class){
198+
entries.addAll(((Bundle)this.medicationStatementBundle).getEntry());
199+
}
200+
201+
if(this.encounterBundle != null && this.encounterBundle.getClass() == Bundle.class){
202+
entries.addAll(((Bundle)this.encounterBundle).getEntry());
203+
}
204+
205+
if(this.appointmentBundle != null && this.appointmentBundle.getClass() == Bundle.class){
206+
entries.addAll(((Bundle)this.appointmentBundle).getEntry());
207+
}
208+
209+
if(this.medicationRequestBundle != null && this.medicationRequestBundle.getClass() == Bundle.class){
210+
entries.addAll(((Bundle)this.medicationRequestBundle).getEntry());
211+
}
212+
213+
if(this.supplyRequestBundle != null && this.supplyRequestBundle.getClass() == Bundle.class){
214+
entries.addAll(((Bundle)this.supplyRequestBundle).getEntry());
215+
}
216+
217+
if(this.coverageBundle != null && this.coverageBundle.getClass() == Bundle.class) {
218+
entries.addAll(((Bundle)this.coverageBundle).getEntry());
219+
}
220+
186221
StringBuilder sb = new StringBuilder();
187222
sb.append("[");
188223
for(BundleEntryComponent entry : entries) {

resources/src/test/java/org/hl7/davinci/r4/crdhook/ordersign/OrderSignRequestTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void testReadingJson() throws IOException, FHIRException {
2626
assertNotNull(request);
2727
assertEquals("1288992", request.getContext().getPatientId());
2828

29-
Bundle deviceRequestBundle = request.getPrefetch().getDeviceRequestBundle();
29+
Bundle deviceRequestBundle = (Bundle)request.getPrefetch().getDeviceRequestBundle();
3030
List<DeviceRequest> deviceRequestList = Utilities.getResourcesOfTypeFromBundle(
3131
DeviceRequest.class, deviceRequestBundle);
3232

server/src/main/java/org/hl7/davinci/endpoint/cdshooks/services/crd/CdsService.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.hl7.davinci.endpoint.cdshooks.services.crd;
22

3-
import com.google.gson.Gson;
43
import org.apache.commons.lang.StringUtils;
54
import org.cdshooks.*;
65
import org.hl7.davinci.FhirComponentsT;
@@ -19,7 +18,6 @@
1918
import org.hl7.davinci.endpoint.rules.CoverageRequirementRuleResult;
2019
import org.hl7.davinci.r4.CardTypes;
2120
import org.hl7.davinci.r4.CoverageGuidance;
22-
import org.hl7.davinci.r4.crdhook.ConfigurationOption;
2321
import org.hl7.davinci.r4.crdhook.DiscoveryExtension;
2422
import org.hl7.davinci.r4.crdhook.orderselect.OrderSelectRequest;
2523
import org.hl7.fhir.instance.model.api.IBaseResource;
@@ -159,7 +157,7 @@ public CdsResponse handleRequest(@Valid @RequestBody requestTypeT request, URL a
159157
// Attempt a Query Batch Request to backfill missing attributes.
160158
if (myConfig.isQueryBatchRequest()) {
161159
QueryBatchRequest qbr = new QueryBatchRequest(this.fhirComponents);
162-
this.attempQueryBatchRequest(request, qbr);
160+
this.attemptQueryBatchRequest(request, qbr);
163161
}
164162

165163
logger.info("***** ***** request from requestLog: " + requestLog.toString() );
@@ -296,7 +294,7 @@ public CdsResponse handleRequest(@Valid @RequestBody requestTypeT request, URL a
296294
cardBuilder.errorCardIfNonePresent(CardTypes.COVERAGE, response);
297295
}
298296

299-
// Ading card to requestLog
297+
// Adding card to requestLog
300298
requestLog.setCardListFromCards(response.getCards());
301299
requestService.edit(requestLog);
302300

@@ -425,6 +423,6 @@ public abstract List<CoverageRequirementRuleResult> createCqlExecutionContexts(r
425423
/**
426424
* Delegates query batch request to child classes based on their prefetch types.
427425
*/
428-
protected abstract void attempQueryBatchRequest(requestTypeT request, QueryBatchRequest qbr);
426+
protected abstract void attemptQueryBatchRequest(requestTypeT request, QueryBatchRequest qbr);
429427

430428
}

0 commit comments

Comments
 (0)