Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

issue-3455 - adding resource info from location when return preferenc… #4130

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* (C) Copyright IBM Corp. 2022
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.linuxforhealth.fhir.server.spi.operation;


/**
* This class is used to represent a Resource context information.
*/
public class FHIRResourceContext {

private String resourceType;

private String id;

private String versionId;



/**
* @param resourceType
* @param id
* @param versionId
*/
public FHIRResourceContext(String resourceType, String id, String versionId) {
super();
this.resourceType = resourceType;
this.id = id;
this.versionId = versionId;
}



/**
* @return the resourceType
*/
public String getResourceType() {
return resourceType;
}


/**
* @param resourceType the resourceType to set
*/
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}


/**
* @return the id
*/
public String getId() {
return id;
}


/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}


/**
* @return the versionId
*/
public String getVersionId() {
return versionId;
}


/**
* @param versionId the versionId to set
*/
public void setVersionId(String versionId) {
this.versionId = versionId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.linuxforhealth.fhir.server.spi.operation;

import java.net.URI;
import java.util.List;

import javax.ws.rs.core.Response;

Expand All @@ -24,6 +25,7 @@ public class FHIRRestOperationResponse {
private Resource prevResource;
private OperationOutcome operationOutcome;
private boolean deleted;
private List<FHIRResourceContext> fhirResourceContexts;

// For delete we need to return the version of the deletion marker
private int versionForETag;
Expand Down Expand Up @@ -155,4 +157,22 @@ public int getVersionForETag() {
public void setVersionForETag(int versionForETag) {
this.versionForETag = versionForETag;
}


/**
* @return the fhirResourceContexts
*/
public List<FHIRResourceContext> getFhirResourceContexts() {
return fhirResourceContexts;
}


/**
* @param fhirResourceContexts the fhirResourceContexts to set
*/
public void setFhirResourceContexts(List<FHIRResourceContext> fhirResourceContexts) {
this.fhirResourceContexts = fhirResourceContexts;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import java.io.ByteArrayInputStream;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.UUID;
Expand Down Expand Up @@ -46,7 +45,6 @@
import org.linuxforhealth.fhir.client.FHIRRequestHeader;
import org.linuxforhealth.fhir.client.FHIRResponse;
import org.linuxforhealth.fhir.config.ConfigurationService;
import org.linuxforhealth.fhir.config.FHIRConfigHelper;
import org.linuxforhealth.fhir.config.FHIRConfiguration;
import org.linuxforhealth.fhir.config.PropertyGroup;
import org.linuxforhealth.fhir.core.FHIRMediaType;
Expand Down Expand Up @@ -130,6 +128,7 @@ public class BundleTest extends FHIRServerTestBase {
private static final String PATIENT_EXTENSION_URL = "http://my.url.domain.com/acme-healthcare/related-patient";

private static final String PREFER_HEADER_RETURN_REPRESENTATION = "return=representation";
private static final String PREFER_HEADER_RETURN_OPERATION_OUTCOME = "return=OperationOutcome";
private static final String PREFER_HEADER_NAME = "Prefer";

private static Boolean kafkaAuditEnabled = false;
Expand Down Expand Up @@ -987,64 +986,69 @@ public void testBatchCompartmentSearch() throws Exception {
@Test(groups = { "batch" }, dependsOnMethods = { "testBatchUpdates" })
public void testBatchMixture() throws Exception {
String method = "testBatchMixture";
WebTarget target = getWebTarget();

// change at least one field so that the update below isn't skipped
patientB1 = patientB1.toBuilder()
.deceased(true)
.build();

// Perform a mixture of request types.
Bundle bundle = buildBundle(BundleType.BATCH);
// create
bundle = addRequestToBundle(null, bundle, HTTPVerb.POST, "Patient", null,
TestUtil.readLocalResource("Patient_DavidOrtiz.json"));
// update
bundle = addRequestToBundle(null, bundle, HTTPVerb.PUT, "Patient/" + patientB1.getId(), null,
patientB1);
// read
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientB2.getId(), null, null);
// vread
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, locationB1, null, null);
// history
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientB1.getId() + "/_history",
null, null);
// search
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient?family=Ortiz&_count=100", null, null);

printBundle(method, "request", bundle);

Entity<Bundle> entity = Entity.entity(bundle, FHIRMediaType.APPLICATION_FHIR_JSON);
Response response = target.request()
.header(PREFER_HEADER_NAME, PREFER_HEADER_RETURN_REPRESENTATION)
.post(entity, Response.class);
assertResponse(response, Response.Status.OK.getStatusCode());

Bundle responseBundle = getEntityWithExtraWork(response,method);

assertResponseBundle(responseBundle, BundleType.BATCH_RESPONSE, 6);
assertGoodPostPutResponse(responseBundle.getEntry().get(0), Status.CREATED.getStatusCode());
assertGoodPostPutResponse(responseBundle.getEntry().get(1), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(2), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(3), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(4), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(5), Status.OK.getStatusCode());

Bundle resultSet;

// Verify the history results.
resultSet = (Bundle) responseBundle.getEntry().get(4).getResource();
assertNotNull(resultSet);
assertTrue(resultSet.getEntry().size() > 2);

// Verify the search results.
resultSet = (Bundle) responseBundle.getEntry().get(5).getResource();
assertNotNull(resultSet);
assertTrue(resultSet.getEntry().size() >= 1);

List<String> preferredHeaders = List.of(PREFER_HEADER_RETURN_REPRESENTATION, PREFER_HEADER_RETURN_OPERATION_OUTCOME);
for (String preferredHeader : preferredHeaders) {
WebTarget target = getWebTarget();

patientB1 = (Patient) responseBundle.getEntry().get(1).getResource();
// change at least one field so that the update below isn't skipped
patientB1 = patientB1.toBuilder()
.deceased(true)
.build();

// Perform a mixture of request types.
Bundle bundle = buildBundle(BundleType.BATCH);
// create
bundle = addRequestToBundle(null, bundle, HTTPVerb.POST, "Patient", null,
TestUtil.readLocalResource("Patient_DavidOrtiz.json"));
// update
bundle = addRequestToBundle(null, bundle, HTTPVerb.PUT, "Patient/" + patientB1.getId(), null,
patientB1);
// read
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientB2.getId(), null, null);
// vread
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, locationB1, null, null);
// history
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientB1.getId() + "/_history",
null, null);
// search
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient?family=Ortiz&_count=100", null, null);

printBundle(method, "request", bundle);

Entity<Bundle> entity = Entity.entity(bundle, FHIRMediaType.APPLICATION_FHIR_JSON);
Response response = target.request()
.header(PREFER_HEADER_NAME, preferredHeader)
.post(entity, Response.class);
assertResponse(response, Response.Status.OK.getStatusCode());

Bundle responseBundle = getEntityWithExtraWork(response,method);

assertResponseBundle(responseBundle, BundleType.BATCH_RESPONSE, 6);
assertGoodPostPutResponse(responseBundle.getEntry().get(0), Status.CREATED.getStatusCode());
assertGoodPostPutResponse(responseBundle.getEntry().get(1), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(2), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(3), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(4), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(5), Status.OK.getStatusCode());

Bundle resultSet;

// Verify the history results.
resultSet = (Bundle) responseBundle.getEntry().get(4).getResource();
assertNotNull(resultSet);
assertTrue(resultSet.getEntry().size() > 2);

// Verify the search results.
resultSet = (Bundle) responseBundle.getEntry().get(5).getResource();
assertNotNull(resultSet);
assertTrue(resultSet.getEntry().size() >= 1);
if (preferredHeader.equals(PREFER_HEADER_RETURN_REPRESENTATION)) {
patientB1 = (Patient) responseBundle.getEntry().get(1).getResource();
}
}
}


