Skip to content

Commit

Permalink
address #3064 - mismatch version in JSON error
Browse files Browse the repository at this point in the history
* The primary change here is to remove the meta.versionId from any
resources that are posted with the meta section intact. This provides
some improvement to the function.
* The next thing I did was to improve the error handling such that a
FHIROperationException from the underlying bundle persistence is bubbled
up to the end user vs. being wrapped and obscured.
* Lastly, I added additional unit and server tests to prove behavior
including with the real-world example provided by QA.

Signed-off-by: Corey Sanders <[email protected]>
  • Loading branch information
csandersdev committed Dec 7, 2021
1 parent dacf7ec commit 2a72d1d
Show file tree
Hide file tree
Showing 4 changed files with 461 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/
package com.ibm.fhir.operation.cqf;

import static com.ibm.fhir.cql.helpers.ModelHelper.*;
import static com.ibm.fhir.cql.helpers.ModelHelper.reference;

import java.util.List;

Expand Down Expand Up @@ -59,10 +59,14 @@ public Parameters doInvoke(FHIROperationContext operationContext, Class<? extend
}

try {
Bundle response = resourceHelper.doBundle(builder.build(), false);
Bundle bundle = builder.build();

Bundle response = resourceHelper.doBundle(bundle, false);

return FHIROperationUtil.getOutputParameters(PARAM_OUT_RETURN, response);

} catch( FHIROperationException fex ) {
throw fex;
} catch( Exception ex ) {
throw new FHIROperationException("Operation failed", ex);
}
Expand All @@ -86,7 +90,15 @@ protected Bundle.Entry createEntry( Resource resource ) {
.url( Uri.of("/" + resource.getClass().getSimpleName()) )
.build();
}
// TODO - how to handle resources that do not already specify an ID?

if( resource.getMeta() != null ) {
resource = resource.toBuilder()
.meta(resource.getMeta().toBuilder()
.versionId(null)
.build())
.build();
}