@Test(groups = { "transaction" })
public void testTransactionCreates() throws Exception {
Expand Down Expand Up @@ -1542,51 +1546,58 @@ public void testTransactionMixture() throws Exception {
if (!transactionSupported.booleanValue()) {
return;
}

WebTarget target = getWebTarget();

// Perform a mixture of request types.
Bundle bundle = buildBundle(BundleType.TRANSACTION);
// create
bundle = addRequestToBundle(null, bundle, HTTPVerb.POST, "Patient", null,
TestUtil.readLocalResource("Patient_DavidOrtiz.json"));
// update
bundle = addRequestToBundle(null, bundle, HTTPVerb.PUT, "Patient/" + patientT1.getId(), null,
patientT1);
// read
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientT2.getId(), null, null);
// vread
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, locationT1, null, null);
// history
// bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientT1.getId() + "/_history", null, null);
// search
// bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient?family=Ortiz&_count=100", null, null);

printBundle(method, "request", bundle);

Entity<Bundle> entity = Entity.entity(bundle, FHIRMediaType.APPLICATION_FHIR_JSON);
Response response = target.request().post(entity, Response.class);
assertResponse(response, Response.Status.OK.getStatusCode());
Bundle responseBundle = getEntityWithExtraWork(response,method);
assertResponseBundle(responseBundle, BundleType.TRANSACTION_RESPONSE, 4);
assertGoodPostPutResponse(responseBundle.getEntry().get(0), Status.CREATED.getStatusCode());
assertGoodPostPutResponse(responseBundle.getEntry().get(1), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(2), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(3), Status.OK.getStatusCode());
// assertGoodGetResponse(responseBundle.getEntry().get(4), Status.OK.getStatusCode());
// assertGoodGetResponse(responseBundle.getEntry().get(5), Status.OK.getStatusCode());

// Bundle resultSet;

// Verify the history results.
// resultSet = (Bundle) FHIRUtil.getResourceContainerResource(responseBundle.getEntry().get(4).getResource());
// assertNotNull(resultSet);
// assertTrue(resultSet.getEntry().size() > 2);

// Verify the search results.
// resultSet = (Bundle) FHIRUtil.getResourceContainerResource(responseBundle.getEntry().get(5).getResource());
// assertNotNull(resultSet);
// assertTrue(resultSet.getEntry().size() > 3);

List<String> preferredHeaders = List.of(PREFER_HEADER_RETURN_REPRESENTATION, PREFER_HEADER_RETURN_OPERATION_OUTCOME);
for (String preferredHeader : preferredHeaders) {
WebTarget target = getWebTarget();

// Perform a mixture of request types.
Bundle bundle = buildBundle(BundleType.TRANSACTION);
// create
bundle = addRequestToBundle(null, bundle, HTTPVerb.POST, "Patient", null,
TestUtil.readLocalResource("Patient_DavidOrtiz.json"));
// update
bundle = addRequestToBundle(null, bundle, HTTPVerb.PUT, "Patient/" + patientT1.getId(), null,
patientT1);
// read
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientT2.getId(), null, null);
// vread
bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, locationT1, null, null);
// history
// bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient/" + patientT1.getId() + "/_history", null, null);
// search
// bundle = addRequestToBundle(null, bundle, HTTPVerb.GET, "Patient?family=Ortiz&_count=100", null, null);
Comment on lines +1566 to +1569
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the original test had these commented out too, but it makes me wonder why...


printBundle(method, "request", bundle);

Entity<Bundle> entity = Entity.entity(bundle, FHIRMediaType.APPLICATION_FHIR_JSON);
Response response = target.request()
.header(PREFER_HEADER_NAME, preferredHeader)
.post(entity, Response.class);
assertResponse(response, Response.Status.OK.getStatusCode());
Bundle responseBundle = getEntityWithExtraWork(response,method);
assertResponseBundle(responseBundle, BundleType.TRANSACTION_RESPONSE, 4);
assertGoodPostPutResponse(responseBundle.getEntry().get(0), Status.CREATED.getStatusCode());
assertGoodPostPutResponse(responseBundle.getEntry().get(1), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(2), Status.OK.getStatusCode());
assertGoodGetResponse(responseBundle.getEntry().get(3), Status.OK.getStatusCode());
// assertGoodGetResponse(responseBundle.getEntry().get(4), Status.OK.getStatusCode());
// assertGoodGetResponse(responseBundle.getEntry().get(5), Status.OK.getStatusCode());

// Bundle resultSet;

// Verify the history results.
// resultSet = (Bundle) FHIRUtil.getResourceContainerResource(responseBundle.getEntry().get(4).getResource());
// assertNotNull(resultSet);
// assertTrue(resultSet.getEntry().size() > 2);

// Verify the search results.
// resultSet = (Bundle) FHIRUtil.getResourceContainerResource(responseBundle.getEntry().get(5).getResource());
// assertNotNull(resultSet);
// assertTrue(resultSet.getEntry().size() > 3);
}


}

@Test(groups = { "batch" })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public Response delete(@PathParam("type") String type, @PathParam("id") String i
try {
RestAuditLogger.logDelete(httpServletRequest,
ior != null ? ior.getResource() : null,
startTime, new Date(), status);
startTime, new Date(), status, ior != null ? ior.getFhirResourceContexts() : null);
} catch (Exception e) {
log.log(Level.SEVERE, AUDIT_LOGGING_ERR_MSG, e);
}
Expand Down Expand Up @@ -120,7 +120,7 @@ public Response conditionalDelete(@PathParam("type") String type) throws Excepti
try {
RestAuditLogger.logDelete(httpServletRequest,
ior != null ? ior.getResource() : null,
startTime, new Date(), status);
startTime, new Date(), status, ior != null ? ior.getFhirResourceContexts() : null);
} catch (Exception e) {
log.log(Level.SEVERE, AUDIT_LOGGING_ERR_MSG, e);
}
Expand Down
Loading