return Bundle.Entry.builder()
.resource(resource)
.request(request)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
import com.ibm.fhir.model.resource.Patient;
import com.ibm.fhir.model.resource.Resource;
import com.ibm.fhir.model.type.HumanName;
import com.ibm.fhir.model.type.Id;
import com.ibm.fhir.model.type.Instant;
import com.ibm.fhir.model.type.Meta;
import com.ibm.fhir.model.type.UnsignedInt;
import com.ibm.fhir.model.type.code.BundleType;
import com.ibm.fhir.model.type.code.EncounterStatus;
Expand Down Expand Up @@ -62,14 +65,23 @@ public void testInstanceExecutionWithResources() throws Exception {
.build();

Encounter e = Encounter.builder()
//.id(UUID.randomUUID().toString())
.id(UUID.randomUUID().toString())
.meta(Meta.builder().versionId(Id.of("1")).lastUpdated(Instant.now()).build())
.status(EncounterStatus.FINISHED)
.subject( reference( p ) )
.clazz( coding("wellness") )
.build();

Encounter e2 = Encounter.builder()
.id(e.getId())
.meta(Meta.builder().versionId(Id.of("2")).lastUpdated(Instant.now()).build())
.status(EncounterStatus.FINISHED)
.subject( reference( p ) )
.clazz( coding("wellness") )
.build();

MeasureReport report = builder.build();
List<Resource> resources = Arrays.asList(p,e);
List<Resource> resources = Arrays.asList(p,e,e2);

runTest(report, resources);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static com.ibm.fhir.model.type.String.string;
import static org.testng.Assert.assertNotNull;

import java.io.InputStream;
import java.io.StringReader;

import javax.ws.rs.client.Entity;
Expand All @@ -20,15 +21,20 @@
import com.ibm.fhir.model.resource.Bundle;
import com.ibm.fhir.model.resource.Encounter;
import com.ibm.fhir.model.resource.MeasureReport;
import com.ibm.fhir.model.resource.OperationOutcome;
import com.ibm.fhir.model.resource.Parameters;
import com.ibm.fhir.model.resource.Parameters.Parameter;
import com.ibm.fhir.model.resource.Patient;
import com.ibm.fhir.model.test.TestUtil;
import com.ibm.fhir.model.type.Canonical;
import com.ibm.fhir.model.type.Code;
import com.ibm.fhir.model.type.Coding;
import com.ibm.fhir.model.type.Date;
import com.ibm.fhir.model.type.DateTime;
import com.ibm.fhir.model.type.HumanName;
import com.ibm.fhir.model.type.Id;
import com.ibm.fhir.model.type.Instant;
import com.ibm.fhir.model.type.Meta;
import com.ibm.fhir.model.type.Period;
import com.ibm.fhir.model.type.Reference;
import com.ibm.fhir.model.type.code.AdministrativeGender;
Expand Down Expand Up @@ -57,6 +63,7 @@ public void testMeasureSubmitDataResourceType() throws Exception {

Encounter encounter = Encounter.builder()
.id("submitdata-encounter")
.meta(Meta.builder().versionId(Id.of("1")).lastUpdated(Instant.now()).build())
.status(EncounterStatus.FINISHED)
.clazz(Coding.builder().code(Code.of("wellness")).build())
.subject( Reference.builder().reference(string("Patient/" + patient.getId())).build() )
Expand Down Expand Up @@ -87,4 +94,95 @@ public void testMeasureSubmitDataResourceType() throws Exception {
Bundle output = (Bundle) FHIRParser.parser(Format.JSON).parse(new StringReader(responseBody));
assertNotNull(output);
}

@Test
public void testMeasureSubmitDataResourceTypeDuplicateResourceID() throws Exception {
MeasureReport measureReport = MeasureReport.builder()
.id("submitdata-measure")
.measure( Canonical.of(TEST_MEASURE_URL) )
.status(MeasureReportStatus.COMPLETE)
.type(MeasureReportType.INDIVIDUAL)
.period(Period.builder().start(DateTime.of("2001-01-01")).end(DateTime.of("2001-01-01")).build())
.build();

Patient patient = Patient.builder()
.id("submitdata-patient")
.name(HumanName.builder().family(string("Machina")).given(string("Deus Ex")).build())
.birthDate(Date.of("1970-01-01"))
.gender(AdministrativeGender.OTHER)
.build();

Encounter encounter = Encounter.builder()
.id("submitdata-encounter")
.meta(Meta.builder().versionId(Id.of("1")).lastUpdated(Instant.now()).build())
.status(EncounterStatus.FINISHED)
.clazz(Coding.builder().code(Code.of("wellness")).build())
.subject( Reference.builder().reference(string("Patient/" + patient.getId())).build() )
.build();

Encounter encounter2 = Encounter.builder()
.id("submitdata-encounter")
.meta(Meta.builder().versionId(Id.of("2")).lastUpdated(Instant.now()).build())
.status(EncounterStatus.FINISHED)
.clazz(Coding.builder().code(Code.of("wellness")).build())
.subject( Reference.builder().reference(string("Patient/" + patient.getId())).build() )
.build();

Parameters parameters = Parameters.builder()
.parameter(Parameter.builder()
.name(string("measureReport"))
.resource(measureReport)
.build())
.parameter(Parameter.builder()
.name(string("resource"))
.resource(patient).build())
.parameter(Parameter.builder()
.name(string("resource"))
.resource(encounter).build())
.parameter(Parameter.builder()
.name(string("resource"))
.resource(encounter2).build())
.build();

Response response =
getWebTarget().path("/Measure/{id}/$submit-data")
.resolveTemplate("id", TEST_MEASURE_ID)
.request()
.post(Entity.json(parameters));
assertResponse(response, 409);

String responseBody = response.readEntity(String.class);
System.out.println(responseBody);
OperationOutcome output = (OperationOutcome) FHIRParser.parser(Format.JSON).parse(new StringReader(responseBody));
assertNotNull(output);
}

@Test
public void testMeasureSubmitDataOnlyMeasureReportTwice() throws Exception {
MeasureReport measureReport = null;
try( InputStream is = TestUtil.resolveFileLocation("testdata/MeasureReport-EXM104.json") ) {
measureReport = FHIRParser.parser(Format.JSON).parse(is);
}
Parameters parameters = Parameters.builder()
.parameter(Parameter.builder()
.name(string("measureReport"))
.resource(measureReport)
.build())
.build();

int numIterations = 2;
for( int i=0; i<numIterations; i++) {
Response response =
getWebTarget().path("/Measure/{id}/$submit-data")
.resolveTemplate("id", TEST_MEASURE_ID)
.request()
.post(Entity.json(parameters));
assertResponse(response, 200);

String responseBody = response.readEntity(String.class);
System.out.println(responseBody);
Bundle output = (Bundle) FHIRParser.parser(Format.JSON).parse(new StringReader(responseBody));
assertNotNull(output);
}
}
}
Loading

0 comments on commit 2a72d1d

Please sign in to comment.