From ec8c33e8c5afb23bae91771b8d0f6ac5b7805e81 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 27 Mar 2024 14:51:52 -0700 Subject: [PATCH 01/92] added method skeleton to extract fields --- .../etor/orders/Order.java | 10 ++++++++ .../etor/results/Result.java | 10 ++++++++ .../external/hapi/HapiOrder.java | 25 +++++++++++++++++++ .../external/hapi/HapiResult.java | 25 +++++++++++++++++++ 4 files changed, 70 insertions(+) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index cc13ec4f3..e08ab593c 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -11,4 +11,14 @@ public interface Order { String getFhirResourceId(); String getPatientId(); + + String getPlacerOrderNumber(); + + String getSendingApplicationId(); + + String getSendingFacilityId(); + + String getReceivingApplicationId(); + + String getReceivingFacilityId(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java index 00199924c..c15678f7a 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java @@ -9,4 +9,14 @@ public interface Result { T getUnderlyingResult(); String getFhirResourceId(); + + String getPlacerOrderNumber(); + + String getSendingApplicationId(); + + String getSendingFacilityId(); + + String getReceivingApplicationId(); + + String getReceivingFacilityId(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 883a3046d..7c07ed744 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -42,4 +42,29 @@ public String getPatientId() { .findFirst() .orElse(""); } + + @Override + public String getPlacerOrderNumber() { + return null; + } + + @Override + public String getSendingApplicationId() { + return null; + } + + @Override + public String getSendingFacilityId() { + return null; + } + + @Override + public String getReceivingApplicationId() { + return null; + } + + @Override + public String getReceivingFacilityId() { + return null; + } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 56b6cec0f..d2e64e16c 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -21,4 +21,29 @@ public Bundle getUnderlyingResult() { public String getFhirResourceId() { return innerResult.getId(); } + + @Override + public String getPlacerOrderNumber() { + return null; + } + + @Override + public String getSendingApplicationId() { + return null; + } + + @Override + public String getSendingFacilityId() { + return null; + } + + @Override + public String getReceivingApplicationId() { + return null; + } + + @Override + public String getReceivingFacilityId() { + return null; + } } From e3faffd896084a172dca1d55df84fce513e10f07 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 27 Mar 2024 15:17:49 -0700 Subject: [PATCH 02/92] all tests pass --- .../cdc/trustedintermediary/OrderMock.groovy | 25 +++++++++++++++++++ .../cdc/trustedintermediary/ResultMock.groovy | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 3ef6a9f0b..0ea25f2ce 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -31,4 +31,29 @@ class OrderMock implements Order { String getPatientId() { return patientId } + + @Override + String getPlacerOrderNumber() { + return null + } + + @Override + String getSendingApplicationId() { + return null + } + + @Override + String getSendingFacilityId() { + return null + } + + @Override + String getReceivingApplicationId() { + return null + } + + @Override + String getReceivingFacilityId() { + return null + } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index d925f02f3..3cadfb426 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -24,4 +24,29 @@ class ResultMock implements Result { String getFhirResourceId() { return fhirResourceId } + + @Override + String getPlacerOrderNumber() { + return null + } + + @Override + String getSendingApplicationId() { + return null + } + + @Override + String getSendingFacilityId() { + return null + } + + @Override + String getReceivingApplicationId() { + return null + } + + @Override + String getReceivingFacilityId() { + return null + } } From d07b9d4451c598cb0fe70bc44cc040393c93e633 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 27 Mar 2024 15:44:04 -0700 Subject: [PATCH 03/92] fields added to ResultMock, tests are passing --- .../cdc/trustedintermediary/ResultMock.groovy | 28 +++++++++++++------ .../etor/EtorDomainRegistrationTest.groovy | 2 +- .../etor/results/ResultResponseTest.groovy | 2 +- .../etor/results/SendResultUseCaseTest.groovy | 2 +- .../hapi/HapiResultConverterTest.groovy | 2 +- .../ReportStreamResultSenderTest.groovy | 2 +- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index 3cadfb426..d771f7674 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -9,44 +9,56 @@ class ResultMock implements Result { private String fhirResourceId private T underlyingResult + private String placerOrderNumber + private String sendingApplicationId + private String sendingFacilityId + private String receivingApplicationId + private String receivingFacilityId - ResultMock(String fhirResourceId, T underlyingResult) { + + ResultMock(String fhirResourceId, T underlyingResult, String placerOrderNumber, String sendingApplicationId, String sendingFacilityId, + String receivingApplicationId, String receivingFacilityId) { this.fhirResourceId = fhirResourceId this.underlyingResult = underlyingResult + this.placerOrderNumber = placerOrderNumber + this.sendingApplicationId = sendingApplicationId + this.sendingFacilityId = sendingFacilityId + this.receivingApplicationId = receivingApplicationId + this.receivingFacilityId = receivingFacilityId } @Override T getUnderlyingResult() { - return underlyingResult + return this.underlyingResult } @Override String getFhirResourceId() { - return fhirResourceId + return this.fhirResourceId } @Override String getPlacerOrderNumber() { - return null + return this.placerOrderNumber } @Override String getSendingApplicationId() { - return null + return this.sendingApplicationId } @Override String getSendingFacilityId() { - return null + return this.sendingFacilityId } @Override String getReceivingApplicationId() { - return null + return this.receivingApplicationId } @Override String getReceivingFacilityId() { - return null + return this.receivingFacilityId } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy index d8992342a..a71233cc8 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy @@ -197,7 +197,7 @@ class EtorDomainRegistrationTest extends Specification { def "handleResults happy path"() { given: - def resultMock = new ResultMock("resource id", "lab result") + def resultMock = new ResultMock("resource id", "lab result", null, null, null, null, null) def request = new DomainRequest(headers: ["recordid": "recordId"]) def connector = new EtorDomainRegistration() diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultResponseTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultResponseTest.groovy index 95cfbd048..e8ed53867 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultResponseTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultResponseTest.groovy @@ -18,7 +18,7 @@ class ResultResponseTest extends Specification { given: def expectedResourceId = "12345678" - def result = new ResultMock(expectedResourceId, null) + def result = new ResultMock(expectedResourceId, null, null, null, null, null, null) when: def actual = new ResultResponse(result) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/SendResultUseCaseTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/SendResultUseCaseTest.groovy index 2a961ac51..0e7430aff 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/SendResultUseCaseTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/SendResultUseCaseTest.groovy @@ -34,7 +34,7 @@ class SendResultUseCaseTest extends Specification { def "convertAndSend works"() { given: - def mockResult = new ResultMock(null, "Mock result") + def mockResult = new ResultMock(null, "Mock result", null, null, null, null, null) def receivedSubmissionId = "receivedId" when: diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy index a143d6631..c9cab4367 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy @@ -24,7 +24,7 @@ class HapiResultConverterTest extends Specification { mockPatient = new Patient() mockResultBundle = new Bundle().addEntry(new Bundle.BundleEntryComponent().setResource(mockPatient)) - mockResult = new ResultMock("mockFhirResourceId", mockResultBundle) + mockResult = new ResultMock("mockFhirResourceId", mockResultBundle, null, null, null, null, null) } def "add etor processing tag to messageHeader resource"() { diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSenderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSenderTest.groovy index c6428150d..29a8a6772 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSenderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSenderTest.groovy @@ -18,7 +18,7 @@ class ReportStreamResultSenderTest extends Specification { given: def fhirResourceId = null def underlyingResult = "Mock result" - def mockResult = new ResultMock(fhirResourceId, underlyingResult) + def mockResult = new ResultMock(fhirResourceId, underlyingResult, null, null, null, null, null) def senderHelper = Mock(ReportStreamSenderHelper) senderHelper.sendResultToReportStream(underlyingResult, fhirResourceId) >> Optional.of("fake-id") From 81baff306691a1be946750bf5d3a5b880dbb562d Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 27 Mar 2024 15:52:18 -0700 Subject: [PATCH 04/92] Added fields to OrderMock, tests are passing --- .../cdc/trustedintermediary/OrderMock.groovy | 27 +++++++++++++------ .../etor/EtorDomainRegistrationTest.groovy | 2 +- ...nvertAndSendDemographicsUsecaseTest.groovy | 2 +- .../etor/orders/OrderResponseTest.groovy | 2 +- .../etor/orders/SendOrderUseCaseTest.groovy | 2 +- .../hapi/HapiOrderConverterTest.groovy | 2 +- .../ReportStreamOrderSenderTest.groovy | 2 +- 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 0ea25f2ce..72cdeb457 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -10,21 +10,32 @@ class OrderMock implements Order { private String fhirResourceId private String patientId private T underlyingOrders + private String placerOrderNumber + private String sendingApplicationId + private String sendingFacilityId + private String receivingApplicationId + private String receivingFacilityId - OrderMock(String fhirResourceId, String patientId, T underlyingOrders) { + OrderMock(String fhirResourceId, String patientId, T underlyingOrders, String placerOrderNumber, String sendingApplicationId, String sendingFacilityId, + String receivingApplicationId, String receivingFacilityId) { this.fhirResourceId = fhirResourceId this.patientId = patientId this.underlyingOrders = underlyingOrders + this.placerOrderNumber = placerOrderNumber + this.sendingApplicationId = sendingApplicationId + this.sendingFacilityId = sendingFacilityId + this.receivingApplicationId = receivingApplicationId + this.receivingFacilityId = receivingFacilityId } @Override T getUnderlyingOrder() { - return underlyingOrders + return this.underlyingOrders } @Override String getFhirResourceId() { - return fhirResourceId + return this.fhirResourceId } @Override @@ -34,26 +45,26 @@ class OrderMock implements Order { @Override String getPlacerOrderNumber() { - return null + return this.placerOrderNumber } @Override String getSendingApplicationId() { - return null + return this.sendingApplicationId } @Override String getSendingFacilityId() { - return null + return this.sendingFacilityId } @Override String getReceivingApplicationId() { - return null + return this.receivingApplicationId } @Override String getReceivingFacilityId() { - return null + return this.receivingFacilityId } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy index a71233cc8..8d6f6d9e3 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistrationTest.groovy @@ -169,7 +169,7 @@ class EtorDomainRegistrationTest extends Specification { def "handleOrders happy path"() { given: - def orderMock = new OrderMock("resource id", "a patient ID", "orders") + def orderMock = new OrderMock("resource id", "a patient ID", "orders", null, null, null, null, null) def request = new DomainRequest(headers: ["recordid": "recordId"]) def connector = new EtorDomainRegistration() diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/ConvertAndSendDemographicsUsecaseTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/ConvertAndSendDemographicsUsecaseTest.groovy index c40ddb829..c1908bdbc 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/ConvertAndSendDemographicsUsecaseTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/ConvertAndSendDemographicsUsecaseTest.groovy @@ -18,7 +18,7 @@ class ConvertAndSendDemographicsUsecaseTest extends Specification { def "ConvertAndSend"() { given: - def mockOrder = new OrderMock(null, null, null) + def mockOrder = new OrderMock(null, null, null, null, null, null, null, null) def mockConverter = Mock(OrderConverter) def mockSender = Mock(OrderSender) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderResponseTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderResponseTest.groovy index 5f58494b0..6abfaf907 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderResponseTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderResponseTest.groovy @@ -19,7 +19,7 @@ class OrderResponseTest extends Specification { def expectedResourceId = "67890asdfg" def expectedPatientId = "fthgyu687" - def orders = new OrderMock(expectedResourceId, expectedPatientId, null) + def orders = new OrderMock(expectedResourceId, expectedPatientId, null, null, null, null, null, null) when: def actual = new OrderResponse(orders) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/SendOrderUseCaseTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/SendOrderUseCaseTest.groovy index 536956a72..28a77cfb9 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/SendOrderUseCaseTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/SendOrderUseCaseTest.groovy @@ -38,7 +38,7 @@ class SendOrderUseCaseTest extends Specification { def messageType = PartnerMetadataMessageType.ORDER def sendOrder = SendOrderUseCase.getInstance() - def mockOrder = new OrderMock(null, null, null) + def mockOrder = new OrderMock(null, null, null, null, null, null, null, null) def mockOmlOrder = Mock(Order) TestApplicationContext.injectRegisteredImplementations() diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy index 3c2a8d3a2..4910e03b7 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy @@ -44,7 +44,7 @@ class HapiOrderConverterTest extends Specification { mockDemographics = new DemographicsMock("fhirResourceId", "patientId", mockDemographicsBundle) mockOrderBundle = new Bundle().addEntry(new Bundle.BundleEntryComponent().setResource(mockPatient)) - mockOrder = new OrderMock("fhirResourceId", "patientId", mockOrderBundle) + mockOrder = new OrderMock("fhirResourceId", "patientId", mockOrderBundle, null, null, null, null, null) } def "the converter fills in gaps of any missing data in the Bundle"() { diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSenderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSenderTest.groovy index 803fdf685..a08cec1b9 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSenderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSenderTest.groovy @@ -23,7 +23,7 @@ class ReportStreamOrderSenderTest extends Specification { given: def fhirResourceId = null def underlyingOrder = "Mock order" - def mockOrder = new OrderMock(fhirResourceId, "patient-id", underlyingOrder) + def mockOrder = new OrderMock(fhirResourceId, "patient-id", underlyingOrder, null, null, null, null, null) def senderHelper = Mock(ReportStreamSenderHelper) senderHelper.sendOrderToReportStream(underlyingOrder, fhirResourceId) >> Optional.of("fake-id") From 927c0bfb2f814cce21eef10c3729aa85097ea873 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 27 Mar 2024 16:23:27 -0700 Subject: [PATCH 05/92] unit tests skeleton, ready for TDD --- .../external/hapi/HapiOrderTest.groovy | 90 +++++++++++++++++++ .../external/hapi/HapiResultTest.groovy | 90 +++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 96ed3d99d..0b580e558 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -64,4 +64,94 @@ class HapiOrderTest extends Specification { then: orders.getPatientId() == expectedPatientId } + + def "getPlacerOrderNumber works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getPlacerOrderNumber unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingApplicationId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingApplicationId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingFacilityId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingFacilityId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingApplicationId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingApplicationId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingFacilityId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingFacilityId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index f40ada0ba..1ef0260ee 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -28,4 +28,94 @@ class HapiResultTest extends Specification{ then: actualResult.getFhirResourceId() == expectId } + + def "getPlacerOrderNumber works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getPlacerOrderNumber unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingApplicationId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingApplicationId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingFacilityId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getSendingFacilityId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingApplicationId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingApplicationId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingFacilityId works"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } + + def "getReceivingFacilityId unhappy path"() { + given: + def expected = 1 + when: + def actual = 1 + then: + actual == expected + } } From 5354a1516f9da82a67b2a07c227b61af6a34caec Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 28 Mar 2024 10:28:00 -0700 Subject: [PATCH 06/92] getSendingApplicationId --- .../external/hapi/HapiOrder.java | 6 ++++- .../external/hapi/HapiOrderTest.groovy | 27 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 7c07ed744..e8e68f3cb 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -3,6 +3,7 @@ import gov.hhs.cdc.trustedintermediary.etor.orders.Order; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.MessageHeader; import org.hl7.fhir.r4.model.Patient; /** @@ -50,7 +51,10 @@ public String getPlacerOrderNumber() { @Override public String getSendingApplicationId() { - return null; + return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) + .map(header -> header.getSender().getIdentifier().getValue()) + .findFirst() + .orElse(""); } @Override diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 0b580e558..50db3ee89 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -4,7 +4,9 @@ import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Identifier +import org.hl7.fhir.r4.model.MessageHeader import org.hl7.fhir.r4.model.Patient +import org.hl7.fhir.r4.model.Reference import spock.lang.Specification class HapiOrderTest extends Specification { @@ -83,22 +85,31 @@ class HapiOrderTest extends Specification { actual == expected } - def "getSendingApplicationId works"() { + def "getSendingApplicationId happy path works"() { given: - def expected = 1 + def expectedApplicationId = "mock-application-id" + def messageHeader = new MessageHeader() + messageHeader.setSender(new Reference().setIdentifier(new Identifier().setValue(expectedApplicationId))) + def innerOrders = new Bundle() + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def orders = new HapiOrder(innerOrders) + when: - def actual = 1 + def actualApplicationId = orders.getSendingApplicationId() then: - actual == expected + actualApplicationId == expectedApplicationId } - def "getSendingApplicationId unhappy path"() { + def "getSendingApplicationId unhappy path works"() { given: - def expected = 1 + def expectedApplicationId = "" + def innerOrders = new Bundle() + def orders = new HapiOrder(innerOrders) + when: - def actual = 1 + def actualApplicationId = orders.getSendingApplicationId() then: - actual == expected + actualApplicationId == expectedApplicationId } def "getSendingFacilityId works"() { From a4a60cc5a1e2698efb0b3a8fb1be9f81d2b30779 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 28 Mar 2024 10:53:58 -0700 Subject: [PATCH 07/92] getSendingApplicationId final --- .../trustedintermediary/external/hapi/HapiOrder.java | 7 ++++++- .../external/hapi/HapiOrderTest.groovy | 11 +++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index e8e68f3cb..37d2ec62e 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -52,7 +52,12 @@ public String getPlacerOrderNumber() { @Override public String getSendingApplicationId() { return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) - .map(header -> header.getSender().getIdentifier().getValue()) + .flatMap(header -> header.getSource().getExtension().stream()) + .filter( + extension -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id" + .equals(extension.getUrl())) + .map(extension -> extension.getValue().toString()) .findFirst() .orElse(""); } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 50db3ee89..36140491c 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -3,10 +3,12 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding +import org.hl7.fhir.r4.model.Extension import org.hl7.fhir.r4.model.Identifier import org.hl7.fhir.r4.model.MessageHeader import org.hl7.fhir.r4.model.Patient import org.hl7.fhir.r4.model.Reference +import org.hl7.fhir.r4.model.StringType import spock.lang.Specification class HapiOrderTest extends Specification { @@ -88,11 +90,12 @@ class HapiOrderTest extends Specification { def "getSendingApplicationId happy path works"() { given: def expectedApplicationId = "mock-application-id" + def bundle = new Bundle() def messageHeader = new MessageHeader() - messageHeader.setSender(new Reference().setIdentifier(new Identifier().setValue(expectedApplicationId))) - def innerOrders = new Bundle() - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiOrder(innerOrders) + def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(expectedApplicationId)) + messageHeader.setSource(new MessageHeader.MessageSourceComponent().addExtension(extension)) + bundle.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def orders = new HapiOrder(bundle) when: def actualApplicationId = orders.getSendingApplicationId() From 869d7ef94e688ae82e7f5a149065617992b72874 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 28 Mar 2024 12:14:58 -0700 Subject: [PATCH 08/92] getSendingFacilityId --- .../external/hapi/HapiOrder.java | 29 +++++++++- .../external/hapi/HapiOrderTest.groovy | 57 +++++++++++++------ 2 files changed, 69 insertions(+), 17 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 37d2ec62e..03e4baf30 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -1,10 +1,13 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; import gov.hhs.cdc.trustedintermediary.etor.orders.Order; +import java.util.Objects; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.MessageHeader; +import org.hl7.fhir.r4.model.Organization; import org.hl7.fhir.r4.model.Patient; +import org.hl7.fhir.r4.model.Reference; /** * A concrete implementation of a {@link Order} that uses the Hapi FHIR bundle as its underlying @@ -64,7 +67,31 @@ public String getSendingApplicationId() { @Override public String getSendingFacilityId() { - return null; + String organizationReference = + HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) + .map(MessageHeader::getSender) + .filter(Objects::nonNull) + .map(Reference::getReference) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + + if (organizationReference == null || organizationReference.isEmpty()) { + return ""; + } + + // Extract from Organization/{id} + String orgId = + organizationReference.contains("/") + ? organizationReference.split("/")[1] + : organizationReference; + + // Get the corresponding Organization resource in the Bundle by ID + return HapiHelper.resourcesInBundle(innerOrder, Organization.class) + .filter(org -> orgId.equals(org.getIdElement().getIdPart())) + .map(Organization::getName) // This gives the organization's name as the ID + .findFirst() + .orElse(""); } @Override diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 36140491c..b5935730e 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -1,5 +1,6 @@ package gov.hhs.cdc.trustedintermediary.external.hapi +import gov.hhs.cdc.trustedintermediary.organizations.Organization import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding @@ -11,6 +12,8 @@ import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.StringType import spock.lang.Specification +import java.sql.Ref + class HapiOrderTest extends Specification { def "getUnderlyingOrder Works"() { given: @@ -90,15 +93,16 @@ class HapiOrderTest extends Specification { def "getSendingApplicationId happy path works"() { given: def expectedApplicationId = "mock-application-id" - def bundle = new Bundle() + def innerOrders = new Bundle() def messageHeader = new MessageHeader() def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(expectedApplicationId)) - messageHeader.setSource(new MessageHeader.MessageSourceComponent().addExtension(extension)) - bundle.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiOrder(bundle) + messageHeader.setSource(new MessageHeader.MessageSourceComponent().addExtension(extension) as MessageHeader.MessageSourceComponent) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def orders = new HapiOrder(innerOrders) when: def actualApplicationId = orders.getSendingApplicationId() + then: actualApplicationId == expectedApplicationId } @@ -115,25 +119,46 @@ class HapiOrderTest extends Specification { actualApplicationId == expectedApplicationId } - def "getSendingFacilityId works"() { + def "getSendingFacilityId happy path works"() { given: - def expected = 1 + def expectedFacilityId = "mock-facility-id" + def innerOrders = new Bundle() + + def messageHeader = new MessageHeader() + messageHeader.setSender(new Reference("Organization/mock-id")) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + + def organization = new org.hl7.fhir.r4.model.Organization() + organization.setId("mock-id") + organization.setName(expectedFacilityId) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + + def orders = new HapiOrder(innerOrders) + when: - def actual = 1 + def actualFacilityId = orders.getSendingFacilityId() + then: - actual == expected + actualFacilityId == expectedFacilityId } - def "getSendingFacilityId unhappy path"() { + def "getSendingFacilityId unhappy path works"() { given: - def expected = 1 + def innerOrders = new Bundle() + def expectedFacilityId = "" + def messageHeader = new MessageHeader() + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + + def orders = new HapiOrder(innerOrders) + when: - def actual = 1 + def actualFacilityId = orders.getSendingFacilityId() + then: - actual == expected + actualFacilityId == expectedFacilityId } - def "getReceivingApplicationId works"() { + def "getReceivingApplicationId happy path works"() { given: def expected = 1 when: @@ -142,7 +167,7 @@ class HapiOrderTest extends Specification { actual == expected } - def "getReceivingApplicationId unhappy path"() { + def "getReceivingApplicationId unhappy path works"() { given: def expected = 1 when: @@ -151,7 +176,7 @@ class HapiOrderTest extends Specification { actual == expected } - def "getReceivingFacilityId works"() { + def "getReceivingFacilityId happy path works"() { given: def expected = 1 when: @@ -160,7 +185,7 @@ class HapiOrderTest extends Specification { actual == expected } - def "getReceivingFacilityId unhappy path"() { + def "getReceivingFacilityId unhappy path works"() { given: def expected = 1 when: From 79d4ad8fa26a5b8b0c1312cc2aefddf78532a559 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Thu, 28 Mar 2024 16:02:55 -0500 Subject: [PATCH 09/92] Add Place Order Number to HapiResult --- .../external/hapi/HapiResult.java | 15 +++++++++++++- .../external/hapi/HapiResultTest.groovy | 20 ++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index d2e64e16c..6fae4b77d 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -2,6 +2,8 @@ import gov.hhs.cdc.trustedintermediary.etor.results.Result; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.ServiceRequest; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ public class HapiResult implements Result { @@ -24,7 +26,18 @@ public String getFhirResourceId() { @Override public String getPlacerOrderNumber() { - return null; + return HapiHelper.resourcesInBundle(innerResult, ServiceRequest.class) + .flatMap(serviceRequest -> serviceRequest.getIdentifier().stream()) + .filter( + identifier -> + identifier + .getType() + .hasCoding( + "http://terminology.hl7.org/CodeSystem/v2-0203", + "PLAC")) + .map(Identifier::getValue) + .findFirst() + .orElse(""); } @Override diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 1ef0260ee..3fe1f8a85 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -1,6 +1,12 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import org.hl7.fhir.r4.model.Bundle +import org.hl7.fhir.r4.model.CodeableConcept +import org.hl7.fhir.r4.model.Coding +import org.hl7.fhir.r4.model.Extension +import org.hl7.fhir.r4.model.Identifier +import org.hl7.fhir.r4.model.ServiceRequest +import org.hl7.fhir.r4.model.StringType import spock.lang.Specification class HapiResultTest extends Specification{ @@ -31,11 +37,19 @@ class HapiResultTest extends Specification{ def "getPlacerOrderNumber works"() { given: - def expected = 1 + def expectedPlacerOrderNumber = "mock-placer-order-number" + def bundle = new Bundle() + def serviceRequest = new ServiceRequest().addIdentifier(new Identifier() + .setValue(expectedPlacerOrderNumber) + .setType(new CodeableConcept().addCoding(new Coding("http://terminology.hl7.org/CodeSystem/v2-0203", "PLAC", "Placer Identifier")))) + bundle.addEntry(new Bundle.BundleEntryComponent().setResource(serviceRequest)) + def result = new HapiResult(bundle) + when: - def actual = 1 + def actualPlacerOrderNumber = result.getPlacerOrderNumber() + then: - actual == expected + actualPlacerOrderNumber == expectedPlacerOrderNumber } def "getPlacerOrderNumber unhappy path"() { From d37b363a1f3e833ad887ca027e6a4871196cf42d Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Thu, 28 Mar 2024 16:20:39 -0500 Subject: [PATCH 10/92] Add SendingApplicationId to HapiResult --- .../external/hapi/HapiResult.java | 11 +++++- .../external/hapi/HapiResultTest.groovy | 35 ++++++++++++++----- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 6fae4b77d..1d80bd9cc 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -3,6 +3,7 @@ import gov.hhs.cdc.trustedintermediary.etor.results.Result; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.MessageHeader; import org.hl7.fhir.r4.model.ServiceRequest; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ @@ -42,7 +43,15 @@ public String getPlacerOrderNumber() { @Override public String getSendingApplicationId() { - return null; + return HapiHelper.resourcesInBundle(innerResult, MessageHeader.class) + .flatMap(header -> header.getSource().getExtension().stream()) + .filter( + extension -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id" + .equals(extension.getUrl())) + .map(extension -> extension.getValue().toString()) + .findFirst() + .orElse(""); } @Override diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 3fe1f8a85..caa12e0d0 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -5,6 +5,7 @@ import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Extension import org.hl7.fhir.r4.model.Identifier +import org.hl7.fhir.r4.model.MessageHeader import org.hl7.fhir.r4.model.ServiceRequest import org.hl7.fhir.r4.model.StringType import spock.lang.Specification @@ -54,29 +55,45 @@ class HapiResultTest extends Specification{ def "getPlacerOrderNumber unhappy path"() { given: - def expected = 1 + def expectedPlacerOrderNumber = "" + def bundle = new Bundle() + def result = new HapiResult(bundle) + when: - def actual = 1 + def actualPlacerOrderNumber = result.getPlacerOrderNumber() + then: - actual == expected + actualPlacerOrderNumber == expectedPlacerOrderNumber } def "getSendingApplicationId works"() { given: - def expected = 1 + def expectedSendingApplicationId = "mock-sending-application-id" + def bundle = new Bundle() + def messageHeader = new MessageHeader() + def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(expectedSendingApplicationId)) + messageHeader.setSource(new MessageHeader.MessageSourceComponent().addExtension(extension) as MessageHeader.MessageSourceComponent) + bundle.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def result = new HapiResult(bundle) + when: - def actual = 1 + def actualSendingApplicationId = result.getSendingApplicationId() + then: - actual == expected + actualSendingApplicationId == expectedSendingApplicationId } def "getSendingApplicationId unhappy path"() { given: - def expected = 1 + def expectedSendingApplicationId = "" + def bundle = new Bundle() + def result = new HapiResult(bundle) + when: - def actual = 1 + def actualSendingApplicationId = result.getSendingApplicationId() + then: - actual == expected + actualSendingApplicationId == expectedSendingApplicationId } def "getSendingFacilityId works"() { From aae14a41bf192b11a33b9713dd7fc3f15e6485f5 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 28 Mar 2024 19:14:09 -0700 Subject: [PATCH 11/92] getReceivingApplicationId --- .../external/hapi/HapiOrder.java | 7 +++++- .../external/hapi/HapiOrderTest.groovy | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 03e4baf30..c2a92f292 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -96,7 +96,12 @@ public String getSendingFacilityId() { @Override public String getReceivingApplicationId() { - return null; + return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) + .flatMap(header -> header.getDestination().stream()) + .map(MessageHeader.MessageDestinationComponent::getEndpoint) + .filter(Objects::nonNull) + .findFirst() + .orElse(""); } @Override diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index b5935730e..774007c0e 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -160,20 +160,32 @@ class HapiOrderTest extends Specification { def "getReceivingApplicationId happy path works"() { given: - def expected = 1 + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def destination = new MessageHeader.MessageDestinationComponent() + def expectedApplicationId = "mock-application-id" + + destination.setEndpoint(expectedApplicationId) + messageHeader.setDestination([destination]) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def orders = new HapiOrder(innerOrders) + when: - def actual = 1 + def actualApplicationId = orders.getReceivingApplicationId() then: - actual == expected + actualApplicationId == expectedApplicationId } def "getReceivingApplicationId unhappy path works"() { given: - def expected = 1 + def innerOrders = new Bundle() + def orders = new HapiOrder(innerOrders) + def expectedApplicationId = "" + when: - def actual = 1 + def actualApplicationId = orders.getReceivingApplicationId() then: - actual == expected + actualApplicationId == expectedApplicationId } def "getReceivingFacilityId happy path works"() { From 3b1d269bc0f888a7adc564036a8413034312f799 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 28 Mar 2024 20:58:39 -0700 Subject: [PATCH 12/92] getReceivingApplicationId -> getReceivingApplicationDetails --- .../etor/orders/Order.java | 2 +- .../external/hapi/HapiOrder.java | 39 +++++++++++++++++-- .../cdc/trustedintermediary/OrderMock.groovy | 2 +- .../external/hapi/HapiOrderTest.groovy | 31 ++++++++------- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index e08ab593c..5ddd374d1 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -18,7 +18,7 @@ public interface Order { String getSendingFacilityId(); - String getReceivingApplicationId(); + String getReceivingApplicationDetails(); String getReceivingFacilityId(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index c2a92f292..75f03398e 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -1,7 +1,9 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; import gov.hhs.cdc.trustedintermediary.etor.orders.Order; +import java.util.Arrays; import java.util.Objects; +import java.util.stream.Collectors; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.MessageHeader; @@ -95,12 +97,37 @@ public String getSendingFacilityId() { } @Override - public String getReceivingApplicationId() { + public String getReceivingApplicationDetails() { return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) - .flatMap(header -> header.getDestination().stream()) - .map(MessageHeader.MessageDestinationComponent::getEndpoint) .filter(Objects::nonNull) .findFirst() + .flatMap( + messageHeader -> + messageHeader.getDestination().stream() + .filter(Objects::nonNull) + .findFirst()) + .map( + destination -> { + // Direct extraction and concatenation, with null checks integrated into + // the stream. + String name = Objects.toString(destination.getName(), ""); + String endpoint = Objects.toString(destination.getEndpoint(), ""); + String universalIdType = + destination.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + Objects.toString( + ext.getValue().primitiveValue(), + "")) + .orElse(""); + + return concatenateWithCaret(name, endpoint, universalIdType); + }) .orElse(""); } @@ -108,4 +135,10 @@ public String getReceivingApplicationId() { public String getReceivingFacilityId() { return null; } + + private String concatenateWithCaret(String... values) { + return Arrays.stream(values) + .filter(Objects::nonNull) // Ensure null values are ignored + .collect(Collectors.joining("^")); + } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 72cdeb457..f380b2898 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -59,7 +59,7 @@ class OrderMock implements Order { } @Override - String getReceivingApplicationId() { + String getReceivingApplicationDetails() { return this.receivingApplicationId } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 774007c0e..d1027be3b 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -1,6 +1,6 @@ package gov.hhs.cdc.trustedintermediary.external.hapi -import gov.hhs.cdc.trustedintermediary.organizations.Organization + import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding @@ -12,8 +12,6 @@ import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.StringType import spock.lang.Specification -import java.sql.Ref - class HapiOrderTest extends Specification { def "getUnderlyingOrder Works"() { given: @@ -158,34 +156,41 @@ class HapiOrderTest extends Specification { actualFacilityId == expectedFacilityId } - def "getReceivingApplicationId happy path works"() { + def "getReceivingApplicationDetails happy path works"() { given: def innerOrders = new Bundle() def messageHeader = new MessageHeader() def destination = new MessageHeader.MessageDestinationComponent() - def expectedApplicationId = "mock-application-id" - - destination.setEndpoint(expectedApplicationId) + def endpoint = "urn:oid:1.2.840.114350.1.13.145.2.7.2.695071" + def name = "Epic" + def universalIdType = "ISO" + def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + def expectedApplicationDetails = "$name^$endpoint^$universalIdType" + + destination.setName(name) + destination.setEndpoint(endpoint) + destination.addExtension(extension) messageHeader.setDestination([destination]) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) when: - def actualApplicationId = orders.getReceivingApplicationId() + def actualApplicationDetails = orders.getReceivingApplicationDetails() + then: - actualApplicationId == expectedApplicationId + actualApplicationDetails == expectedApplicationDetails } - def "getReceivingApplicationId unhappy path works"() { + def "getReceivingApplicationDetails unhappy path works"() { given: def innerOrders = new Bundle() def orders = new HapiOrder(innerOrders) - def expectedApplicationId = "" + def expectedApplicationDetails = "" when: - def actualApplicationId = orders.getReceivingApplicationId() + def actualApplicationDetails = orders.getReceivingApplicationDetails() then: - actualApplicationId == expectedApplicationId + actualApplicationDetails == expectedApplicationDetails } def "getReceivingFacilityId happy path works"() { From 2519d4d4fb9116e388627e513c3c8b54b0f69627 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 28 Mar 2024 22:08:36 -0700 Subject: [PATCH 13/92] getSendingApplicationid -> getSendingApplicationDetails --- .../etor/orders/Order.java | 2 +- .../external/hapi/HapiOrder.java | 39 +++++++++++++++---- .../cdc/trustedintermediary/OrderMock.groovy | 2 +- .../external/hapi/HapiOrderTest.groovy | 36 +++++++++++------ 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index 5ddd374d1..6bf69e449 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -14,7 +14,7 @@ public interface Order { String getPlacerOrderNumber(); - String getSendingApplicationId(); + String getSendingApplicationDetails(); String getSendingFacilityId(); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 75f03398e..0daa32e27 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -5,6 +5,7 @@ import java.util.Objects; import java.util.stream.Collectors; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Extension; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.MessageHeader; import org.hl7.fhir.r4.model.Organization; @@ -55,15 +56,39 @@ public String getPlacerOrderNumber() { } @Override - public String getSendingApplicationId() { + public String getSendingApplicationDetails() { return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) - .flatMap(header -> header.getSource().getExtension().stream()) - .filter( - extension -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id" - .equals(extension.getUrl())) - .map(extension -> extension.getValue().toString()) + .filter(Objects::nonNull) .findFirst() + .map( + messageHeader -> { + String namespaceId = null; + String universalId = null; + String universalIdType = null; + String endpoint = messageHeader.getSource().getEndpoint(); + + for (Extension extension : messageHeader.getSource().getExtension()) { + if ("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id" + .equals(extension.getUrl())) { + namespaceId = + Objects.toString( + extension.getValue().primitiveValue(), ""); + } else if ("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id" + .equals(extension.getUrl())) { + universalId = + Objects.toString( + extension.getValue().primitiveValue(), ""); + } else if ("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type" + .equals(extension.getUrl())) { + universalIdType = + Objects.toString( + extension.getValue().primitiveValue(), ""); + } + } + + return concatenateWithCaret( + namespaceId, universalId, universalIdType, endpoint); + }) .orElse(""); } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index f380b2898..122f8337f 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -49,7 +49,7 @@ class OrderMock implements Order { } @Override - String getSendingApplicationId() { + String getSendingApplicationDetails() { return this.sendingApplicationId } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index d1027be3b..1c7febc85 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -7,9 +7,11 @@ import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Extension import org.hl7.fhir.r4.model.Identifier import org.hl7.fhir.r4.model.MessageHeader +import org.hl7.fhir.r4.model.Organization import org.hl7.fhir.r4.model.Patient import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.StringType +import org.hl7.fhir.r4.model.UrlType import spock.lang.Specification class HapiOrderTest extends Specification { @@ -88,33 +90,45 @@ class HapiOrderTest extends Specification { actual == expected } - def "getSendingApplicationId happy path works"() { + def "getSendingApplicationDetails happy path works"() { given: - def expectedApplicationId = "mock-application-id" + def nameSpaceId = "Natus" def innerOrders = new Bundle() def messageHeader = new MessageHeader() - def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(expectedApplicationId)) - messageHeader.setSource(new MessageHeader.MessageSourceComponent().addExtension(extension) as MessageHeader.MessageSourceComponent) + def endpoint = "urn:dns:natus.health.state.mn.us" + messageHeader.setSource(new MessageHeader.MessageSourceComponent(new UrlType(endpoint))) + def nameSpaceIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(nameSpaceId)) + messageHeader.getSource().addExtension(nameSpaceIdExtension) + def universalId = "natus.health.state.mn.us" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + messageHeader.getSource().addExtension(universalIdExtension) + def universalIdType = "DNS" + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + messageHeader.getSource().addExtension(universalIdTypeExtension) + def expectedApplicationDetails = "$nameSpaceId^$universalId^$universalIdType^$endpoint" + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) when: - def actualApplicationId = orders.getSendingApplicationId() + def actualApplicationDetails = orders.getSendingApplicationDetails() then: - actualApplicationId == expectedApplicationId + actualApplicationDetails == expectedApplicationDetails } - def "getSendingApplicationId unhappy path works"() { + def "getSendingApplicationDetails unhappy path works"() { given: - def expectedApplicationId = "" + def expectedApplicationDetails = "" def innerOrders = new Bundle() + MessageHeader messageHeader = new MessageHeader() + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) when: - def actualApplicationId = orders.getSendingApplicationId() + def actualApplicationDetails = orders.getSendingApplicationDetails() then: - actualApplicationId == expectedApplicationId + actualApplicationDetails == expectedApplicationDetails } def "getSendingFacilityId happy path works"() { @@ -126,7 +140,7 @@ class HapiOrderTest extends Specification { messageHeader.setSender(new Reference("Organization/mock-id")) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def organization = new org.hl7.fhir.r4.model.Organization() + def organization = new Organization() organization.setId("mock-id") organization.setName(expectedFacilityId) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) From f848e30f5324b9f8648578da8cc684290e067527 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 29 Mar 2024 01:00:10 -0700 Subject: [PATCH 14/92] receivingApplicationDetails full extraction --- .../etor/orders/Order.java | 2 +- .../external/hapi/HapiOrder.java | 64 +++++++++++++++++-- .../cdc/trustedintermediary/OrderMock.groovy | 2 +- .../external/hapi/HapiOrderTest.groovy | 55 +++++++++++----- 4 files changed, 97 insertions(+), 26 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index 6bf69e449..11c334edc 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -16,7 +16,7 @@ public interface Order { String getSendingApplicationDetails(); - String getSendingFacilityId(); + String getSendingFacilityDetails(); String getReceivingApplicationDetails(); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 0daa32e27..81d8eb735 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -11,6 +11,7 @@ import org.hl7.fhir.r4.model.Organization; import org.hl7.fhir.r4.model.Patient; import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.StringType; /** * A concrete implementation of a {@link Order} that uses the Hapi FHIR bundle as its underlying @@ -93,7 +94,7 @@ public String getSendingApplicationDetails() { } @Override - public String getSendingFacilityId() { + public String getSendingFacilityDetails() { String organizationReference = HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) .map(MessageHeader::getSender) @@ -113,11 +114,50 @@ public String getSendingFacilityId() { ? organizationReference.split("/")[1] : organizationReference; - // Get the corresponding Organization resource in the Bundle by ID return HapiHelper.resourcesInBundle(innerOrder, Organization.class) .filter(org -> orgId.equals(org.getIdElement().getIdPart())) - .map(Organization::getName) // This gives the organization's name as the ID .findFirst() + .map( + org -> { + String facilityName = "", identifierValue = "", typeCode = ""; + + for (Identifier identifier : org.getIdentifier()) { + String extensionValue = + identifier.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + ((StringType) ext.getValue()) + .getValue()) + .orElse(""); + + // HD.1: namespace id + if ("HD.1".equals(extensionValue)) { + facilityName = identifier.getValue(); + } else if ("HD.2,HD.3".equals(extensionValue)) { + identifierValue = identifier.getValue(); + // HD.2: universal Id, HD.3: universal id type + typeCode = + identifier.getType() != null + && !identifier + .getType() + .getCoding() + .isEmpty() + ? identifier + .getType() + .getCoding() + .get(0) + .getCode() + : ""; + } + } + + return concatenateWithCaret(facilityName, identifierValue, typeCode); + }) .orElse(""); } @@ -133,10 +173,20 @@ public String getReceivingApplicationDetails() { .findFirst()) .map( destination -> { - // Direct extraction and concatenation, with null checks integrated into - // the stream. String name = Objects.toString(destination.getName(), ""); - String endpoint = Objects.toString(destination.getEndpoint(), ""); + String universalId = + destination.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + Objects.toString( + ext.getValue().primitiveValue(), + "")) + .orElse(""); String universalIdType = destination.getExtension().stream() .filter( @@ -151,7 +201,7 @@ public String getReceivingApplicationDetails() { "")) .orElse(""); - return concatenateWithCaret(name, endpoint, universalIdType); + return concatenateWithCaret(name, universalId, universalIdType); }) .orElse(""); } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 122f8337f..769442256 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -54,7 +54,7 @@ class OrderMock implements Order { } @Override - String getSendingFacilityId() { + String getSendingFacilityDetails() { return this.sendingFacilityId } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 1c7febc85..df811fac3 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -131,43 +131,63 @@ class HapiOrderTest extends Specification { actualApplicationDetails == expectedApplicationDetails } - def "getSendingFacilityId happy path works"() { + def "getSendingFacilityDetails happy path works"() { given: - def expectedFacilityId = "mock-facility-id" def innerOrders = new Bundle() def messageHeader = new MessageHeader() - messageHeader.setSender(new Reference("Organization/mock-id")) + def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" + messageHeader.setSender(new Reference(orgReference)) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def organization = new Organization() - organization.setId("mock-id") - organization.setName(expectedFacilityId) + organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") + // facility name + def facilityIdentifier = new Identifier() + def facilityName = "MN Public Health Lab" + def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + facilityIdentifier.addExtension(facilityNameExtension) + facilityIdentifier.setValue(facilityName) + // universal id + def universalIdIdentifier = new Identifier() + def universalIdIdentifierValue = "2.16.840.1.114222.4.1.10080" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + universalIdIdentifier.addExtension(universalIdExtension) + universalIdIdentifier.setValue(universalIdIdentifierValue) + // Type + def typeConcept = new CodeableConcept() + def theCode = "ISO" + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", theCode, null) + typeConcept.addCoding(coding) + universalIdIdentifier.setType(typeConcept) + + organization.addIdentifier(facilityIdentifier) + organization.addIdentifier(universalIdIdentifier) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) - def orders = new HapiOrder(innerOrders) + def expectedFacilityDetails = "$facilityName^$universalIdIdentifierValue^$theCode" when: - def actualFacilityId = orders.getSendingFacilityId() + def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityId == expectedFacilityId + actualFacilityDetails == expectedFacilityDetails } - def "getSendingFacilityId unhappy path works"() { + def "getSendingFacilityDetails unhappy path works"() { given: def innerOrders = new Bundle() - def expectedFacilityId = "" + def expectedFacilityDetails = "" def messageHeader = new MessageHeader() innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) when: - def actualFacilityId = orders.getSendingFacilityId() + def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityId == expectedFacilityId + actualFacilityDetails == expectedFacilityDetails } def "getReceivingApplicationDetails happy path works"() { @@ -175,15 +195,16 @@ class HapiOrderTest extends Specification { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def destination = new MessageHeader.MessageDestinationComponent() - def endpoint = "urn:oid:1.2.840.114350.1.13.145.2.7.2.695071" + def universalId = "1.2.840.114350.1.13.145.2.7.2.695071" def name = "Epic" def universalIdType = "ISO" - def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) - def expectedApplicationDetails = "$name^$endpoint^$universalIdType" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + def expectedApplicationDetails = "$name^$universalId^$universalIdType" destination.setName(name) - destination.setEndpoint(endpoint) - destination.addExtension(extension) + destination.addExtension(universalIdExtension) + destination.addExtension(universalIdTypeExtension) messageHeader.setDestination([destination]) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) From 46b2ddb6082a780648df58c3b3a26c0912ea3759 Mon Sep 17 00:00:00 2001 From: James Herr Date: Fri, 29 Mar 2024 12:18:37 -0500 Subject: [PATCH 15/92] Added OrderNumber extract --- .../external/hapi/HapiOrder.java | 13 +++++++++- .../external/hapi/HapiOrderTest.groovy | 25 ++++++++++++++----- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 81d8eb735..6566d159f 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -53,7 +53,18 @@ public String getPatientId() { @Override public String getPlacerOrderNumber() { - return null; + return HapiHelper.resourcesInBundle(innerOrder, ServiceRequest.class) + .flatMap(serviceRequest -> serviceRequest.getIdentifier().stream()) + .filter( + identifier -> + identifier + .getType() + .hasCoding( + "http://terminology.hl7.org/CodeSystem/v2-0203", + "PLAC")) + .map(Identifier::getValue) + .findFirst() + .orElse(""); } @Override diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index df811fac3..bece06d8f 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -10,6 +10,7 @@ import org.hl7.fhir.r4.model.MessageHeader import org.hl7.fhir.r4.model.Organization import org.hl7.fhir.r4.model.Patient import org.hl7.fhir.r4.model.Reference +import org.hl7.fhir.r4.model.ServiceRequest import org.hl7.fhir.r4.model.StringType import org.hl7.fhir.r4.model.UrlType import spock.lang.Specification @@ -74,20 +75,32 @@ class HapiOrderTest extends Specification { def "getPlacerOrderNumber works"() { given: - def expected = 1 + def expectedPlacerOrderNumber = "mock-placer-order-number" + def bundle = new Bundle() + def serviceRequest = new ServiceRequest().addIdentifier(new Identifier() + .setValue(expectedPlacerOrderNumber) + .setType(new CodeableConcept().addCoding(new Coding("http://terminology.hl7.org/CodeSystem/v2-0203", "PLAC", "Placer Identifier")))) + bundle.addEntry(new Bundle.BundleEntryComponent().setResource(serviceRequest)) + def order = new HapiOrder(bundle) + when: - def actual = 1 + def actualPlacerOrderNumber = order.getPlacerOrderNumber() + then: - actual == expected + actualPlacerOrderNumber == expectedPlacerOrderNumber } def "getPlacerOrderNumber unhappy path"() { given: - def expected = 1 + def innerOrders = new Bundle() + def orders = new HapiOrder(innerOrders) + def expectedPlacerOrderNumber = "" + when: - def actual = 1 + def actualPlacerOrderNumber = orders.getPlacerOrderNumber() + then: - actual == expected + actualPlacerOrderNumber == expectedPlacerOrderNumber } def "getSendingApplicationDetails happy path works"() { From 7d1aee8b2e5478ae9c4bc57a83cd5cf35a56cd3d Mon Sep 17 00:00:00 2001 From: James Herr Date: Fri, 29 Mar 2024 12:54:53 -0500 Subject: [PATCH 16/92] Added missing import --- .../gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 6566d159f..01340f913 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -11,6 +11,7 @@ import org.hl7.fhir.r4.model.Organization; import org.hl7.fhir.r4.model.Patient; import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; import org.hl7.fhir.r4.model.StringType; /** From f6fc76cea05319935231348dfd6640dfc8fdb093 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sat, 30 Mar 2024 23:57:32 -0700 Subject: [PATCH 17/92] messageDetails pojo --- .../etor/messages/MessageDetails.java | 48 +++++++++++++++ .../etor/messages/MessageDetailsTest.groovy | 59 +++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java create mode 100644 etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java new file mode 100644 index 000000000..b323ba9d1 --- /dev/null +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java @@ -0,0 +1,48 @@ +package gov.hhs.cdc.trustedintermediary.etor.messages; + +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class MessageDetails { + private String namespace; + private String universalId; + private String universalIdType; + + public MessageDetails(String namespace, String universalId, String universalIdType) { + this.namespace = namespace; + this.universalId = universalId; + this.universalIdType = universalIdType; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getUniversalId() { + return universalId; + } + + public void setUniversalId(String universalId) { + this.universalId = universalId; + } + + public String getUniversalIdType() { + return universalIdType; + } + + public void setUniversalIdType(String universalIdType) { + this.universalIdType = universalIdType; + } + + @Override + public String toString() { + return Stream.of(this.namespace, this.universalId, this.universalIdType) + .filter(Objects::nonNull) + .collect(Collectors.joining("^")); + } +} diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy new file mode 100644 index 000000000..a39dcd220 --- /dev/null +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy @@ -0,0 +1,59 @@ +package gov.hhs.cdc.trustedintermediary.etor.messages + +import gov.hhs.cdc.trustedintermediary.PojoTestUtils +import spock.lang.Specification + +class MessageDetailsTest extends Specification { + def "test getters and setters"() { + when: + PojoTestUtils.validateGettersAndSetters(MessageDetails) + + then: + noExceptionThrown() + } + + def "toString() happy path works"() { + given: + def namespace = "mock-namespace" + def universalId = "mock-universal-id" + def universalIdType = "mock-universal-id-type" + def expected = "${namespace}^${universalId}^${universalIdType}" + + when: + def messageDetails = new MessageDetails(namespace, universalId, universalIdType) + def actual = messageDetails.toString() + + then: + actual == expected + } + + def "toString() with null variable unhappy path works"() { + given: + def namespace = "mock-namespace" + def universalId = null + def universalIdType = "mock-universal-id-type" + def expected = "${namespace}^${universalIdType}" + + when: + def messageDetails = new MessageDetails(namespace, universalId, universalIdType) + def actual = messageDetails.toString() + + then: + actual == expected + } + + def "toString() with all null variables unhappy path works"() { + given: + def namespace = null + def universalId = null + def universalIdType = null + def expected = "" + + when: + def messageDetails = new MessageDetails(namespace, universalId, universalIdType) + def actual = messageDetails.toString() + + then: + actual == expected + } +} From 9b8e7c8639648ee2149a3d155473adab60c84b4f Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sun, 31 Mar 2024 22:12:43 -0700 Subject: [PATCH 18/92] javadocs for pojo --- .../trustedintermediary/etor/messages/MessageDetails.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java index b323ba9d1..91b359d96 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java @@ -4,6 +4,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +/** + * This class represents the result of evaluating a FHIRPath expression, encapsulating specific + * details extracted from a FHIR resource. This class holds values for namespace, universal + * identifier (ID), and the type of the universal ID, providing a mechanism to output these details + * in a concatenated string format. + */ public class MessageDetails { private String namespace; private String universalId; From 7b15ad12eb60e5e610dc909002792ed6f3175fd1 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sun, 31 Mar 2024 22:45:27 -0700 Subject: [PATCH 19/92] getStringFromFhirPath() --- .../external/hapi/HapiFhirImplementation.java | 7 +++++++ .../gov/hhs/cdc/trustedintermediary/wrappers/HapiFhir.java | 2 ++ 2 files changed, 9 insertions(+) diff --git a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java index 09ed6b310..84caa337a 100644 --- a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java +++ b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java @@ -6,6 +6,7 @@ import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.Base; import org.hl7.fhir.r4.model.BooleanType; /** Concrete implementation that calls the Hapi FHIR library. */ @@ -60,4 +61,10 @@ public Boolean evaluateCondition(Object resource, String expression) { PATH_ENGINE.evaluateFirst((IBaseResource) resource, expression, BooleanType.class); return result.map(BooleanType::booleanValue).orElse(false); } + + @Override + public String getStringFromFhirPath(Object resource, String expression) { + var results = PATH_ENGINE.evaluate((IBaseResource) resource, expression, Base.class); + return results.isEmpty() ? "" : results.get(0).primitiveValue(); + } } diff --git a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/wrappers/HapiFhir.java b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/wrappers/HapiFhir.java index f2537bb45..bc09b2cbf 100644 --- a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/wrappers/HapiFhir.java +++ b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/wrappers/HapiFhir.java @@ -15,4 +15,6 @@ T parseResource(String fhirResource, Class clazz) String encodeResourceToJson(Object resource); Boolean evaluateCondition(Object resource, String expression); + + String getStringFromFhirPath(Object resource, String expression); } From 8f2fc5119e432648b2a8fb80127f74d8c7c5374c Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sun, 31 Mar 2024 22:46:55 -0700 Subject: [PATCH 20/92] unit test: getStringFromFhirPath returns correct string value --- .../external/hapi/HapiFhirImplementationTest.groovy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy index c22bc2518..50747ef66 100644 --- a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy +++ b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy @@ -97,6 +97,18 @@ class HapiFhirImplementationTest extends Specification { thrown(FhirPathExecutionException) } + def "getStringFromFhirPath returns correct string value for existing path"() { + given: + def path = "Bundle.entry[0].resource.id" + def expected = diaReport.id + + when: + def actual = fhir.getStringFromFhirPath(bundle as IBaseResource, path) + + then: + actual == expected + } + def "parseResource can convert a valid string to Bundle"() { given: def fhirBody = Files.readString(Path.of("../examples/Test/Orders/001_OML_O21_short.fhir")) From 3ce9f676528d6410edb0b467f7384a31b4068955 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sun, 31 Mar 2024 22:53:13 -0700 Subject: [PATCH 21/92] unit test: getStringFromFhirPath() returns empty string --- .../external/hapi/HapiFhirImplementationTest.groovy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy index 50747ef66..e23f8d1d7 100644 --- a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy +++ b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy @@ -109,6 +109,18 @@ class HapiFhirImplementationTest extends Specification { actual == expected } + def "getStringFromFhirPath returns empty string fro non-existing path"() { + given: + def path = "Bundle.entry[0].resource.nonExistingProperty" + def expected = "" + + when: + def actual = fhir.getStringFromFhirPath(bundle as IBaseResource, path) + + then: + actual == expected + } + def "parseResource can convert a valid string to Bundle"() { given: def fhirBody = Files.readString(Path.of("../examples/Test/Orders/001_OML_O21_short.fhir")) From 71f29d8ff6000a63918dc7de5c998531378a8068 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sun, 31 Mar 2024 22:59:31 -0700 Subject: [PATCH 22/92] unit test: getStringFromFhirPath() handles complex paths correctly --- .../hapi/HapiFhirImplementationTest.groovy | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy index e23f8d1d7..ef92ff18e 100644 --- a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy +++ b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy @@ -7,6 +7,7 @@ import org.hl7.fhir.instance.model.api.IBaseResource import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.DiagnosticReport import org.hl7.fhir.r4.model.ServiceRequest +import org.hl7.fhir.r4.model.StringType import spock.lang.Specification import java.nio.file.Files @@ -121,6 +122,21 @@ class HapiFhirImplementationTest extends Specification { actual == expected } + def "getStringFromFhirPath handles complex paths correctly"() { + given: + def extensionUrl = "http://example.org/fhir/StructureDefinition/testExtension" + def extensionValue = "DogCow" + servRequest.addExtension(extensionUrl, new StringType(extensionValue)) + def path = "Bundle.entry.resource.ofType(ServiceRequest).extension('http://example.org/fhir/StructureDefinition/testExtension').value" + def expected = extensionValue + + when: + def actual = fhir.getStringFromFhirPath(bundle as IBaseResource, path) + + then: + actual == expected + } + def "parseResource can convert a valid string to Bundle"() { given: def fhirBody = Files.readString(Path.of("../examples/Test/Orders/001_OML_O21_short.fhir")) From 6f70726dfeddd07b23a295aeb1e80dfd206da21d Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Sun, 31 Mar 2024 23:07:20 -0700 Subject: [PATCH 23/92] use .evaluateFirst() instead of .evaluate() --- .../external/hapi/HapiFhirImplementation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java index 84caa337a..f5b26cd4c 100644 --- a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java +++ b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java @@ -64,7 +64,7 @@ public Boolean evaluateCondition(Object resource, String expression) { @Override public String getStringFromFhirPath(Object resource, String expression) { - var results = PATH_ENGINE.evaluate((IBaseResource) resource, expression, Base.class); - return results.isEmpty() ? "" : results.get(0).primitiveValue(); + var result = PATH_ENGINE.evaluateFirst((IBaseResource) resource, expression, Base.class); + return result.map(Base::primitiveValue).orElse(""); } } From 3e7de2a706d09f56345ee8c9938c4df09b97d31d Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Mon, 1 Apr 2024 11:51:20 -0700 Subject: [PATCH 24/92] MessageDetails -> MessageHdDataType --- .../{MessageDetails.java => MessageHdDataType.java} | 7 ++++--- ...DetailsTest.groovy => MessageHdDataTypeTest.groovy} | 10 +++++----- 2 files changed, 9 insertions(+), 8 deletions(-) rename etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/{MessageDetails.java => MessageHdDataType.java} (85%) rename etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/{MessageDetailsTest.groovy => MessageHdDataTypeTest.groovy} (76%) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java similarity index 85% rename from etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java rename to etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index 91b359d96..2e3552a5a 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetails.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -8,14 +8,15 @@ * This class represents the result of evaluating a FHIRPath expression, encapsulating specific * details extracted from a FHIR resource. This class holds values for namespace, universal * identifier (ID), and the type of the universal ID, providing a mechanism to output these details - * in a concatenated string format. + * in a concatenated string format. HD rer: + * https://hl7-definition.caristix.com/v2/HL7v2.5.1/DataTypes/HD */ -public class MessageDetails { +public class MessageHdDataType { private String namespace; private String universalId; private String universalIdType; - public MessageDetails(String namespace, String universalId, String universalIdType) { + public MessageHdDataType(String namespace, String universalId, String universalIdType) { this.namespace = namespace; this.universalId = universalId; this.universalIdType = universalIdType; diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy similarity index 76% rename from etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy rename to etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy index a39dcd220..7fb20e149 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageDetailsTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy @@ -3,10 +3,10 @@ package gov.hhs.cdc.trustedintermediary.etor.messages import gov.hhs.cdc.trustedintermediary.PojoTestUtils import spock.lang.Specification -class MessageDetailsTest extends Specification { +class MessageHdDataTypeTest extends Specification { def "test getters and setters"() { when: - PojoTestUtils.validateGettersAndSetters(MessageDetails) + PojoTestUtils.validateGettersAndSetters(MessageHdDataType) then: noExceptionThrown() @@ -20,7 +20,7 @@ class MessageDetailsTest extends Specification { def expected = "${namespace}^${universalId}^${universalIdType}" when: - def messageDetails = new MessageDetails(namespace, universalId, universalIdType) + def messageDetails = new MessageHdDataType(namespace, universalId, universalIdType) def actual = messageDetails.toString() then: @@ -35,7 +35,7 @@ class MessageDetailsTest extends Specification { def expected = "${namespace}^${universalIdType}" when: - def messageDetails = new MessageDetails(namespace, universalId, universalIdType) + def messageDetails = new MessageHdDataType(namespace, universalId, universalIdType) def actual = messageDetails.toString() then: @@ -50,7 +50,7 @@ class MessageDetailsTest extends Specification { def expected = "" when: - def messageDetails = new MessageDetails(namespace, universalId, universalIdType) + def messageDetails = new MessageHdDataType(namespace, universalId, universalIdType) def actual = messageDetails.toString() then: From ee861330e08ced97fff4e3691df8d58698b8dd37 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Mon, 1 Apr 2024 11:56:49 -0700 Subject: [PATCH 25/92] external link to javadocs --- .../trustedintermediary/etor/messages/MessageHdDataType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index 2e3552a5a..ffb697683 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -8,8 +8,8 @@ * This class represents the result of evaluating a FHIRPath expression, encapsulating specific * details extracted from a FHIR resource. This class holds values for namespace, universal * identifier (ID), and the type of the universal ID, providing a mechanism to output these details - * in a concatenated string format. HD rer: - * https://hl7-definition.caristix.com/v2/HL7v2.5.1/DataTypes/HD + * in a concatenated string format. HD rer: HD-DataType */ public class MessageHdDataType { private String namespace; From b30ba339c3bcc402c0d01a6c8eec7cd95a140ebd Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Mon, 1 Apr 2024 11:59:06 -0700 Subject: [PATCH 26/92] refactor javdocs --- .../trustedintermediary/etor/messages/MessageHdDataType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index ffb697683..734265610 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -8,7 +8,7 @@ * This class represents the result of evaluating a FHIRPath expression, encapsulating specific * details extracted from a FHIR resource. This class holds values for namespace, universal * identifier (ID), and the type of the universal ID, providing a mechanism to output these details - * in a concatenated string format. HD rer: HD-DataType */ public class MessageHdDataType { From f2af5b3d398d73014211bb5e6b104733ce47fe19 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Mon, 1 Apr 2024 21:47:27 -0700 Subject: [PATCH 27/92] javadocs for getStringFromFhirPath --- .../external/hapi/HapiFhirImplementation.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java index b2571a0a2..aaadb28bf 100644 --- a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java +++ b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java @@ -6,8 +6,8 @@ import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; import org.hl7.fhir.instance.model.api.IBaseResource; -import org.hl7.fhir.r4.model.Base; import org.hl7.fhir.r4.model.BooleanType; +import org.hl7.fhir.r4.model.StringType; /** Concrete implementation that calls the Hapi FHIR library. */ public class HapiFhirImplementation implements HapiFhir { @@ -74,9 +74,26 @@ public Boolean evaluateCondition(Object resource, String expression) { return result.map(BooleanType::booleanValue).orElse(false); } + /** + * Retrieves a string result by evaluating a specified FHIRPath expression against a given FHIR + * resource. This method simplifies accessing textual data within FHIR resources by directly + * returning the string representation of the first matching element found by the FHIRPath + * expression. If no match is found, or the first result cannot be represented as a string, an + * empty string is returned. + * + * @param resource The FHIR resource upon which the FHIRPath expression will be evaluated. This + * resource acts as the context for the FHIRPath evaluation. + * @param expression The FHIRPath expression to be evaluated against the resource. The + * expression should be crafted to select textual data or elements that can be represented + * as text. + * @return The string representation of the first matching result of the FHIRPath expression + * evaluation. Returns an empty string if no matching element is found, or if the first + * result cannot be represented as a string. + */ @Override public String getStringFromFhirPath(Object resource, String expression) { - var result = PATH_ENGINE.evaluateFirst((IBaseResource) resource, expression, Base.class); - return result.map(Base::primitiveValue).orElse(""); + var result = + PATH_ENGINE.evaluateFirst((IBaseResource) resource, expression, StringType.class); + return result.map(StringType::getValue).orElse(""); } } From 391f3e7070f8fc80892099d538946e6b07b23a90 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Mon, 1 Apr 2024 22:01:44 -0700 Subject: [PATCH 28/92] Base.class instead of StringType.class --- .../external/hapi/HapiFhirImplementation.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java index aaadb28bf..e37c2a108 100644 --- a/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java +++ b/shared/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementation.java @@ -6,8 +6,8 @@ import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.Base; import org.hl7.fhir.r4.model.BooleanType; -import org.hl7.fhir.r4.model.StringType; /** Concrete implementation that calls the Hapi FHIR library. */ public class HapiFhirImplementation implements HapiFhir { @@ -92,8 +92,7 @@ public Boolean evaluateCondition(Object resource, String expression) { */ @Override public String getStringFromFhirPath(Object resource, String expression) { - var result = - PATH_ENGINE.evaluateFirst((IBaseResource) resource, expression, StringType.class); - return result.map(StringType::getValue).orElse(""); + var result = PATH_ENGINE.evaluateFirst((IBaseResource) resource, expression, Base.class); + return result.map(Base::primitiveValue).orElse(""); } } From 7665230c2dbb8d79f04ea37ed30ff211f7546218 Mon Sep 17 00:00:00 2001 From: Jorge Lopez <49923512+jorg3lopez@users.noreply.github.com> Date: Tue, 2 Apr 2024 00:54:40 -0700 Subject: [PATCH 29/92] Extract IDs Metadata Extract Refactoring (#999) * Refactoring data extraction of HapiOrder and HapiResult using HapiFhir pathing * added imports * fhir path private variables * created fhirPaths map --------- Co-authored-by: saquino0827 --- .../external/hapi/HapiMessageHelper.java | 228 ++++++++++++++++++ .../external/hapi/HapiOrder.java | 72 +----- .../hapi/HapiFhirImplementationTest.groovy | 1 - 3 files changed, 233 insertions(+), 68 deletions(-) create mode 100644 etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java new file mode 100644 index 000000000..f9b832feb --- /dev/null +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -0,0 +1,228 @@ +package gov.hhs.cdc.trustedintermediary.external.hapi; + +import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; +import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.MessageHeader; +import org.hl7.fhir.r4.model.Organization; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.StringType; + +public class HapiMessageHelper { + + private final Map fhirPaths; + private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); + private String PLACER_ORDER_NUMBER_FHIR_PATH = + "Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"; + + private final HapiFhir fhirEngine = ApplicationContext.getImplementation(HapiFhir.class); + + public static HapiMessageHelper getInstance() { + return INSTANCE; + } + + private HapiMessageHelper() { + this.fhirPaths = Collections.unmodifiableMap(loadFhirPaths()); + } + + public String extractPlacerOrderNumber() { + return null; + } + + public String extractSendingFacilityDetails(Bundle messageBundle) { + String organizationReference = + HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) + .map(MessageHeader::getSender) + .filter(Objects::nonNull) + .map(Reference::getReference) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + + if (organizationReference == null || organizationReference.isEmpty()) { + return ""; + } + + // Extract from Organization/{id} + String orgId = + organizationReference.contains("/") + ? organizationReference.split("/")[1] + : organizationReference; + + return HapiHelper.resourcesInBundle(messageBundle, Organization.class) + .filter(org -> orgId.equals(org.getIdElement().getIdPart())) + .findFirst() + .map( + org -> { + String facilityName = "", identifierValue = "", typeCode = ""; + + for (Identifier identifier : org.getIdentifier()) { + String extensionValue = + identifier.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + ((StringType) ext.getValue()) + .getValue()) + .orElse(""); + + // HD.1: namespace id + if ("HD.1".equals(extensionValue)) { + facilityName = identifier.getValue(); + } else if ("HD.2,HD.3".equals(extensionValue)) { + identifierValue = identifier.getValue(); + // HD.2: universal Id, HD.3: universal id type + typeCode = + identifier.getType() != null + && !identifier + .getType() + .getCoding() + .isEmpty() + ? identifier + .getType() + .getCoding() + .get(0) + .getCode() + : ""; + } + } + + return concatenateWithCaret(facilityName, identifierValue, typeCode); + }) + .orElse(""); + } + + public String extractReceivingApplicationDetails(Bundle messageBundle) { + return HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) + .filter(Objects::nonNull) + .findFirst() + .flatMap( + messageHeader -> + messageHeader.getDestination().stream() + .filter(Objects::nonNull) + .findFirst()) + .map( + destination -> { + String name = Objects.toString(destination.getName(), ""); + String universalId = + destination.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + Objects.toString( + ext.getValue().primitiveValue(), + "")) + .orElse(""); + String universalIdType = + destination.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + Objects.toString( + ext.getValue().primitiveValue(), + "")) + .orElse(""); + + return concatenateWithCaret(name, universalId, universalIdType); + }) + .orElse(""); + } + + private String concatenateWithCaret(String... values) { + return Arrays.stream(values) + .filter(Objects::nonNull) // Ensure null values are ignored + .collect(Collectors.joining("^")); + } + + private Map loadFhirPaths() { + Map tempPaths = new HashMap<>(); + tempPaths.put( + "receivingFacilityNamespace", + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.1' + ).value"""); + tempPaths.put( + "receivingFacilityUniversalId", + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.2,HD.3' + ).value"""); + tempPaths.put( + "receivingFacilityUniversalIdType", + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.2,HD.3' + ).type.coding.code"""); + tempPaths.put( + "sendingFacilityNamespace", + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.1' + ).value + """); + tempPaths.put( + "sendingFacilityUniversalId", + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.2,HD.3' + ).value"""); + tempPaths.put( + "sendingFacilityUniversalIdType", + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.2,HD.3' + ).type.coding.code"""); + tempPaths.put( + "sendingApplicationNamespace", + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').valueString"""); + tempPaths.put( + "sendingApplicationUniversalId", + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').valueString"""); + tempPaths.put( + "sendingApplicationUniversalIdType", + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').valueString"""); + tempPaths.put( + "receivingApplicationNamespace", + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').valueString"""); + tempPaths.put( + "receivingApplicationUniversalId", + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').valueString"""); + tempPaths.put( + "receivingApplicationUniversalIdType", + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').valueString"""); + // We need to add placer_order_number + return tempPaths; + } +} diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 01340f913..b3556b2f4 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -4,15 +4,13 @@ import java.util.Arrays; import java.util.Objects; import java.util.stream.Collectors; +import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Extension; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.MessageHeader; -import org.hl7.fhir.r4.model.Organization; import org.hl7.fhir.r4.model.Patient; -import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ServiceRequest; -import org.hl7.fhir.r4.model.StringType; /** * A concrete implementation of a {@link Order} that uses the Hapi FHIR bundle as its underlying @@ -20,6 +18,8 @@ */ public class HapiOrder implements Order { + @Inject HapiMessageHelper hapiMessageHelper; + private final Bundle innerOrder; public HapiOrder(Bundle innerOrder) { @@ -103,74 +103,12 @@ public String getSendingApplicationDetails() { namespaceId, universalId, universalIdType, endpoint); }) .orElse(""); + // extract into SendingApplicationDetail Object } @Override public String getSendingFacilityDetails() { - String organizationReference = - HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) - .map(MessageHeader::getSender) - .filter(Objects::nonNull) - .map(Reference::getReference) - .filter(Objects::nonNull) - .findFirst() - .orElse(null); - - if (organizationReference == null || organizationReference.isEmpty()) { - return ""; - } - - // Extract from Organization/{id} - String orgId = - organizationReference.contains("/") - ? organizationReference.split("/")[1] - : organizationReference; - - return HapiHelper.resourcesInBundle(innerOrder, Organization.class) - .filter(org -> orgId.equals(org.getIdElement().getIdPart())) - .findFirst() - .map( - org -> { - String facilityName = "", identifierValue = "", typeCode = ""; - - for (Identifier identifier : org.getIdentifier()) { - String extensionValue = - identifier.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - ((StringType) ext.getValue()) - .getValue()) - .orElse(""); - - // HD.1: namespace id - if ("HD.1".equals(extensionValue)) { - facilityName = identifier.getValue(); - } else if ("HD.2,HD.3".equals(extensionValue)) { - identifierValue = identifier.getValue(); - // HD.2: universal Id, HD.3: universal id type - typeCode = - identifier.getType() != null - && !identifier - .getType() - .getCoding() - .isEmpty() - ? identifier - .getType() - .getCoding() - .get(0) - .getCode() - : ""; - } - } - - return concatenateWithCaret(facilityName, identifierValue, typeCode); - }) - .orElse(""); + return HapiMessageHelper.getInstance().extractSendingFacilityDetails(innerOrder); } @Override diff --git a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy index 9901792e9..afa6cc165 100644 --- a/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy +++ b/shared/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirImplementationTest.groovy @@ -1,6 +1,5 @@ package gov.hhs.cdc.trustedintermediary.external.hapi -import ca.uhn.fhir.fhirpath.FhirPathExecutionException import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException import org.hl7.fhir.instance.model.api.IBaseResource From 73126b8e0a81d47d2d069ec4aa655e61ff12a25e Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Tue, 2 Apr 2024 01:11:41 -0700 Subject: [PATCH 30/92] added setup() to HapiOrderTest --- .../external/hapi/HapiOrderTest.groovy | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index bece06d8f..a05ecefa5 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -1,6 +1,7 @@ package gov.hhs.cdc.trustedintermediary.external.hapi - +import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding @@ -16,6 +17,13 @@ import org.hl7.fhir.r4.model.UrlType import spock.lang.Specification class HapiOrderTest extends Specification { + + def setup() { + TestApplicationContext.reset() + TestApplicationContext.injectRegisteredImplementations() + TestApplicationContext.register(HapiFhir.class, HapiFhirImplementation.getInstance()) + } + def "getUnderlyingOrder Works"() { given: def expectedInnerOrder = new Bundle() From b70223c851401892adae4bf01bf9fc9d01603e75 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Tue, 2 Apr 2024 15:04:09 -0500 Subject: [PATCH 31/92] Update Order and Result data extraction - HapiMessageHelper class refactor to remove code duplication and use fhir paths to extract data over looping through objects using the HapiFhir library. - Rename methods in Order and Result class with their respective types of data --- .../etor/orders/Order.java | 2 +- .../etor/results/Result.java | 8 +- .../external/hapi/HapiMessageHelper.java | 215 ++++++------------ .../external/hapi/HapiResult.java | 52 ++--- 4 files changed, 101 insertions(+), 176 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index 11c334edc..726724abe 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -20,5 +20,5 @@ public interface Order { String getReceivingApplicationDetails(); - String getReceivingFacilityId(); + String getReceivingFacilityDetails(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java index c15678f7a..f740b9c76 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java @@ -12,11 +12,11 @@ public interface Result { String getPlacerOrderNumber(); - String getSendingApplicationId(); + String getSendingApplicationDetails(); - String getSendingFacilityId(); + String getSendingFacilityDetails(); - String getReceivingApplicationId(); + String getReceivingApplicationDetails(); - String getReceivingFacilityId(); + String getReceivingFacilityDetails(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index f9b832feb..efa26d344 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -1,26 +1,35 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.MessageHeader; -import org.hl7.fhir.r4.model.Organization; -import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.StringType; public class HapiMessageHelper { + public static final String PLACER_ORDER_NUMBER = "placerOrderNumber"; + public static final String SENDING_FACILITY_NAMESPACE = "sendingFacilityNamespace"; + public static final String SENDING_FACILITY_UNIVERSAL_ID = "sendingFacilityUniversalId"; + public static final String SENDING_FACILITY_UNIVERSAL_ID_TYPE = + "sendingFacilityUniversalIdType"; + public static final String RECEIVING_FACILITY_NAMESPACE = "receivingFacilityNamespace"; + public static final String RECEIVING_FACILITY_UNIVERSAL_ID = "receivingFacilityUniversalId"; + public static final String RECEIVING_FACILITY_UNIVERSAL_ID_TYPE = + "receivingFacilityUniversalIdType"; + public static final String SENDING_APPLICATION_NAMESPACE = "sendingApplicationNamespace"; + public static final String SENDING_APPLICATION_UNIVERSAL_ID = "sendingApplicationUniversalId"; + public static final String SENDING_APPLICATION_UNIVERSAL_ID_TYPE = + "sendingApplicationUniversalIdType"; + public static final String RECEIVING_APPLICATION_NAMESPACE = "receivingApplicationNamespace"; + public static final String RECEIVING_APPLICATION_UNIVERSAL_ID = + "receivingApplicationUniversalId"; + public static final String RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE = + "receivingApplicationUniversalIdType"; private final Map fhirPaths; private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); - private String PLACER_ORDER_NUMBER_FHIR_PATH = - "Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"; private final HapiFhir fhirEngine = ApplicationContext.getImplementation(HapiFhir.class); @@ -32,197 +41,123 @@ private HapiMessageHelper() { this.fhirPaths = Collections.unmodifiableMap(loadFhirPaths()); } - public String extractPlacerOrderNumber() { - return null; + public String extractPlacerOrderNumber(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, fhirPaths.get(PLACER_ORDER_NUMBER)); } - public String extractSendingFacilityDetails(Bundle messageBundle) { - String organizationReference = - HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) - .map(MessageHeader::getSender) - .filter(Objects::nonNull) - .map(Reference::getReference) - .filter(Objects::nonNull) - .findFirst() - .orElse(null); - - if (organizationReference == null || organizationReference.isEmpty()) { - return ""; - } - - // Extract from Organization/{id} - String orgId = - organizationReference.contains("/") - ? organizationReference.split("/")[1] - : organizationReference; - - return HapiHelper.resourcesInBundle(messageBundle, Organization.class) - .filter(org -> orgId.equals(org.getIdElement().getIdPart())) - .findFirst() - .map( - org -> { - String facilityName = "", identifierValue = "", typeCode = ""; - - for (Identifier identifier : org.getIdentifier()) { - String extensionValue = - identifier.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - ((StringType) ext.getValue()) - .getValue()) - .orElse(""); - - // HD.1: namespace id - if ("HD.1".equals(extensionValue)) { - facilityName = identifier.getValue(); - } else if ("HD.2,HD.3".equals(extensionValue)) { - identifierValue = identifier.getValue(); - // HD.2: universal Id, HD.3: universal id type - typeCode = - identifier.getType() != null - && !identifier - .getType() - .getCoding() - .isEmpty() - ? identifier - .getType() - .getCoding() - .get(0) - .getCode() - : ""; - } - } - - return concatenateWithCaret(facilityName, identifierValue, typeCode); - }) - .orElse(""); + public MessageHdDataType extractSendingApplicationDetails(Bundle messageBundle) { + return new MessageHdDataType( + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_APPLICATION_NAMESPACE)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID_TYPE))); } - public String extractReceivingApplicationDetails(Bundle messageBundle) { - return HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) - .filter(Objects::nonNull) - .findFirst() - .flatMap( - messageHeader -> - messageHeader.getDestination().stream() - .filter(Objects::nonNull) - .findFirst()) - .map( - destination -> { - String name = Objects.toString(destination.getName(), ""); - String universalId = - destination.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - Objects.toString( - ext.getValue().primitiveValue(), - "")) - .orElse(""); - String universalIdType = - destination.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - Objects.toString( - ext.getValue().primitiveValue(), - "")) - .orElse(""); + public MessageHdDataType extractSendingFacilityDetails(Bundle messageBundle) { + return new MessageHdDataType( + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_FACILITY_NAMESPACE)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID_TYPE))); + } - return concatenateWithCaret(name, universalId, universalIdType); - }) - .orElse(""); + public MessageHdDataType extractReceivingApplicationDetails(Bundle messageBundle) { + return new MessageHdDataType( + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_APPLICATION_NAMESPACE)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE))); } - private String concatenateWithCaret(String... values) { - return Arrays.stream(values) - .filter(Objects::nonNull) // Ensure null values are ignored - .collect(Collectors.joining("^")); + public MessageHdDataType extractReceivingFacilityDetails(Bundle messageBundle) { + return new MessageHdDataType( + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_FACILITY_NAMESPACE)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID)), + fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID_TYPE))); } private Map loadFhirPaths() { Map tempPaths = new HashMap<>(); tempPaths.put( - "receivingFacilityNamespace", + RECEIVING_FACILITY_NAMESPACE, """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and extension.valueString = 'HD.1' ).value"""); tempPaths.put( - "receivingFacilityUniversalId", + RECEIVING_FACILITY_UNIVERSAL_ID, """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and extension.valueString = 'HD.2,HD.3' ).value"""); tempPaths.put( - "receivingFacilityUniversalIdType", + RECEIVING_FACILITY_UNIVERSAL_ID_TYPE, """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and extension.valueString = 'HD.2,HD.3' ).type.coding.code"""); tempPaths.put( - "sendingFacilityNamespace", + SENDING_FACILITY_NAMESPACE, """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.1' - ).value - """); + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.1' + ).value + """); tempPaths.put( - "sendingFacilityUniversalId", + SENDING_FACILITY_UNIVERSAL_ID, """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and extension.valueString = 'HD.2,HD.3' ).value"""); tempPaths.put( - "sendingFacilityUniversalIdType", + SENDING_FACILITY_UNIVERSAL_ID_TYPE, """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and extension.valueString = 'HD.2,HD.3' ).type.coding.code"""); tempPaths.put( - "sendingApplicationNamespace", + SENDING_APPLICATION_NAMESPACE, """ Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').valueString"""); tempPaths.put( - "sendingApplicationUniversalId", + SENDING_APPLICATION_UNIVERSAL_ID, """ Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').valueString"""); tempPaths.put( - "sendingApplicationUniversalIdType", + SENDING_APPLICATION_UNIVERSAL_ID_TYPE, """ Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').valueString"""); tempPaths.put( - "receivingApplicationNamespace", + RECEIVING_APPLICATION_NAMESPACE, """ Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').valueString"""); tempPaths.put( - "receivingApplicationUniversalId", + RECEIVING_APPLICATION_UNIVERSAL_ID, """ Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').valueString"""); tempPaths.put( - "receivingApplicationUniversalIdType", + RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE, """ Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').valueString"""); - // We need to add placer_order_number + tempPaths.put( + PLACER_ORDER_NUMBER, + """ + Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"""); return tempPaths; } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 1d80bd9cc..a60c97a90 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -1,14 +1,15 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.results.Result; +import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.MessageHeader; -import org.hl7.fhir.r4.model.ServiceRequest; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ public class HapiResult implements Result { + @Inject HapiMessageHelper hapiMessageHelper; + private final Bundle innerResult; public HapiResult(Bundle innerResult) { @@ -27,45 +28,34 @@ public String getFhirResourceId() { @Override public String getPlacerOrderNumber() { - return HapiHelper.resourcesInBundle(innerResult, ServiceRequest.class) - .flatMap(serviceRequest -> serviceRequest.getIdentifier().stream()) - .filter( - identifier -> - identifier - .getType() - .hasCoding( - "http://terminology.hl7.org/CodeSystem/v2-0203", - "PLAC")) - .map(Identifier::getValue) - .findFirst() - .orElse(""); + return HapiMessageHelper.getInstance().extractPlacerOrderNumber(innerResult); } @Override - public String getSendingApplicationId() { - return HapiHelper.resourcesInBundle(innerResult, MessageHeader.class) - .flatMap(header -> header.getSource().getExtension().stream()) - .filter( - extension -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id" - .equals(extension.getUrl())) - .map(extension -> extension.getValue().toString()) - .findFirst() - .orElse(""); + public String getSendingApplicationDetails() { + MessageHdDataType sendingApplicationDetails = + HapiMessageHelper.getInstance().extractSendingApplicationDetails(innerResult); + return sendingApplicationDetails.toString(); } @Override - public String getSendingFacilityId() { - return null; + public String getSendingFacilityDetails() { + MessageHdDataType sendingFacilityDetails = + HapiMessageHelper.getInstance().extractSendingFacilityDetails(innerResult); + return sendingFacilityDetails.toString(); } @Override - public String getReceivingApplicationId() { - return null; + public String getReceivingApplicationDetails() { + MessageHdDataType receivingApplicationDetails = + HapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerResult); + return receivingApplicationDetails.toString(); } @Override - public String getReceivingFacilityId() { - return null; + public String getReceivingFacilityDetails() { + MessageHdDataType receivingFacilityDetails = + HapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerResult); + return receivingFacilityDetails.toString(); } } From 39f8f8aa03033f53ff6e8c7a8d7dba41ac0cd965 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Tue, 2 Apr 2024 15:05:28 -0500 Subject: [PATCH 32/92] Update HapiOrder to use HapiMessageHelper --- .../external/hapi/HapiOrder.java | 117 +++--------------- 1 file changed, 15 insertions(+), 102 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index b3556b2f4..a8466a2b5 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -1,16 +1,11 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.orders.Order; -import java.util.Arrays; -import java.util.Objects; -import java.util.stream.Collectors; import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Extension; import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.MessageHeader; import org.hl7.fhir.r4.model.Patient; -import org.hl7.fhir.r4.model.ServiceRequest; /** * A concrete implementation of a {@link Order} that uses the Hapi FHIR bundle as its underlying @@ -54,116 +49,34 @@ public String getPatientId() { @Override public String getPlacerOrderNumber() { - return HapiHelper.resourcesInBundle(innerOrder, ServiceRequest.class) - .flatMap(serviceRequest -> serviceRequest.getIdentifier().stream()) - .filter( - identifier -> - identifier - .getType() - .hasCoding( - "http://terminology.hl7.org/CodeSystem/v2-0203", - "PLAC")) - .map(Identifier::getValue) - .findFirst() - .orElse(""); + return HapiMessageHelper.getInstance().extractPlacerOrderNumber(innerOrder); } @Override public String getSendingApplicationDetails() { - return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) - .filter(Objects::nonNull) - .findFirst() - .map( - messageHeader -> { - String namespaceId = null; - String universalId = null; - String universalIdType = null; - String endpoint = messageHeader.getSource().getEndpoint(); - - for (Extension extension : messageHeader.getSource().getExtension()) { - if ("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id" - .equals(extension.getUrl())) { - namespaceId = - Objects.toString( - extension.getValue().primitiveValue(), ""); - } else if ("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id" - .equals(extension.getUrl())) { - universalId = - Objects.toString( - extension.getValue().primitiveValue(), ""); - } else if ("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type" - .equals(extension.getUrl())) { - universalIdType = - Objects.toString( - extension.getValue().primitiveValue(), ""); - } - } - - return concatenateWithCaret( - namespaceId, universalId, universalIdType, endpoint); - }) - .orElse(""); - // extract into SendingApplicationDetail Object + MessageHdDataType sendingApplicationDetails = + HapiMessageHelper.getInstance().extractSendingApplicationDetails(innerOrder); + return sendingApplicationDetails.toString(); } @Override public String getSendingFacilityDetails() { - return HapiMessageHelper.getInstance().extractSendingFacilityDetails(innerOrder); + MessageHdDataType sendingFacilityDetails = + HapiMessageHelper.getInstance().extractSendingFacilityDetails(innerOrder); + return sendingFacilityDetails.toString(); } @Override public String getReceivingApplicationDetails() { - return HapiHelper.resourcesInBundle(innerOrder, MessageHeader.class) - .filter(Objects::nonNull) - .findFirst() - .flatMap( - messageHeader -> - messageHeader.getDestination().stream() - .filter(Objects::nonNull) - .findFirst()) - .map( - destination -> { - String name = Objects.toString(destination.getName(), ""); - String universalId = - destination.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - Objects.toString( - ext.getValue().primitiveValue(), - "")) - .orElse(""); - String universalIdType = - destination.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - Objects.toString( - ext.getValue().primitiveValue(), - "")) - .orElse(""); - - return concatenateWithCaret(name, universalId, universalIdType); - }) - .orElse(""); + MessageHdDataType receivingApplicationDetails = + HapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerOrder); + return receivingApplicationDetails.toString(); } @Override - public String getReceivingFacilityId() { - return null; - } - - private String concatenateWithCaret(String... values) { - return Arrays.stream(values) - .filter(Objects::nonNull) // Ensure null values are ignored - .collect(Collectors.joining("^")); + public String getReceivingFacilityDetails() { + MessageHdDataType receivingFacilityDetails = + HapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerOrder); + return receivingFacilityDetails.toString(); } } From 3d7bc3e7b0116d99483b62bb4c978e6cd2287f62 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Tue, 2 Apr 2024 15:08:04 -0500 Subject: [PATCH 33/92] Fix usage of HapiMessageHelper class in HapiOrder/HapiResult --- .../trustedintermediary/external/hapi/HapiOrder.java | 10 +++++----- .../trustedintermediary/external/hapi/HapiResult.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index a8466a2b5..2da8a7ffb 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -49,34 +49,34 @@ public String getPatientId() { @Override public String getPlacerOrderNumber() { - return HapiMessageHelper.getInstance().extractPlacerOrderNumber(innerOrder); + return hapiMessageHelper.getInstance().extractPlacerOrderNumber(innerOrder); } @Override public String getSendingApplicationDetails() { MessageHdDataType sendingApplicationDetails = - HapiMessageHelper.getInstance().extractSendingApplicationDetails(innerOrder); + hapiMessageHelper.getInstance().extractSendingApplicationDetails(innerOrder); return sendingApplicationDetails.toString(); } @Override public String getSendingFacilityDetails() { MessageHdDataType sendingFacilityDetails = - HapiMessageHelper.getInstance().extractSendingFacilityDetails(innerOrder); + hapiMessageHelper.getInstance().extractSendingFacilityDetails(innerOrder); return sendingFacilityDetails.toString(); } @Override public String getReceivingApplicationDetails() { MessageHdDataType receivingApplicationDetails = - HapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerOrder); + hapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerOrder); return receivingApplicationDetails.toString(); } @Override public String getReceivingFacilityDetails() { MessageHdDataType receivingFacilityDetails = - HapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerOrder); + hapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerOrder); return receivingFacilityDetails.toString(); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index a60c97a90..4c523b9f8 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -28,34 +28,34 @@ public String getFhirResourceId() { @Override public String getPlacerOrderNumber() { - return HapiMessageHelper.getInstance().extractPlacerOrderNumber(innerResult); + return hapiMessageHelper.getInstance().extractPlacerOrderNumber(innerResult); } @Override public String getSendingApplicationDetails() { MessageHdDataType sendingApplicationDetails = - HapiMessageHelper.getInstance().extractSendingApplicationDetails(innerResult); + hapiMessageHelper.getInstance().extractSendingApplicationDetails(innerResult); return sendingApplicationDetails.toString(); } @Override public String getSendingFacilityDetails() { MessageHdDataType sendingFacilityDetails = - HapiMessageHelper.getInstance().extractSendingFacilityDetails(innerResult); + hapiMessageHelper.getInstance().extractSendingFacilityDetails(innerResult); return sendingFacilityDetails.toString(); } @Override public String getReceivingApplicationDetails() { MessageHdDataType receivingApplicationDetails = - HapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerResult); + hapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerResult); return receivingApplicationDetails.toString(); } @Override public String getReceivingFacilityDetails() { MessageHdDataType receivingFacilityDetails = - HapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerResult); + hapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerResult); return receivingFacilityDetails.toString(); } } From caa7310ec21297c3ac0ae8c2043db47cfbdb4c4a Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Tue, 2 Apr 2024 15:09:06 -0500 Subject: [PATCH 34/92] Change Order/Result mocks with their respective correct field names --- .../cdc/trustedintermediary/OrderMock.groovy | 28 +++++++++---------- .../cdc/trustedintermediary/ResultMock.groovy | 16 +++++------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 769442256..802d4f0b0 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -11,21 +11,21 @@ class OrderMock implements Order { private String patientId private T underlyingOrders private String placerOrderNumber - private String sendingApplicationId - private String sendingFacilityId - private String receivingApplicationId - private String receivingFacilityId + private String sendingApplicationDetails + private String sendingFacilityDetails + private String receivingApplicationDetails + private String receivingFacilityDetails OrderMock(String fhirResourceId, String patientId, T underlyingOrders, String placerOrderNumber, String sendingApplicationId, String sendingFacilityId, - String receivingApplicationId, String receivingFacilityId) { + String receivingApplicationDetails, String receivingFacilityDetails) { this.fhirResourceId = fhirResourceId this.patientId = patientId this.underlyingOrders = underlyingOrders this.placerOrderNumber = placerOrderNumber - this.sendingApplicationId = sendingApplicationId - this.sendingFacilityId = sendingFacilityId - this.receivingApplicationId = receivingApplicationId - this.receivingFacilityId = receivingFacilityId + this.sendingApplicationDetails = sendingApplicationDetails + this.sendingFacilityDetails = sendingFacilityDetails + this.receivingApplicationDetails = receivingApplicationDetails + this.receivingFacilityDetails = receivingFacilityDetails } @Override @@ -50,21 +50,21 @@ class OrderMock implements Order { @Override String getSendingApplicationDetails() { - return this.sendingApplicationId + return this.sendingApplicationDetails } @Override String getSendingFacilityDetails() { - return this.sendingFacilityId + return this.sendingFacilityDetails } @Override String getReceivingApplicationDetails() { - return this.receivingApplicationId + return this.receivingApplicationDetails } @Override - String getReceivingFacilityId() { - return this.receivingFacilityId + String getReceivingFacilityDetails() { + return this.receivingFacilityDetails } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index d771f7674..1441e9911 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -43,22 +43,22 @@ class ResultMock implements Result { } @Override - String getSendingApplicationId() { - return this.sendingApplicationId + String getSendingApplicationDetails() { + return this.sendingApplicationDetails } @Override - String getSendingFacilityId() { - return this.sendingFacilityId + String getSendingFacilityDetails() { + return this.sendingFacilityDetails } @Override - String getReceivingApplicationId() { - return this.receivingApplicationId + String getReceivingApplicationDetails() { + return this.receivingApplicationDetails } @Override - String getReceivingFacilityId() { - return this.receivingFacilityId + String getReceivingFacilityDetails() { + return this.receivingFacilityDetails } } From 9cdd994ed2a1d89841c52d00b0a434de1fe8cd42 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Tue, 2 Apr 2024 16:46:57 -0500 Subject: [PATCH 35/92] Update HapiOrderTest and HapiMessageHelper handling for getSendingApplicationDetails --- .../external/hapi/HapiMessageHelper.java | 6 +++--- .../external/hapi/HapiOrderTest.groovy | 2 +- .../external/hapi/HapiResultTest.groovy | 20 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index efa26d344..ed2b74ab0 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -133,15 +133,15 @@ private Map loadFhirPaths() { tempPaths.put( SENDING_APPLICATION_NAMESPACE, """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').valueString"""); + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value"""); tempPaths.put( SENDING_APPLICATION_UNIVERSAL_ID, """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').valueString"""); + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value"""); tempPaths.put( SENDING_APPLICATION_UNIVERSAL_ID_TYPE, """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').valueString"""); + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value"""); tempPaths.put( RECEIVING_APPLICATION_NAMESPACE, """ diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index a05ecefa5..1bddcb3dc 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -126,7 +126,7 @@ class HapiOrderTest extends Specification { def universalIdType = "DNS" def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) messageHeader.getSource().addExtension(universalIdTypeExtension) - def expectedApplicationDetails = "$nameSpaceId^$universalId^$universalIdType^$endpoint" + def expectedApplicationDetails = "$nameSpaceId^$universalId^$universalIdType" innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index caa12e0d0..f5509a09c 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -66,7 +66,7 @@ class HapiResultTest extends Specification{ actualPlacerOrderNumber == expectedPlacerOrderNumber } - def "getSendingApplicationId works"() { + def "getSendingApplicationDetails works"() { given: def expectedSendingApplicationId = "mock-sending-application-id" def bundle = new Bundle() @@ -77,26 +77,26 @@ class HapiResultTest extends Specification{ def result = new HapiResult(bundle) when: - def actualSendingApplicationId = result.getSendingApplicationId() + def actualSendingApplicationId = result.getSendingApplicationDetails() then: actualSendingApplicationId == expectedSendingApplicationId } - def "getSendingApplicationId unhappy path"() { + def "getSendingApplicationDetails unhappy path"() { given: def expectedSendingApplicationId = "" def bundle = new Bundle() def result = new HapiResult(bundle) when: - def actualSendingApplicationId = result.getSendingApplicationId() + def actualSendingApplicationId = result.getSendingApplicationDetails() then: actualSendingApplicationId == expectedSendingApplicationId } - def "getSendingFacilityId works"() { + def "getSendingFacilityDetails works"() { given: def expected = 1 when: @@ -105,7 +105,7 @@ class HapiResultTest extends Specification{ actual == expected } - def "getSendingFacilityId unhappy path"() { + def "getSendingFacilityDetails unhappy path"() { given: def expected = 1 when: @@ -114,7 +114,7 @@ class HapiResultTest extends Specification{ actual == expected } - def "getReceivingApplicationId works"() { + def "getReceivingApplicationDetails works"() { given: def expected = 1 when: @@ -123,7 +123,7 @@ class HapiResultTest extends Specification{ actual == expected } - def "getReceivingApplicationId unhappy path"() { + def "getReceivingApplicationDetails unhappy path"() { given: def expected = 1 when: @@ -132,7 +132,7 @@ class HapiResultTest extends Specification{ actual == expected } - def "getReceivingFacilityId works"() { + def "getReceivingFacilityDetails works"() { given: def expected = 1 when: @@ -141,7 +141,7 @@ class HapiResultTest extends Specification{ actual == expected } - def "getReceivingFacilityId unhappy path"() { + def "getReceivingFacilityDetails unhappy path"() { given: def expected = 1 when: From 721c7a3c5b1dd9f240b2161bdcd06d3cbd8b8daa Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Tue, 2 Apr 2024 14:46:53 -0700 Subject: [PATCH 36/92] created skeletons for methods that extract values --- .../external/hapi/HapiMessageHelper.java | 53 ++++++++++++++++++- .../external/hapi/HapiOrderTest.groovy | 2 +- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index ed2b74ab0..e8f2daa70 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -6,6 +6,9 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; public class HapiMessageHelper { @@ -31,7 +34,7 @@ public class HapiMessageHelper { private final Map fhirPaths; private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); - private final HapiFhir fhirEngine = ApplicationContext.getImplementation(HapiFhir.class); + @Inject private HapiFhir fhirEngine; public static HapiMessageHelper getInstance() { return INSTANCE; @@ -85,6 +88,54 @@ public MessageHdDataType extractReceivingFacilityDetails(Bundle messageBundle) { messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID_TYPE))); } + public String extractSendingFacilityNamespace() { + return null; + } + + public String extractSendingFacilityUniversalId() { + return null; + } + + public String extractSendingFacilityUniversalIdType() { + return null; + } + + public String extractReceivingFacilityNamespace() { + return null; + } + + public String extractReceivingFacilityUniversalId() { + return null; + } + + public String extractReceivingFacilityUniversalIdType() { + return null; + } + + public String extractSendingApplicationNamespace() { + return null; + } + + public String extractSendingApplicationUniversalId() { + return null; + } + + public String extractSendingApplicationUniversalIdType() { + return null; + } + + public String extractReceivingApplicationNamespace() { + return null; + } + + public String extractReceivingApplicationUniversalId() { + return null; + } + + public String extractReceivingApplicationUniversalIdType() { + return null; + } + private Map loadFhirPaths() { Map tempPaths = new HashMap<>(); tempPaths.put( diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 1bddcb3dc..16b05c1aa 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -20,8 +20,8 @@ class HapiOrderTest extends Specification { def setup() { TestApplicationContext.reset() - TestApplicationContext.injectRegisteredImplementations() TestApplicationContext.register(HapiFhir.class, HapiFhirImplementation.getInstance()) + TestApplicationContext.injectRegisteredImplementations() } def "getUnderlyingOrder Works"() { From 519ab203dd608b9faa95976be993b29b5d7b5b7f Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Tue, 2 Apr 2024 15:08:39 -0700 Subject: [PATCH 37/92] merged conflicts --- .../trustedintermediary/external/hapi/HapiMessageHelper.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index e8f2daa70..0dd2a71b0 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -1,13 +1,10 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; -import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; From 815e566602908dc248723b2944bbafc8c9a2b3d2 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Tue, 2 Apr 2024 15:16:10 -0700 Subject: [PATCH 38/92] add extraction logic to methods --- .../external/hapi/HapiMessageHelper.java | 60 +++++++++++-------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 0dd2a71b0..7fd270a48 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -85,52 +85,64 @@ public MessageHdDataType extractReceivingFacilityDetails(Bundle messageBundle) { messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID_TYPE))); } - public String extractSendingFacilityNamespace() { - return null; + public String extractSendingFacilityNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_FACILITY_NAMESPACE)); } - public String extractSendingFacilityUniversalId() { - return null; + public String extractSendingFacilityUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID)); } - public String extractSendingFacilityUniversalIdType() { - return null; + public String extractSendingFacilityUniversalIdType(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID_TYPE)); } - public String extractReceivingFacilityNamespace() { - return null; + public String extractReceivingFacilityNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_FACILITY_NAMESPACE)); } - public String extractReceivingFacilityUniversalId() { - return null; + public String extractReceivingFacilityUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID)); } - public String extractReceivingFacilityUniversalIdType() { - return null; + public String extractReceivingFacilityUniversalIdType(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID_TYPE)); } - public String extractSendingApplicationNamespace() { - return null; + public String extractSendingApplicationNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_APPLICATION_NAMESPACE)); } - public String extractSendingApplicationUniversalId() { - return null; + public String extractSendingApplicationUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID)); } - public String extractSendingApplicationUniversalIdType() { - return null; + public String extractSendingApplicationUniversalIdType(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID_TYPE)); } - public String extractReceivingApplicationNamespace() { - return null; + public String extractReceivingApplicationNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_APPLICATION_NAMESPACE)); } - public String extractReceivingApplicationUniversalId() { - return null; + public String extractReceivingApplicationUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID)); } - public String extractReceivingApplicationUniversalIdType() { - return null; + public String extractReceivingApplicationUniversalIdType(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE)); } private Map loadFhirPaths() { From 080c19bbca0c6c9221ecf258c3b868d19ed25353 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Tue, 2 Apr 2024 18:40:32 -0700 Subject: [PATCH 39/92] fixed some failing tests and refactored --- .../etor/EtorDomainRegistration.java | 2 ++ .../etor/messages/MessageHdDataType.java | 10 +++--- .../external/hapi/HapiMessageHelper.java | 36 +++++++------------ .../external/hapi/HapiOrder.java | 15 ++++---- .../external/hapi/HapiOrderTest.groovy | 1 + 5 files changed, 29 insertions(+), 35 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistration.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistration.java index d4409575a..274ebe74b 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistration.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/EtorDomainRegistration.java @@ -38,6 +38,7 @@ import gov.hhs.cdc.trustedintermediary.external.database.DbDao; import gov.hhs.cdc.trustedintermediary.external.database.PostgresDao; import gov.hhs.cdc.trustedintermediary.external.hapi.HapiMessageConverterHelper; +import gov.hhs.cdc.trustedintermediary.external.hapi.HapiMessageHelper; import gov.hhs.cdc.trustedintermediary.external.hapi.HapiOrderConverter; import gov.hhs.cdc.trustedintermediary.external.hapi.HapiPartnerMetadataConverter; import gov.hhs.cdc.trustedintermediary.external.hapi.HapiResultConverter; @@ -120,6 +121,7 @@ public Map> domainRegistra HapiMessageConverterHelper.class, HapiMessageConverterHelper.getInstance()); ApplicationContext.register( ReportStreamSenderHelper.class, ReportStreamSenderHelper.getInstance()); + ApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()); // Metadata ApplicationContext.register( PartnerMetadataOrchestrator.class, PartnerMetadataOrchestrator.getInstance()); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index 734265610..78a1a4351 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -1,6 +1,6 @@ package gov.hhs.cdc.trustedintermediary.etor.messages; -import java.util.Objects; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -48,8 +48,10 @@ public void setUniversalIdType(String universalIdType) { @Override public String toString() { - return Stream.of(this.namespace, this.universalId, this.universalIdType) - .filter(Objects::nonNull) - .collect(Collectors.joining("^")); + List filteredValues = + Stream.of(this.namespace, this.universalId, this.universalIdType) + .filter(s -> s != null && !s.isEmpty()) + .collect(Collectors.toList()); + return filteredValues.isEmpty() ? "" : String.join("^", filteredValues); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 7fd270a48..7984ebfbd 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -47,42 +47,30 @@ public String extractPlacerOrderNumber(Bundle messageBundle) { public MessageHdDataType extractSendingApplicationDetails(Bundle messageBundle) { return new MessageHdDataType( - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_APPLICATION_NAMESPACE)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID_TYPE))); + extractSendingApplicationNamespace(messageBundle), + extractSendingApplicationUniversalId(messageBundle), + extractSendingApplicationUniversalIdType(messageBundle)); } public MessageHdDataType extractSendingFacilityDetails(Bundle messageBundle) { return new MessageHdDataType( - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_FACILITY_NAMESPACE)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID_TYPE))); + extractSendingFacilityNamespace(messageBundle), + extractSendingFacilityUniversalId(messageBundle), + extractSendingFacilityUniversalIdType(messageBundle)); } public MessageHdDataType extractReceivingApplicationDetails(Bundle messageBundle) { return new MessageHdDataType( - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_APPLICATION_NAMESPACE)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE))); + extractReceivingApplicationNamespace(messageBundle), + extractReceivingApplicationUniversalId(messageBundle), + extractReceivingApplicationUniversalIdType(messageBundle)); } public MessageHdDataType extractReceivingFacilityDetails(Bundle messageBundle) { return new MessageHdDataType( - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_FACILITY_NAMESPACE)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID)), - fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID_TYPE))); + extractReceivingFacilityNamespace(messageBundle), + extractReceivingFacilityUniversalId(messageBundle), + extractReceivingFacilityUniversalIdType(messageBundle)); } public String extractSendingFacilityNamespace(Bundle messageBundle) { diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 2da8a7ffb..d7b8c0460 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -1,8 +1,8 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; +import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.orders.Order; -import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.Patient; @@ -13,7 +13,8 @@ */ public class HapiOrder implements Order { - @Inject HapiMessageHelper hapiMessageHelper; + private final HapiMessageHelper MESSAGE_HELPER = + ApplicationContext.getImplementation(HapiMessageHelper.class); private final Bundle innerOrder; @@ -49,34 +50,34 @@ public String getPatientId() { @Override public String getPlacerOrderNumber() { - return hapiMessageHelper.getInstance().extractPlacerOrderNumber(innerOrder); + return MESSAGE_HELPER.extractPlacerOrderNumber(innerOrder); } @Override public String getSendingApplicationDetails() { MessageHdDataType sendingApplicationDetails = - hapiMessageHelper.getInstance().extractSendingApplicationDetails(innerOrder); + MESSAGE_HELPER.extractSendingApplicationDetails(innerOrder); return sendingApplicationDetails.toString(); } @Override public String getSendingFacilityDetails() { MessageHdDataType sendingFacilityDetails = - hapiMessageHelper.getInstance().extractSendingFacilityDetails(innerOrder); + MESSAGE_HELPER.extractSendingFacilityDetails(innerOrder); return sendingFacilityDetails.toString(); } @Override public String getReceivingApplicationDetails() { MessageHdDataType receivingApplicationDetails = - hapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerOrder); + MESSAGE_HELPER.extractReceivingApplicationDetails(innerOrder); return receivingApplicationDetails.toString(); } @Override public String getReceivingFacilityDetails() { MessageHdDataType receivingFacilityDetails = - hapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerOrder); + MESSAGE_HELPER.extractReceivingFacilityDetails(innerOrder); return receivingFacilityDetails.toString(); } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 16b05c1aa..4c7e16075 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -21,6 +21,7 @@ class HapiOrderTest extends Specification { def setup() { TestApplicationContext.reset() TestApplicationContext.register(HapiFhir.class, HapiFhirImplementation.getInstance()) + TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) TestApplicationContext.injectRegisteredImplementations() } From 68f018696053e829a8281c5714a0848f61ce67fb Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Tue, 2 Apr 2024 18:45:38 -0700 Subject: [PATCH 40/92] fixed HapiOrderConverterTests that were failing --- .../external/hapi/HapiOrderConverterTest.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy index 4910e03b7..84fb84761 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy @@ -37,6 +37,7 @@ class HapiOrderConverterTest extends Specification { TestApplicationContext.init() TestApplicationContext.register(OrderConverter, HapiOrderConverter.getInstance()) TestApplicationContext.register(HapiMessageConverterHelper, HapiMessageConverterHelper.getInstance()) + TestApplicationContext.register(HapiMessageHelper, HapiMessageHelper.getInstance()) TestApplicationContext.injectRegisteredImplementations() mockPatient = new Patient() From 3c36fe37165da173adc76f308cde67306afe3de8 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 00:06:19 -0700 Subject: [PATCH 41/92] fixed failing tests from OrderControllerTest --- .../trustedintermediary/etor/orders/OrderControllerTest.groovy | 2 ++ .../cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy | 1 + 2 files changed, 3 insertions(+) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy index 2ad6e6a5a..580b4b313 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy @@ -4,6 +4,7 @@ import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext import gov.hhs.cdc.trustedintermediary.domainconnector.DomainRequest import gov.hhs.cdc.trustedintermediary.etor.metadata.EtorMetadataStep import gov.hhs.cdc.trustedintermediary.etor.ruleengine.RuleEngine +import gov.hhs.cdc.trustedintermediary.external.hapi.HapiMessageHelper import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import gov.hhs.cdc.trustedintermediary.wrappers.MetricMetadata @@ -19,6 +20,7 @@ class OrderControllerTest extends Specification { TestApplicationContext.register(OrderController, OrderController.getInstance()) TestApplicationContext.register(MetricMetadata, Mock(MetricMetadata)) TestApplicationContext.register(RuleEngine, ruleEngine) + TestApplicationContext.register(HapiMessageHelper, HapiMessageHelper.getInstance()) } def "parseOrders happy path works"() { diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 4c7e16075..993c04e36 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -20,6 +20,7 @@ class HapiOrderTest extends Specification { def setup() { TestApplicationContext.reset() + TestApplicationContext.init() TestApplicationContext.register(HapiFhir.class, HapiFhirImplementation.getInstance()) TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) TestApplicationContext.injectRegisteredImplementations() From 363318d31ebf6de74a5709bf227c360ce713f282 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 01:06:26 -0700 Subject: [PATCH 42/92] All tests work except for the ones using .resolve() --- .../external/hapi/HapiMessageHelper.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 7984ebfbd..dbef7a52b 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -193,15 +193,16 @@ private Map loadFhirPaths() { tempPaths.put( RECEIVING_APPLICATION_NAMESPACE, """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').valueString"""); + Bundle.entry.resource.ofType(MessageHeader).destination.name + """); tempPaths.put( RECEIVING_APPLICATION_UNIVERSAL_ID, """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').valueString"""); + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value"""); tempPaths.put( RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE, """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').valueString"""); + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value"""); tempPaths.put( PLACER_ORDER_NUMBER, """ From 44c4f4c081d33e30f31a89facce023f0a07522e1 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 01:15:31 -0700 Subject: [PATCH 43/92] extractSendingFacilityDetails() uses fhir bundle object, all current tests pass --- .../etor/messages/MessageHdDataType.java | 2 + .../external/hapi/HapiMessageHelper.java | 78 ++++++++++++++++++- 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index 78a1a4351..14f580e84 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -22,6 +22,8 @@ public MessageHdDataType(String namespace, String universalId, String universalI this.universalIdType = universalIdType; } + public MessageHdDataType() {} + public String getNamespace() { return namespace; } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index dbef7a52b..3f7af2aab 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -5,8 +5,14 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.MessageHeader; +import org.hl7.fhir.r4.model.Organization; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.StringType; public class HapiMessageHelper { @@ -53,10 +59,74 @@ public MessageHdDataType extractSendingApplicationDetails(Bundle messageBundle) } public MessageHdDataType extractSendingFacilityDetails(Bundle messageBundle) { - return new MessageHdDataType( - extractSendingFacilityNamespace(messageBundle), - extractSendingFacilityUniversalId(messageBundle), - extractSendingFacilityUniversalIdType(messageBundle)); + // return new MessageHdDataType( + // extractSendingFacilityNamespace(messageBundle), + // extractSendingFacilityUniversalId(messageBundle), + // extractSendingFacilityUniversalIdType(messageBundle)); + String organizationReference = + HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) + .map(MessageHeader::getSender) + .filter(Objects::nonNull) + .map(Reference::getReference) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + + if (organizationReference == null || organizationReference.isEmpty()) { + return new MessageHdDataType(); + } + + // Extract from Organization/{id} + String orgId = + organizationReference.contains("/") + ? organizationReference.split("/")[1] + : organizationReference; + + return HapiHelper.resourcesInBundle(messageBundle, Organization.class) + .filter(org -> orgId.equals(org.getIdElement().getIdPart())) + .findFirst() + .map( + org -> { + String facilityName = "", identifierValue = "", typeCode = ""; + + for (Identifier identifier : org.getIdentifier()) { + String extensionValue = + identifier.getExtension().stream() + .filter( + ext -> + "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" + .equals(ext.getUrl())) + .findFirst() + .map( + ext -> + ((StringType) ext.getValue()) + .getValue()) + .orElse(""); + + // HD.1: namespace id + if ("HD.1".equals(extensionValue)) { + facilityName = identifier.getValue(); + } else if ("HD.2,HD.3".equals(extensionValue)) { + identifierValue = identifier.getValue(); + // HD.2: universal Id, HD.3: universal id type + typeCode = + identifier.getType() != null + && !identifier + .getType() + .getCoding() + .isEmpty() + ? identifier + .getType() + .getCoding() + .get(0) + .getCode() + : ""; + } + } + + return new MessageHdDataType(facilityName, identifierValue, typeCode); + }) + .orElse(new MessageHdDataType()); } public MessageHdDataType extractReceivingApplicationDetails(Bundle messageBundle) { From 727adac17f2008093633f76d66ed6d7ecaf4a802 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 10:06:18 -0700 Subject: [PATCH 44/92] all tests pass --- .../external/hapi/HapiMessageHelper.java | 152 +++++++++--------- .../external/hapi/HapiOrderTest.groovy | 7 +- 2 files changed, 80 insertions(+), 79 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 3f7af2aab..ba0914116 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -5,14 +5,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.MessageHeader; -import org.hl7.fhir.r4.model.Organization; -import org.hl7.fhir.r4.model.Reference; -import org.hl7.fhir.r4.model.StringType; public class HapiMessageHelper { @@ -59,74 +53,78 @@ public MessageHdDataType extractSendingApplicationDetails(Bundle messageBundle) } public MessageHdDataType extractSendingFacilityDetails(Bundle messageBundle) { - // return new MessageHdDataType( - // extractSendingFacilityNamespace(messageBundle), - // extractSendingFacilityUniversalId(messageBundle), - // extractSendingFacilityUniversalIdType(messageBundle)); - String organizationReference = - HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) - .map(MessageHeader::getSender) - .filter(Objects::nonNull) - .map(Reference::getReference) - .filter(Objects::nonNull) - .findFirst() - .orElse(null); - - if (organizationReference == null || organizationReference.isEmpty()) { - return new MessageHdDataType(); - } - - // Extract from Organization/{id} - String orgId = - organizationReference.contains("/") - ? organizationReference.split("/")[1] - : organizationReference; - - return HapiHelper.resourcesInBundle(messageBundle, Organization.class) - .filter(org -> orgId.equals(org.getIdElement().getIdPart())) - .findFirst() - .map( - org -> { - String facilityName = "", identifierValue = "", typeCode = ""; - - for (Identifier identifier : org.getIdentifier()) { - String extensionValue = - identifier.getExtension().stream() - .filter( - ext -> - "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" - .equals(ext.getUrl())) - .findFirst() - .map( - ext -> - ((StringType) ext.getValue()) - .getValue()) - .orElse(""); - - // HD.1: namespace id - if ("HD.1".equals(extensionValue)) { - facilityName = identifier.getValue(); - } else if ("HD.2,HD.3".equals(extensionValue)) { - identifierValue = identifier.getValue(); - // HD.2: universal Id, HD.3: universal id type - typeCode = - identifier.getType() != null - && !identifier - .getType() - .getCoding() - .isEmpty() - ? identifier - .getType() - .getCoding() - .get(0) - .getCode() - : ""; - } - } - - return new MessageHdDataType(facilityName, identifierValue, typeCode); - }) - .orElse(new MessageHdDataType()); + return new MessageHdDataType( + extractSendingFacilityNamespace(messageBundle), + extractSendingFacilityUniversalId(messageBundle), + extractSendingFacilityUniversalIdType(messageBundle)); + // String organizationReference = + // HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) + // .map(MessageHeader::getSender) + // .filter(Objects::nonNull) + // .map(Reference::getReference) + // .filter(Objects::nonNull) + // .findFirst() + // .orElse(null); + // + // if (organizationReference == null || organizationReference.isEmpty()) { + // return new MessageHdDataType(); + // } + // + // // Extract from Organization/{id} + // String orgId = + // organizationReference.contains("/") + // ? organizationReference.split("/")[1] + // : organizationReference; + // + // return HapiHelper.resourcesInBundle(messageBundle, Organization.class) + // .filter(org -> orgId.equals(org.getIdElement().getIdPart())) + // .findFirst() + // .map( + // org -> { + // String facilityName = "", identifierValue = "", typeCode = ""; + // + // for (Identifier identifier : org.getIdentifier()) { + // String extensionValue = + // identifier.getExtension().stream() + // .filter( + // ext -> + // + // "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" + // + // .equals(ext.getUrl())) + // .findFirst() + // .map( + // ext -> + // ((StringType) + // ext.getValue()) + // .getValue()) + // .orElse(""); + // + // // HD.1: namespace id + // if ("HD.1".equals(extensionValue)) { + // facilityName = identifier.getValue(); + // } else if ("HD.2,HD.3".equals(extensionValue)) { + // identifierValue = identifier.getValue(); + // // HD.2: universal Id, HD.3: universal id type + // typeCode = + // identifier.getType() != null + // && !identifier + // .getType() + // .getCoding() + // .isEmpty() + // ? identifier + // .getType() + // .getCoding() + // .get(0) + // .getCode() + // : ""; + // } + // } + // + // return new MessageHdDataType(facilityName, identifierValue, + // typeCode); + // }) + // .orElse(new MessageHdDataType()); } public MessageHdDataType extractReceivingApplicationDetails(Bundle messageBundle) { @@ -231,7 +229,7 @@ private Map loadFhirPaths() { """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.1' + extension.value = 'HD.1' ).value """); tempPaths.put( @@ -239,14 +237,14 @@ private Map loadFhirPaths() { """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.2,HD.3' + extension.value = 'HD.2,HD.3' ).value"""); tempPaths.put( SENDING_FACILITY_UNIVERSAL_ID_TYPE, """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.2,HD.3' + extension.value = 'HD.2,HD.3' ).type.coding.code"""); tempPaths.put( SENDING_APPLICATION_NAMESPACE, diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 993c04e36..d75bc7cbe 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -18,10 +18,12 @@ import spock.lang.Specification class HapiOrderTest extends Specification { + def fhirEngine = HapiFhirImplementation.getInstance() + def setup() { TestApplicationContext.reset() TestApplicationContext.init() - TestApplicationContext.register(HapiFhir.class, HapiFhirImplementation.getInstance()) + TestApplicationContext.register(HapiFhir.class, fhirEngine) TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) TestApplicationContext.injectRegisteredImplementations() } @@ -187,7 +189,8 @@ class HapiOrderTest extends Specification { organization.addIdentifier(facilityIdentifier) organization.addIdentifier(universalIdIdentifier) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) - def orders = new HapiOrder(innerOrders) + def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) + def orders = new HapiOrder(jsonOrders) def expectedFacilityDetails = "$facilityName^$universalIdIdentifierValue^$theCode" when: From 23deba326d5ba2c191adc9593d127d89045098bc Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Wed, 3 Apr 2024 14:43:09 -0400 Subject: [PATCH 45/92] Tweaked HapiResult to match HapiOrder changes --- .../external/hapi/HapiResult.java | 15 ++++++++------- .../external/hapi/HapiResultTest.groovy | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 4c523b9f8..18ac3b3ab 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -1,14 +1,15 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; +import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.results.Result; -import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ public class HapiResult implements Result { - @Inject HapiMessageHelper hapiMessageHelper; + private final HapiMessageHelper MESSAGE_HELPER = + ApplicationContext.getImplementation(HapiMessageHelper.class); private final Bundle innerResult; @@ -28,34 +29,34 @@ public String getFhirResourceId() { @Override public String getPlacerOrderNumber() { - return hapiMessageHelper.getInstance().extractPlacerOrderNumber(innerResult); + return MESSAGE_HELPER.extractPlacerOrderNumber(innerResult); } @Override public String getSendingApplicationDetails() { MessageHdDataType sendingApplicationDetails = - hapiMessageHelper.getInstance().extractSendingApplicationDetails(innerResult); + MESSAGE_HELPER.extractSendingApplicationDetails(innerResult); return sendingApplicationDetails.toString(); } @Override public String getSendingFacilityDetails() { MessageHdDataType sendingFacilityDetails = - hapiMessageHelper.getInstance().extractSendingFacilityDetails(innerResult); + MESSAGE_HELPER.extractSendingFacilityDetails(innerResult); return sendingFacilityDetails.toString(); } @Override public String getReceivingApplicationDetails() { MessageHdDataType receivingApplicationDetails = - hapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerResult); + MESSAGE_HELPER.extractReceivingApplicationDetails(innerResult); return receivingApplicationDetails.toString(); } @Override public String getReceivingFacilityDetails() { MessageHdDataType receivingFacilityDetails = - hapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerResult); + MESSAGE_HELPER.extractReceivingFacilityDetails(innerResult); return receivingFacilityDetails.toString(); } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index f5509a09c..ff49992a4 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -1,5 +1,7 @@ package gov.hhs.cdc.trustedintermediary.external.hapi +import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding @@ -10,7 +12,18 @@ import org.hl7.fhir.r4.model.ServiceRequest import org.hl7.fhir.r4.model.StringType import spock.lang.Specification -class HapiResultTest extends Specification{ +class HapiResultTest extends Specification { + + def fhirEngine = HapiFhirImplementation.getInstance() + + def setup() { + TestApplicationContext.reset() + TestApplicationContext.init() + TestApplicationContext.register(HapiFhir.class, fhirEngine) + TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) + TestApplicationContext.injectRegisteredImplementations() + } + def "getUnderlyingResult works"() { given: def expectedResult = new Bundle() From c6c9fea76f559877553f31979458562ec75759a7 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Wed, 3 Apr 2024 14:45:51 -0500 Subject: [PATCH 46/92] Update HapiResult and HapiResult --- .../external/hapi/HapiResult.java | 15 ++-- .../external/hapi/HapiResultTest.groovy | 70 ++++++++++++++++--- 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 4c523b9f8..18ac3b3ab 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -1,14 +1,15 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; +import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.results.Result; -import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ public class HapiResult implements Result { - @Inject HapiMessageHelper hapiMessageHelper; + private final HapiMessageHelper MESSAGE_HELPER = + ApplicationContext.getImplementation(HapiMessageHelper.class); private final Bundle innerResult; @@ -28,34 +29,34 @@ public String getFhirResourceId() { @Override public String getPlacerOrderNumber() { - return hapiMessageHelper.getInstance().extractPlacerOrderNumber(innerResult); + return MESSAGE_HELPER.extractPlacerOrderNumber(innerResult); } @Override public String getSendingApplicationDetails() { MessageHdDataType sendingApplicationDetails = - hapiMessageHelper.getInstance().extractSendingApplicationDetails(innerResult); + MESSAGE_HELPER.extractSendingApplicationDetails(innerResult); return sendingApplicationDetails.toString(); } @Override public String getSendingFacilityDetails() { MessageHdDataType sendingFacilityDetails = - hapiMessageHelper.getInstance().extractSendingFacilityDetails(innerResult); + MESSAGE_HELPER.extractSendingFacilityDetails(innerResult); return sendingFacilityDetails.toString(); } @Override public String getReceivingApplicationDetails() { MessageHdDataType receivingApplicationDetails = - hapiMessageHelper.getInstance().extractReceivingApplicationDetails(innerResult); + MESSAGE_HELPER.extractReceivingApplicationDetails(innerResult); return receivingApplicationDetails.toString(); } @Override public String getReceivingFacilityDetails() { MessageHdDataType receivingFacilityDetails = - hapiMessageHelper.getInstance().extractReceivingFacilityDetails(innerResult); + MESSAGE_HELPER.extractReceivingFacilityDetails(innerResult); return receivingFacilityDetails.toString(); } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index f5509a09c..22ed051e3 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -1,16 +1,29 @@ package gov.hhs.cdc.trustedintermediary.external.hapi +import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Extension import org.hl7.fhir.r4.model.Identifier import org.hl7.fhir.r4.model.MessageHeader +import org.hl7.fhir.r4.model.Organization +import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.ServiceRequest import org.hl7.fhir.r4.model.StringType import spock.lang.Specification class HapiResultTest extends Specification{ + + def setup() { + TestApplicationContext.reset() + TestApplicationContext.init() + TestApplicationContext.register(HapiFhir.class, HapiFhirImplementation.getInstance()) + TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) + TestApplicationContext.injectRegisteredImplementations() + } + def "getUnderlyingResult works"() { given: def expectedResult = new Bundle() @@ -96,22 +109,63 @@ class HapiResultTest extends Specification{ actualSendingApplicationId == expectedSendingApplicationId } - def "getSendingFacilityDetails works"() { + def "getSendingFacilityDetails happy path works"() { given: - def expected = 1 + def innerResults = new Bundle() + + def messageHeader = new MessageHeader() + def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" + messageHeader.setSender(new Reference(orgReference)) + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + + def organization = new Organization() + organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") + // facility name + def facilityIdentifier = new Identifier() + def facilityName = "MN Public Health Lab" + def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + facilityIdentifier.addExtension(facilityNameExtension) + facilityIdentifier.setValue(facilityName) + // universal id + def universalIdIdentifier = new Identifier() + def universalIdIdentifierValue = "2.16.840.1.114222.4.1.10080" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + universalIdIdentifier.addExtension(universalIdExtension) + universalIdIdentifier.setValue(universalIdIdentifierValue) + // Type + def typeConcept = new CodeableConcept() + def theCode = "ISO" + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", theCode, null) + typeConcept.addCoding(coding) + universalIdIdentifier.setType(typeConcept) + + organization.addIdentifier(facilityIdentifier) + organization.addIdentifier(universalIdIdentifier) + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + def orders = new HapiOrder(innerResults) + def expectedFacilityDetails = "$facilityName^$universalIdIdentifierValue^$theCode" + when: - def actual = 1 + def actualFacilityDetails = orders.getSendingFacilityDetails() + then: - actual == expected + actualFacilityDetails == expectedFacilityDetails } - def "getSendingFacilityDetails unhappy path"() { + def "getSendingFacilityDetails unhappy path works"() { given: - def expected = 1 + def innerOrders = new Bundle() + def expectedFacilityDetails = "" + def messageHeader = new MessageHeader() + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + + def orders = new HapiOrder(innerOrders) + when: - def actual = 1 + def actualFacilityDetails = orders.getSendingFacilityDetails() + then: - actual == expected + actualFacilityDetails == expectedFacilityDetails } def "getReceivingApplicationDetails works"() { From cc8866b643d9f2e059b18f9eaea24f567adbdd03 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Wed, 3 Apr 2024 15:32:43 -0500 Subject: [PATCH 47/92] Refactor work for HapiMessageHelper, Order and Result - Using the Single Principle Rule for HapiMessageHelper to only return one value string per any call - HapiOrder and Result to handle bundling of any MessageHdDatatype details together - Fix unit test mocking and start fixing unit tests --- .../etor/orders/Order.java | 10 +- .../etor/results/Result.java | 10 +- .../external/hapi/HapiMessageHelper.java | 319 +++++------------- .../external/hapi/HapiOrder.java | 64 +++- .../external/hapi/HapiResult.java | 64 +++- .../cdc/trustedintermediary/OrderMock.groovy | 21 +- .../cdc/trustedintermediary/ResultMock.groovy | 19 +- .../external/hapi/HapiOrderTest.groovy | 8 +- 8 files changed, 227 insertions(+), 288 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index 726724abe..5e8e79fad 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -1,5 +1,7 @@ package gov.hhs.cdc.trustedintermediary.etor.orders; +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; + /** * Interface to wrap a third-party lab order class (Ex: Hapi FHIR Bundle) * @@ -14,11 +16,11 @@ public interface Order { String getPlacerOrderNumber(); - String getSendingApplicationDetails(); + MessageHdDataType getSendingApplicationDetails(); - String getSendingFacilityDetails(); + MessageHdDataType getSendingFacilityDetails(); - String getReceivingApplicationDetails(); + MessageHdDataType getReceivingApplicationDetails(); - String getReceivingFacilityDetails(); + MessageHdDataType getReceivingFacilityDetails(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java index f740b9c76..fa9a53d28 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java @@ -1,5 +1,7 @@ package gov.hhs.cdc.trustedintermediary.etor.results; +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; + /** * Interface to wrap a third-party lab result class (Ex: Hapi FHIR Bundle) * @@ -12,11 +14,11 @@ public interface Result { String getPlacerOrderNumber(); - String getSendingApplicationDetails(); + MessageHdDataType getSendingApplicationDetails(); - String getSendingFacilityDetails(); + MessageHdDataType getSendingFacilityDetails(); - String getReceivingApplicationDetails(); + MessageHdDataType getReceivingApplicationDetails(); - String getReceivingFacilityDetails(); + MessageHdDataType getReceivingFacilityDetails(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index ba0914116..4c2bdcef8 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -1,34 +1,83 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; -import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; public class HapiMessageHelper { - public static final String PLACER_ORDER_NUMBER = "placerOrderNumber"; - public static final String SENDING_FACILITY_NAMESPACE = "sendingFacilityNamespace"; - public static final String SENDING_FACILITY_UNIVERSAL_ID = "sendingFacilityUniversalId"; + public static final String PLACER_ORDER_NUMBER = + """ + Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value + """; + + public static final String SENDING_FACILITY_NAMESPACE = + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.1' + ).value + """; + public static final String SENDING_FACILITY_UNIVERSAL_ID = + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).value + """; public static final String SENDING_FACILITY_UNIVERSAL_ID_TYPE = - "sendingFacilityUniversalIdType"; - public static final String RECEIVING_FACILITY_NAMESPACE = "receivingFacilityNamespace"; - public static final String RECEIVING_FACILITY_UNIVERSAL_ID = "receivingFacilityUniversalId"; - public static final String RECEIVING_FACILITY_UNIVERSAL_ID_TYPE = - "receivingFacilityUniversalIdType"; - public static final String SENDING_APPLICATION_NAMESPACE = "sendingApplicationNamespace"; - public static final String SENDING_APPLICATION_UNIVERSAL_ID = "sendingApplicationUniversalId"; + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).type.coding.code + """; + public static final String SENDING_APPLICATION_NAMESPACE = + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value + """; + public static final String SENDING_APPLICATION_UNIVERSAL_ID = + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value + """; public static final String SENDING_APPLICATION_UNIVERSAL_ID_TYPE = - "sendingApplicationUniversalIdType"; - public static final String RECEIVING_APPLICATION_NAMESPACE = "receivingApplicationNamespace"; + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value + """; + public static final String RECEIVING_FACILITY_NAMESPACE = + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.1' + ).value + """; + public static final String RECEIVING_FACILITY_UNIVERSAL_ID = + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.2,HD.3' + ).value + """; + public static final String RECEIVING_FACILITY_UNIVERSAL_ID_TYPE = + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.valueString = 'HD.2,HD.3' + ).type.coding.code + """; + public static final String RECEIVING_APPLICATION_NAMESPACE = + """ + Bundle.entry.resource.ofType(MessageHeader).destination.name + """; public static final String RECEIVING_APPLICATION_UNIVERSAL_ID = - "receivingApplicationUniversalId"; + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value + """; public static final String RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE = - "receivingApplicationUniversalIdType"; - private final Map fhirPaths; + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value + """; + private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); @Inject private HapiFhir fhirEngine; @@ -37,244 +86,60 @@ public static HapiMessageHelper getInstance() { return INSTANCE; } - private HapiMessageHelper() { - this.fhirPaths = Collections.unmodifiableMap(loadFhirPaths()); - } + private HapiMessageHelper() {} public String extractPlacerOrderNumber(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, fhirPaths.get(PLACER_ORDER_NUMBER)); - } - - public MessageHdDataType extractSendingApplicationDetails(Bundle messageBundle) { - return new MessageHdDataType( - extractSendingApplicationNamespace(messageBundle), - extractSendingApplicationUniversalId(messageBundle), - extractSendingApplicationUniversalIdType(messageBundle)); + return fhirEngine.getStringFromFhirPath(messageBundle, PLACER_ORDER_NUMBER); } - public MessageHdDataType extractSendingFacilityDetails(Bundle messageBundle) { - return new MessageHdDataType( - extractSendingFacilityNamespace(messageBundle), - extractSendingFacilityUniversalId(messageBundle), - extractSendingFacilityUniversalIdType(messageBundle)); - // String organizationReference = - // HapiHelper.resourcesInBundle(messageBundle, MessageHeader.class) - // .map(MessageHeader::getSender) - // .filter(Objects::nonNull) - // .map(Reference::getReference) - // .filter(Objects::nonNull) - // .findFirst() - // .orElse(null); - // - // if (organizationReference == null || organizationReference.isEmpty()) { - // return new MessageHdDataType(); - // } - // - // // Extract from Organization/{id} - // String orgId = - // organizationReference.contains("/") - // ? organizationReference.split("/")[1] - // : organizationReference; - // - // return HapiHelper.resourcesInBundle(messageBundle, Organization.class) - // .filter(org -> orgId.equals(org.getIdElement().getIdPart())) - // .findFirst() - // .map( - // org -> { - // String facilityName = "", identifierValue = "", typeCode = ""; - // - // for (Identifier identifier : org.getIdentifier()) { - // String extensionValue = - // identifier.getExtension().stream() - // .filter( - // ext -> - // - // "https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field" - // - // .equals(ext.getUrl())) - // .findFirst() - // .map( - // ext -> - // ((StringType) - // ext.getValue()) - // .getValue()) - // .orElse(""); - // - // // HD.1: namespace id - // if ("HD.1".equals(extensionValue)) { - // facilityName = identifier.getValue(); - // } else if ("HD.2,HD.3".equals(extensionValue)) { - // identifierValue = identifier.getValue(); - // // HD.2: universal Id, HD.3: universal id type - // typeCode = - // identifier.getType() != null - // && !identifier - // .getType() - // .getCoding() - // .isEmpty() - // ? identifier - // .getType() - // .getCoding() - // .get(0) - // .getCode() - // : ""; - // } - // } - // - // return new MessageHdDataType(facilityName, identifierValue, - // typeCode); - // }) - // .orElse(new MessageHdDataType()); + public String extractSendingApplicationNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_APPLICATION_NAMESPACE); } - public MessageHdDataType extractReceivingApplicationDetails(Bundle messageBundle) { - return new MessageHdDataType( - extractReceivingApplicationNamespace(messageBundle), - extractReceivingApplicationUniversalId(messageBundle), - extractReceivingApplicationUniversalIdType(messageBundle)); + public String extractSendingApplicationUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_APPLICATION_UNIVERSAL_ID); } - public MessageHdDataType extractReceivingFacilityDetails(Bundle messageBundle) { - return new MessageHdDataType( - extractReceivingFacilityNamespace(messageBundle), - extractReceivingFacilityUniversalId(messageBundle), - extractReceivingFacilityUniversalIdType(messageBundle)); + public String extractSendingApplicationUniversalIdType(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath( + messageBundle, SENDING_APPLICATION_UNIVERSAL_ID_TYPE); } public String extractSendingFacilityNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_FACILITY_NAMESPACE)); + return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_FACILITY_NAMESPACE); } public String extractSendingFacilityUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID)); + return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_FACILITY_UNIVERSAL_ID); } public String extractSendingFacilityUniversalIdType(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_FACILITY_UNIVERSAL_ID_TYPE)); - } - - public String extractReceivingFacilityNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_FACILITY_NAMESPACE)); - } - - public String extractReceivingFacilityUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID)); - } - - public String extractReceivingFacilityUniversalIdType(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_FACILITY_UNIVERSAL_ID_TYPE)); + return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_FACILITY_UNIVERSAL_ID_TYPE); } - public String extractSendingApplicationNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_APPLICATION_NAMESPACE)); + public String extractReceivingApplicationNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_APPLICATION_NAMESPACE); } - public String extractSendingApplicationUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID)); + public String extractReceivingApplicationUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_APPLICATION_UNIVERSAL_ID); } - public String extractSendingApplicationUniversalIdType(Bundle messageBundle) { + public String extractReceivingApplicationUniversalIdType(Bundle messageBundle) { return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(SENDING_APPLICATION_UNIVERSAL_ID_TYPE)); + messageBundle, RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE); } - public String extractReceivingApplicationNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_APPLICATION_NAMESPACE)); + public String extractReceivingFacilityNamespace(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_FACILITY_NAMESPACE); } - public String extractReceivingApplicationUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID)); + public String extractReceivingFacilityUniversalId(Bundle messageBundle) { + return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_FACILITY_UNIVERSAL_ID); } - public String extractReceivingApplicationUniversalIdType(Bundle messageBundle) { + public String extractReceivingFacilityUniversalIdType(Bundle messageBundle) { return fhirEngine.getStringFromFhirPath( - messageBundle, fhirPaths.get(RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE)); - } - - private Map loadFhirPaths() { - Map tempPaths = new HashMap<>(); - tempPaths.put( - RECEIVING_FACILITY_NAMESPACE, - """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.1' - ).value"""); - tempPaths.put( - RECEIVING_FACILITY_UNIVERSAL_ID, - """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.2,HD.3' - ).value"""); - tempPaths.put( - RECEIVING_FACILITY_UNIVERSAL_ID_TYPE, - """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.2,HD.3' - ).type.coding.code"""); - tempPaths.put( - SENDING_FACILITY_NAMESPACE, - """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.1' - ).value - """); - tempPaths.put( - SENDING_FACILITY_UNIVERSAL_ID, - """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).value"""); - tempPaths.put( - SENDING_FACILITY_UNIVERSAL_ID_TYPE, - """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).type.coding.code"""); - tempPaths.put( - SENDING_APPLICATION_NAMESPACE, - """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value"""); - tempPaths.put( - SENDING_APPLICATION_UNIVERSAL_ID, - """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value"""); - tempPaths.put( - SENDING_APPLICATION_UNIVERSAL_ID_TYPE, - """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value"""); - tempPaths.put( - RECEIVING_APPLICATION_NAMESPACE, - """ - Bundle.entry.resource.ofType(MessageHeader).destination.name - """); - tempPaths.put( - RECEIVING_APPLICATION_UNIVERSAL_ID, - """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value"""); - tempPaths.put( - RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE, - """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value"""); - tempPaths.put( - PLACER_ORDER_NUMBER, - """ - Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"""); - return tempPaths; + messageBundle, RECEIVING_FACILITY_UNIVERSAL_ID_TYPE); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index d7b8c0460..2e9026de6 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -54,30 +54,62 @@ public String getPlacerOrderNumber() { } @Override - public String getSendingApplicationDetails() { - MessageHdDataType sendingApplicationDetails = - MESSAGE_HELPER.extractSendingApplicationDetails(innerOrder); - return sendingApplicationDetails.toString(); + public MessageHdDataType getSendingApplicationDetails() { + String sendingApplicationNamespace = + MESSAGE_HELPER.extractSendingApplicationNamespace(innerOrder); + String sendingApplicationUniversalId = + MESSAGE_HELPER.extractSendingApplicationUniversalId(innerOrder); + String sendingApplicationUniversalIdType = + MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerOrder); + + return new MessageHdDataType( + sendingApplicationNamespace, + sendingApplicationUniversalId, + sendingApplicationUniversalIdType); } @Override - public String getSendingFacilityDetails() { - MessageHdDataType sendingFacilityDetails = - MESSAGE_HELPER.extractSendingFacilityDetails(innerOrder); - return sendingFacilityDetails.toString(); + public MessageHdDataType getSendingFacilityDetails() { + String sendingFacilityNamespace = + MESSAGE_HELPER.extractSendingFacilityNamespace(innerOrder); + String sendingFacilityUniversalId = + MESSAGE_HELPER.extractSendingFacilityUniversalId(innerOrder); + String sendingFacilityUniversalIdType = + MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerOrder); + + return new MessageHdDataType( + sendingFacilityNamespace, + sendingFacilityUniversalId, + sendingFacilityUniversalIdType); } @Override - public String getReceivingApplicationDetails() { - MessageHdDataType receivingApplicationDetails = - MESSAGE_HELPER.extractReceivingApplicationDetails(innerOrder); - return receivingApplicationDetails.toString(); + public MessageHdDataType getReceivingApplicationDetails() { + String receivingApplicationNamespace = + MESSAGE_HELPER.extractReceivingApplicationNamespace(innerOrder); + String receivingApplicationUniversalId = + MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerOrder); + String receivingApplicationUniversalIdType = + MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerOrder); + + return new MessageHdDataType( + receivingApplicationNamespace, + receivingApplicationUniversalId, + receivingApplicationUniversalIdType); } @Override - public String getReceivingFacilityDetails() { - MessageHdDataType receivingFacilityDetails = - MESSAGE_HELPER.extractReceivingFacilityDetails(innerOrder); - return receivingFacilityDetails.toString(); + public MessageHdDataType getReceivingFacilityDetails() { + String receivingFacilityNamespace = + MESSAGE_HELPER.extractReceivingFacilityNamespace(innerOrder); + String receivingFacilityUniversalId = + MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerOrder); + String receivingFacilityUniversalIdType = + MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerOrder); + + return new MessageHdDataType( + receivingFacilityNamespace, + receivingFacilityUniversalId, + receivingFacilityUniversalIdType); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 18ac3b3ab..5b7a86a63 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -33,30 +33,62 @@ public String getPlacerOrderNumber() { } @Override - public String getSendingApplicationDetails() { - MessageHdDataType sendingApplicationDetails = - MESSAGE_HELPER.extractSendingApplicationDetails(innerResult); - return sendingApplicationDetails.toString(); + public MessageHdDataType getSendingApplicationDetails() { + String sendingApplicationNamespace = + MESSAGE_HELPER.extractSendingApplicationNamespace(innerResult); + String sendingApplicationUniversalId = + MESSAGE_HELPER.extractSendingApplicationUniversalId(innerResult); + String sendingApplicationUniversalIdType = + MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerResult); + + return new MessageHdDataType( + sendingApplicationNamespace, + sendingApplicationUniversalId, + sendingApplicationUniversalIdType); } @Override - public String getSendingFacilityDetails() { - MessageHdDataType sendingFacilityDetails = - MESSAGE_HELPER.extractSendingFacilityDetails(innerResult); - return sendingFacilityDetails.toString(); + public MessageHdDataType getSendingFacilityDetails() { + String sendingFacilityNamespace = + MESSAGE_HELPER.extractSendingFacilityNamespace(innerResult); + String sendingFacilityUniversalId = + MESSAGE_HELPER.extractSendingFacilityUniversalId(innerResult); + String sendingFacilityUniversalIdType = + MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerResult); + + return new MessageHdDataType( + sendingFacilityNamespace, + sendingFacilityUniversalId, + sendingFacilityUniversalIdType); } @Override - public String getReceivingApplicationDetails() { - MessageHdDataType receivingApplicationDetails = - MESSAGE_HELPER.extractReceivingApplicationDetails(innerResult); - return receivingApplicationDetails.toString(); + public MessageHdDataType getReceivingApplicationDetails() { + String receivingApplicationNamespace = + MESSAGE_HELPER.extractReceivingApplicationNamespace(innerResult); + String receivingApplicationUniversalId = + MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerResult); + String receivingApplicationUniversalIdType = + MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerResult); + + return new MessageHdDataType( + receivingApplicationNamespace, + receivingApplicationUniversalId, + receivingApplicationUniversalIdType); } @Override - public String getReceivingFacilityDetails() { - MessageHdDataType receivingFacilityDetails = - MESSAGE_HELPER.extractReceivingFacilityDetails(innerResult); - return receivingFacilityDetails.toString(); + public MessageHdDataType getReceivingFacilityDetails() { + String receivingFacilityNamespace = + MESSAGE_HELPER.extractReceivingFacilityNamespace(innerResult); + String receivingFacilityUniversalId = + MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerResult); + String receivingFacilityUniversalIdType = + MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResult); + + return new MessageHdDataType( + receivingFacilityNamespace, + receivingFacilityUniversalId, + receivingFacilityUniversalIdType); } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 802d4f0b0..e7ba7438e 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -1,5 +1,6 @@ package gov.hhs.cdc.trustedintermediary +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType import gov.hhs.cdc.trustedintermediary.etor.orders.Order /** @@ -11,13 +12,13 @@ class OrderMock implements Order { private String patientId private T underlyingOrders private String placerOrderNumber - private String sendingApplicationDetails - private String sendingFacilityDetails - private String receivingApplicationDetails - private String receivingFacilityDetails + private MessageHdDataType sendingApplicationDetails + private MessageHdDataType sendingFacilityDetails + private MessageHdDataType receivingApplicationDetails + private MessageHdDataType receivingFacilityDetails - OrderMock(String fhirResourceId, String patientId, T underlyingOrders, String placerOrderNumber, String sendingApplicationId, String sendingFacilityId, - String receivingApplicationDetails, String receivingFacilityDetails) { + OrderMock(String fhirResourceId, String patientId, T underlyingOrders, String placerOrderNumber, MessageHdDataType sendingApplicationDetails, MessageHdDataType sendingFacilityDetails, + MessageHdDataType receivingApplicationDetails, MessageHdDataType receivingFacilityDetails) { this.fhirResourceId = fhirResourceId this.patientId = patientId this.underlyingOrders = underlyingOrders @@ -49,22 +50,22 @@ class OrderMock implements Order { } @Override - String getSendingApplicationDetails() { + MessageHdDataType getSendingApplicationDetails() { return this.sendingApplicationDetails } @Override - String getSendingFacilityDetails() { + MessageHdDataType getSendingFacilityDetails() { return this.sendingFacilityDetails } @Override - String getReceivingApplicationDetails() { + MessageHdDataType getReceivingApplicationDetails() { return this.receivingApplicationDetails } @Override - String getReceivingFacilityDetails() { + MessageHdDataType getReceivingFacilityDetails() { return this.receivingFacilityDetails } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index 1441e9911..3112aedf9 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -1,5 +1,6 @@ package gov.hhs.cdc.trustedintermediary +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType import gov.hhs.cdc.trustedintermediary.etor.results.Result /** @@ -10,14 +11,14 @@ class ResultMock implements Result { private String fhirResourceId private T underlyingResult private String placerOrderNumber - private String sendingApplicationId - private String sendingFacilityId - private String receivingApplicationId + private MessageHdDataType sendingApplicationId + private MessageHdDataType sendingFacilityId + private MessageHdDataType receivingApplicationId private String receivingFacilityId - ResultMock(String fhirResourceId, T underlyingResult, String placerOrderNumber, String sendingApplicationId, String sendingFacilityId, - String receivingApplicationId, String receivingFacilityId) { + ResultMock(String fhirResourceId, T underlyingResult, String placerOrderNumber, MessageHdDataType sendingApplicationId, MessageHdDataType sendingFacilityId, + MessageHdDataType receivingApplicationId, MessageHdDataType receivingFacilityId) { this.fhirResourceId = fhirResourceId this.underlyingResult = underlyingResult this.placerOrderNumber = placerOrderNumber @@ -43,22 +44,22 @@ class ResultMock implements Result { } @Override - String getSendingApplicationDetails() { + MessageHdDataType getSendingApplicationDetails() { return this.sendingApplicationDetails } @Override - String getSendingFacilityDetails() { + MessageHdDataType getSendingFacilityDetails() { return this.sendingFacilityDetails } @Override - String getReceivingApplicationDetails() { + MessageHdDataType getReceivingApplicationDetails() { return this.receivingApplicationDetails } @Override - String getReceivingFacilityDetails() { + MessageHdDataType getReceivingFacilityDetails() { return this.receivingFacilityDetails } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index d75bc7cbe..3ee59c599 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -1,6 +1,8 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataTypeTest import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept @@ -130,7 +132,7 @@ class HapiOrderTest extends Specification { def universalIdType = "DNS" def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) messageHeader.getSource().addExtension(universalIdTypeExtension) - def expectedApplicationDetails = "$nameSpaceId^$universalId^$universalIdType" + def expectedApplicationDetails = new MessageHdDataType(nameSpaceId, universalId, universalIdType) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def orders = new HapiOrder(innerOrders) @@ -139,7 +141,9 @@ class HapiOrderTest extends Specification { def actualApplicationDetails = orders.getSendingApplicationDetails() then: - actualApplicationDetails == expectedApplicationDetails + actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() + actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() + actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() } def "getSendingApplicationDetails unhappy path works"() { From 76f8a891fefc7f8e9e33e5cb7979bc0449b5e2d4 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Wed, 3 Apr 2024 15:55:51 -0500 Subject: [PATCH 48/92] Update unit tests for HapiOrder --- .../external/hapi/HapiOrderTest.groovy | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 3ee59c599..70ec5619c 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -148,7 +148,7 @@ class HapiOrderTest extends Specification { def "getSendingApplicationDetails unhappy path works"() { given: - def expectedApplicationDetails = "" + def expectedApplicationDetails = new MessageHdDataType("", "", "") def innerOrders = new Bundle() MessageHeader messageHeader = new MessageHeader() innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) @@ -156,8 +156,11 @@ class HapiOrderTest extends Specification { when: def actualApplicationDetails = orders.getSendingApplicationDetails() + then: - actualApplicationDetails == expectedApplicationDetails + actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() + actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() + actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() } def "getSendingFacilityDetails happy path works"() { @@ -195,19 +198,21 @@ class HapiOrderTest extends Specification { innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) def orders = new HapiOrder(jsonOrders) - def expectedFacilityDetails = "$facilityName^$universalIdIdentifierValue^$theCode" + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalIdIdentifierValue, theCode) when: def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityDetails == expectedFacilityDetails + actualFacilityDetails.getNamespace() == expectedFacilityDetails.getNamespace() + actualFacilityDetails.getUniversalId() == expectedFacilityDetails.getUniversalId() + actualFacilityDetails.getUniversalIdType() == expectedFacilityDetails.getUniversalIdType() } def "getSendingFacilityDetails unhappy path works"() { given: def innerOrders = new Bundle() - def expectedFacilityDetails = "" + def expectedFacilityDetails = new MessageHdDataType("", "", "") def messageHeader = new MessageHeader() innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) @@ -217,7 +222,9 @@ class HapiOrderTest extends Specification { def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityDetails == expectedFacilityDetails + actualFacilityDetails.getNamespace() == expectedFacilityDetails.getNamespace() + actualFacilityDetails.getUniversalId() == expectedFacilityDetails.getUniversalId() + actualFacilityDetails.getUniversalIdType() == expectedFacilityDetails.getUniversalIdType() } def "getReceivingApplicationDetails happy path works"() { @@ -230,7 +237,7 @@ class HapiOrderTest extends Specification { def universalIdType = "ISO" def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) - def expectedApplicationDetails = "$name^$universalId^$universalIdType" + def expectedApplicationDetails = new MessageHdDataType(name, universalId, universalIdType) destination.setName(name) destination.addExtension(universalIdExtension) @@ -243,22 +250,27 @@ class HapiOrderTest extends Specification { def actualApplicationDetails = orders.getReceivingApplicationDetails() then: - actualApplicationDetails == expectedApplicationDetails + actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() + actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() + actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() } def "getReceivingApplicationDetails unhappy path works"() { given: def innerOrders = new Bundle() def orders = new HapiOrder(innerOrders) - def expectedApplicationDetails = "" + def expectedApplicationDetails = new MessageHdDataType("", "", "") when: def actualApplicationDetails = orders.getReceivingApplicationDetails() + then: - actualApplicationDetails == expectedApplicationDetails + actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() + actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() + actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() } - def "getReceivingFacilityId happy path works"() { + def "getReceivingFacilityDetails happy path works"() { given: def expected = 1 when: @@ -267,7 +279,7 @@ class HapiOrderTest extends Specification { actual == expected } - def "getReceivingFacilityId unhappy path works"() { + def "getReceivingFacilityDetails unhappy path works"() { given: def expected = 1 when: From f593f19a7a6fe6d613f3f4c6143b2fac0487e22d Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 14:18:03 -0700 Subject: [PATCH 49/92] fixed ResultMock --- .../cdc/trustedintermediary/ResultMock.groovy | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index 3112aedf9..03470510b 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -11,21 +11,21 @@ class ResultMock implements Result { private String fhirResourceId private T underlyingResult private String placerOrderNumber - private MessageHdDataType sendingApplicationId - private MessageHdDataType sendingFacilityId - private MessageHdDataType receivingApplicationId - private String receivingFacilityId + private MessageHdDataType sendingApplicationDetails + private MessageHdDataType sendingFacilityDetails + private MessageHdDataType receivingApplicationDetails + private MessageHdDataType receivingFacilityDetails - ResultMock(String fhirResourceId, T underlyingResult, String placerOrderNumber, MessageHdDataType sendingApplicationId, MessageHdDataType sendingFacilityId, - MessageHdDataType receivingApplicationId, MessageHdDataType receivingFacilityId) { + ResultMock(String fhirResourceId, T underlyingResult, String placerOrderNumber, MessageHdDataType sendingApplicationDetails, MessageHdDataType sendingFacilityDetails, + MessageHdDataType receivingApplicationDetails, MessageHdDataType receivingFacilityDetails) { this.fhirResourceId = fhirResourceId this.underlyingResult = underlyingResult this.placerOrderNumber = placerOrderNumber - this.sendingApplicationId = sendingApplicationId - this.sendingFacilityId = sendingFacilityId - this.receivingApplicationId = receivingApplicationId - this.receivingFacilityId = receivingFacilityId + this.sendingApplicationDetails = sendingApplicationDetails + this.sendingFacilityDetails = sendingFacilityDetails + this.receivingApplicationDetails = receivingApplicationDetails + this.receivingFacilityDetails = receivingFacilityDetails } @Override From f1fd06c53479edb3507c5544e6c3316af4b5c91d Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 14:21:03 -0700 Subject: [PATCH 50/92] no toString() in pojo --- .../etor/messages/MessageHdDataType.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index 14f580e84..77275ac33 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -1,9 +1,5 @@ package gov.hhs.cdc.trustedintermediary.etor.messages; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - /** * This class represents the result of evaluating a FHIRPath expression, encapsulating specific * details extracted from a FHIR resource. This class holds values for namespace, universal @@ -47,13 +43,4 @@ public String getUniversalIdType() { public void setUniversalIdType(String universalIdType) { this.universalIdType = universalIdType; } - - @Override - public String toString() { - List filteredValues = - Stream.of(this.namespace, this.universalId, this.universalIdType) - .filter(s -> s != null && !s.isEmpty()) - .collect(Collectors.toList()); - return filteredValues.isEmpty() ? "" : String.join("^", filteredValues); - } } From 9fe816a8ddf2e24ac40347160126af96b2d8eeb4 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 14:26:41 -0700 Subject: [PATCH 51/92] fixed MessageHDDataTypeTest --- .../messages/MessageHdDataTypeTest.groovy | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy index 7fb20e149..0b06bac69 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataTypeTest.groovy @@ -11,49 +11,4 @@ class MessageHdDataTypeTest extends Specification { then: noExceptionThrown() } - - def "toString() happy path works"() { - given: - def namespace = "mock-namespace" - def universalId = "mock-universal-id" - def universalIdType = "mock-universal-id-type" - def expected = "${namespace}^${universalId}^${universalIdType}" - - when: - def messageDetails = new MessageHdDataType(namespace, universalId, universalIdType) - def actual = messageDetails.toString() - - then: - actual == expected - } - - def "toString() with null variable unhappy path works"() { - given: - def namespace = "mock-namespace" - def universalId = null - def universalIdType = "mock-universal-id-type" - def expected = "${namespace}^${universalIdType}" - - when: - def messageDetails = new MessageHdDataType(namespace, universalId, universalIdType) - def actual = messageDetails.toString() - - then: - actual == expected - } - - def "toString() with all null variables unhappy path works"() { - given: - def namespace = null - def universalId = null - def universalIdType = null - def expected = "" - - when: - def messageDetails = new MessageHdDataType(namespace, universalId, universalIdType) - def actual = messageDetails.toString() - - then: - actual == expected - } } From e7da57739f0dbceed98c77227f7dee63818f31c6 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 14:37:37 -0700 Subject: [PATCH 52/92] fixed ResultControllerTest failing tests --- .../etor/results/ResultControllerTest.groovy | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy index d6845e054..bf8348653 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy @@ -2,8 +2,7 @@ package gov.hhs.cdc.trustedintermediary.etor.results import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext import gov.hhs.cdc.trustedintermediary.domainconnector.DomainRequest -import gov.hhs.cdc.trustedintermediary.etor.orders.OrderController -import gov.hhs.cdc.trustedintermediary.etor.results.ResultController +import gov.hhs.cdc.trustedintermediary.external.hapi.HapiMessageHelper import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import gov.hhs.cdc.trustedintermediary.wrappers.MetricMetadata @@ -18,6 +17,8 @@ class ResultControllerTest extends Specification { TestApplicationContext.init() TestApplicationContext.register(ResultController, ResultController.getInstance()) TestApplicationContext.register(MetricMetadata, Mock(MetricMetadata)) + TestApplicationContext.register(HapiMessageHelper, HapiMessageHelper.getInstance()) + TestApplicationContext.injectRegisteredImplementations() } def "parseResults Happy path works"() { From d91f590643502f8c2a013b29a26efa394f5f62f6 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 14:38:15 -0700 Subject: [PATCH 53/92] fixed HapiReslutConverterTest failing tests --- .../external/hapi/HapiResultConverterTest.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy index c9cab4367..7cddefcfb 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy @@ -20,6 +20,7 @@ class HapiResultConverterTest extends Specification { TestApplicationContext.init() TestApplicationContext.register(ResultConverter, HapiResultConverter.getInstance()) TestApplicationContext.register(HapiMessageConverterHelper, HapiMessageConverterHelper.getInstance()) + TestApplicationContext.register(HapiMessageHelper, HapiMessageHelper.getInstance()) TestApplicationContext.injectRegisteredImplementations() mockPatient = new Patient() From 0266d2b56f95e0ce83de972f7afd1f6004825d16 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Wed, 3 Apr 2024 15:05:55 -0700 Subject: [PATCH 54/92] pojo -> record --- .../etor/messages/MessageHdDataType.java | 38 +------------------ .../external/hapi/HapiOrderTest.groovy | 37 +++++++++--------- 2 files changed, 19 insertions(+), 56 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index 77275ac33..a102a43bb 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -7,40 +7,4 @@ * in a concatenated string format. HD reference: HD-DataType */ -public class MessageHdDataType { - private String namespace; - private String universalId; - private String universalIdType; - - public MessageHdDataType(String namespace, String universalId, String universalIdType) { - this.namespace = namespace; - this.universalId = universalId; - this.universalIdType = universalIdType; - } - - public MessageHdDataType() {} - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public String getUniversalId() { - return universalId; - } - - public void setUniversalId(String universalId) { - this.universalId = universalId; - } - - public String getUniversalIdType() { - return universalIdType; - } - - public void setUniversalIdType(String universalIdType) { - this.universalIdType = universalIdType; - } -} +public record MessageHdDataType(String namespace, String universalId, String universalIdType) {} diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 70ec5619c..c835e337b 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -2,7 +2,6 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType -import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataTypeTest import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept @@ -141,9 +140,9 @@ class HapiOrderTest extends Specification { def actualApplicationDetails = orders.getSendingApplicationDetails() then: - actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() - actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() - actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getSendingApplicationDetails unhappy path works"() { @@ -158,9 +157,9 @@ class HapiOrderTest extends Specification { def actualApplicationDetails = orders.getSendingApplicationDetails() then: - actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() - actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() - actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getSendingFacilityDetails happy path works"() { @@ -204,9 +203,9 @@ class HapiOrderTest extends Specification { def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityDetails.getNamespace() == expectedFacilityDetails.getNamespace() - actualFacilityDetails.getUniversalId() == expectedFacilityDetails.getUniversalId() - actualFacilityDetails.getUniversalIdType() == expectedFacilityDetails.getUniversalIdType() + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } def "getSendingFacilityDetails unhappy path works"() { @@ -222,9 +221,9 @@ class HapiOrderTest extends Specification { def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityDetails.getNamespace() == expectedFacilityDetails.getNamespace() - actualFacilityDetails.getUniversalId() == expectedFacilityDetails.getUniversalId() - actualFacilityDetails.getUniversalIdType() == expectedFacilityDetails.getUniversalIdType() + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } def "getReceivingApplicationDetails happy path works"() { @@ -250,9 +249,9 @@ class HapiOrderTest extends Specification { def actualApplicationDetails = orders.getReceivingApplicationDetails() then: - actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() - actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() - actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getReceivingApplicationDetails unhappy path works"() { @@ -265,9 +264,9 @@ class HapiOrderTest extends Specification { def actualApplicationDetails = orders.getReceivingApplicationDetails() then: - actualApplicationDetails.getNamespace() == expectedApplicationDetails.getNamespace() - actualApplicationDetails.getUniversalId() == expectedApplicationDetails.getUniversalId() - actualApplicationDetails.getUniversalIdType() == expectedApplicationDetails.getUniversalIdType() + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getReceivingFacilityDetails happy path works"() { From b1919c4aed37a98341bc23f20d7e82faf27f1081 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 08:11:03 -0700 Subject: [PATCH 55/92] edit javadoc for pojo --- .../etor/messages/MessageHdDataType.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java index a102a43bb..9ff26d0ca 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/MessageHdDataType.java @@ -1,10 +1,9 @@ package gov.hhs.cdc.trustedintermediary.etor.messages; /** - * This class represents the result of evaluating a FHIRPath expression, encapsulating specific - * details extracted from a FHIR resource. This class holds values for namespace, universal - * identifier (ID), and the type of the universal ID, providing a mechanism to output these details - * in a concatenated string format. HD reference: HD-DataType */ public record MessageHdDataType(String namespace, String universalId, String universalIdType) {} From d969453a14c325d0eb059511d577e0cbc5c8b47b Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Thu, 4 Apr 2024 12:01:37 -0500 Subject: [PATCH 56/92] Update HapiResult unit tests --- .../external/hapi/HapiMessageHelper.java | 6 +- .../external/hapi/HapiResultTest.groovy | 167 +++++++++++++----- 2 files changed, 128 insertions(+), 45 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 4c2bdcef8..7ea765ff8 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -48,21 +48,21 @@ public class HapiMessageHelper { """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.1' + extension.value = 'HD.1' ).value """; public static final String RECEIVING_FACILITY_UNIVERSAL_ID = """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.2,HD.3' + extension.value = 'HD.2,HD.3' ).value """; public static final String RECEIVING_FACILITY_UNIVERSAL_ID_TYPE = """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.valueString = 'HD.2,HD.3' + extension.value = 'HD.2,HD.3' ).type.coding.code """; public static final String RECEIVING_APPLICATION_NAMESPACE = diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 8ee86c24a..04046aa4e 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -1,17 +1,9 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir -import org.hl7.fhir.r4.model.Bundle -import org.hl7.fhir.r4.model.CodeableConcept -import org.hl7.fhir.r4.model.Coding -import org.hl7.fhir.r4.model.Extension -import org.hl7.fhir.r4.model.Identifier -import org.hl7.fhir.r4.model.MessageHeader -import org.hl7.fhir.r4.model.Organization -import org.hl7.fhir.r4.model.Reference -import org.hl7.fhir.r4.model.ServiceRequest -import org.hl7.fhir.r4.model.StringType +import org.hl7.fhir.r4.model.* import spock.lang.Specification class HapiResultTest extends Specification { @@ -83,32 +75,46 @@ class HapiResultTest extends Specification { def "getSendingApplicationDetails works"() { given: - def expectedSendingApplicationId = "mock-sending-application-id" - def bundle = new Bundle() + def nameSpaceId = "Natus" + def innerResults = new Bundle() def messageHeader = new MessageHeader() - def extension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(expectedSendingApplicationId)) - messageHeader.setSource(new MessageHeader.MessageSourceComponent().addExtension(extension) as MessageHeader.MessageSourceComponent) - bundle.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def result = new HapiResult(bundle) + def endpoint = "urn:dns:natus.health.state.mn.us" + messageHeader.setSource(new MessageHeader.MessageSourceComponent(new UrlType(endpoint))) + def nameSpaceIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(nameSpaceId)) + messageHeader.getSource().addExtension(nameSpaceIdExtension) + def universalId = "natus.health.state.mn.us" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + messageHeader.getSource().addExtension(universalIdExtension) + def universalIdType = "DNS" + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + messageHeader.getSource().addExtension(universalIdTypeExtension) + def expectedApplicationDetails = new MessageHdDataType(nameSpaceId, universalId, universalIdType) + + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def orders = new HapiResult(innerResults) when: - def actualSendingApplicationId = result.getSendingApplicationDetails() + def actualApplicationDetails = orders.getSendingApplicationDetails() then: - actualSendingApplicationId == expectedSendingApplicationId + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getSendingApplicationDetails unhappy path"() { given: - def expectedSendingApplicationId = "" + def expectedApplicationDetails = new MessageHdDataType("", "", "") def bundle = new Bundle() def result = new HapiResult(bundle) when: - def actualSendingApplicationId = result.getSendingApplicationDetails() + def actualApplicationDetails = result.getSendingApplicationDetails() then: - actualSendingApplicationId == expectedSendingApplicationId + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getSendingFacilityDetails happy path works"() { @@ -144,65 +150,142 @@ class HapiResultTest extends Specification { organization.addIdentifier(facilityIdentifier) organization.addIdentifier(universalIdIdentifier) innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) - def orders = new HapiOrder(innerResults) - def expectedFacilityDetails = "$facilityName^$universalIdIdentifierValue^$theCode" + def parsedResults = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerResults), Bundle) + def results = new HapiResult(parsedResults) + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalIdIdentifierValue, theCode) when: - def actualFacilityDetails = orders.getSendingFacilityDetails() + def actualFacilityDetails = results.getSendingFacilityDetails() then: - actualFacilityDetails == expectedFacilityDetails + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } def "getSendingFacilityDetails unhappy path works"() { given: - def innerOrders = new Bundle() - def expectedFacilityDetails = "" + def innerResults = new Bundle() + def expectedFacilityDetails = new MessageHdDataType("", "", "") def messageHeader = new MessageHeader() - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiOrder(innerOrders) + def orders = new HapiResult(innerResults) when: def actualFacilityDetails = orders.getSendingFacilityDetails() then: - actualFacilityDetails == expectedFacilityDetails + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } def "getReceivingApplicationDetails works"() { given: - def expected = 1 + def innerResults = new Bundle() + def messageHeader = new MessageHeader() + def destination = new MessageHeader.MessageDestinationComponent() + def universalId = "1.2.840.114350.1.13.145.2.7.2.695071" + def name = "Epic" + def universalIdType = "ISO" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + def expectedApplicationDetails = new MessageHdDataType(name, universalId, universalIdType) + + destination.setName(name) + destination.addExtension(universalIdExtension) + destination.addExtension(universalIdTypeExtension) + messageHeader.setDestination([destination]) + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def results = new HapiResult(innerResults) + when: - def actual = 1 + def actualApplicationDetails = results.getReceivingApplicationDetails() + then: - actual == expected + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getReceivingApplicationDetails unhappy path"() { given: - def expected = 1 + def innerResults = new Bundle() + def results = new HapiResult(innerResults) + def expectedApplicationDetails = new MessageHdDataType("", "", "") + when: - def actual = 1 + def actualApplicationDetails = results.getReceivingApplicationDetails() + then: - actual == expected + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } def "getReceivingFacilityDetails works"() { given: - def expected = 1 + def innerResults = new Bundle() + def messageHeader = new MessageHeader() + def destination = new MessageHeader.MessageDestinationComponent(new UrlType("urn:oid:1.2.840.114350.1.13.145.2.7.2.695071")) + def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" + destination.setReceiver(new Reference(orgReference)) + messageHeader.setDestination(Arrays.asList(destination)) + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + + def organization = new Organization() + organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") + + // facility name + def facilityIdentifier = new Identifier() + def facilityName = "Samtracare" + def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + facilityIdentifier.addExtension(facilityNameExtension) + facilityIdentifier.setValue(facilityName) + + // universal id + def universalIdIdentifier = new Identifier() + def universalIdIdentifierValue = "Samtracare.com" + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + universalIdIdentifier.addExtension(universalIdExtension) + universalIdIdentifier.setValue(universalIdIdentifierValue) + + // Type + def typeConcept = new CodeableConcept() + def theCode = "DNS" + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", theCode, null) + typeConcept.addCoding(coding) + universalIdIdentifier.setType(typeConcept) + + organization.addIdentifier(facilityIdentifier) + organization.addIdentifier(universalIdIdentifier) + innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + def parsedResults = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerResults), Bundle) + def results = new HapiResult(parsedResults) + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalIdIdentifierValue, theCode) + when: - def actual = 1 + def actualFacilityDetails = results.getReceivingFacilityDetails() + then: - actual == expected + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } def "getReceivingFacilityDetails unhappy path"() { given: - def expected = 1 + def innerResults = new Bundle() + def results = new HapiResult(innerResults) + def expectedApplicationDetails = new MessageHdDataType("", "", "") + when: - def actual = 1 + def actualApplicationDetails = results.getReceivingFacilityDetails() + then: - actual == expected + actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() + actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() + actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } } From 3119aa17ffd30e1734962c57766c811d5f6e2e1b Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Thu, 4 Apr 2024 14:19:59 -0400 Subject: [PATCH 57/92] Create Message.java Added parent interface for order and result --- .../etor/messages/Message.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java new file mode 100644 index 000000000..be5a6527c --- /dev/null +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java @@ -0,0 +1,17 @@ +package gov.hhs.cdc.trustedintermediary.etor.messages; + +public interface Message { + T getUnderlyingElement(); + + String getFhirResourceId(); + + String getPlacerOrderNumber(); + + MessageHdDataType getSendingApplicationDetails(); + + MessageHdDataType getSendingFacilityDetails(); + + MessageHdDataType getReceivingApplicationDetails(); + + MessageHdDataType getReceivingFacilityDetails(); +} From 27f8f78c3bead596d541cecf34e79b184638b371 Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Thu, 4 Apr 2024 14:21:13 -0400 Subject: [PATCH 58/92] Make Order and Result extend Message Rename underlying method and refactor --- .../etor/orders/Order.java | 18 ++--------- .../etor/results/Result.java | 18 ++--------- .../external/hapi/HapiOrder.java | 2 +- .../external/hapi/HapiOrderConverter.java | 6 ++-- .../external/hapi/HapiResult.java | 2 +- .../external/hapi/HapiResultConverter.java | 2 +- .../reportstream/ReportStreamOrderSender.java | 2 +- .../ReportStreamResultSender.java | 2 +- .../cdc/trustedintermediary/OrderMock.groovy | 2 +- .../cdc/trustedintermediary/ResultMock.groovy | 2 +- .../hapi/HapiOrderConverterTest.groovy | 30 ++++++++----------- .../external/hapi/HapiOrderTest.groovy | 4 +-- .../hapi/HapiResultConverterTest.groovy | 4 +-- .../external/hapi/HapiResultTest.groovy | 4 +-- 14 files changed, 33 insertions(+), 65 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index 5e8e79fad..ad08c1391 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -1,26 +1,12 @@ package gov.hhs.cdc.trustedintermediary.etor.orders; -import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; +import gov.hhs.cdc.trustedintermediary.etor.messages.Message; /** * Interface to wrap a third-party lab order class (Ex: Hapi FHIR Bundle) * * @param The underlying FHIR lab order type. */ -public interface Order { - T getUnderlyingOrder(); - - String getFhirResourceId(); - +public interface Order extends Message { String getPatientId(); - - String getPlacerOrderNumber(); - - MessageHdDataType getSendingApplicationDetails(); - - MessageHdDataType getSendingFacilityDetails(); - - MessageHdDataType getReceivingApplicationDetails(); - - MessageHdDataType getReceivingFacilityDetails(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java index fa9a53d28..8843ae2d2 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java @@ -1,24 +1,10 @@ package gov.hhs.cdc.trustedintermediary.etor.results; -import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; +import gov.hhs.cdc.trustedintermediary.etor.messages.Message; /** * Interface to wrap a third-party lab result class (Ex: Hapi FHIR Bundle) * * @param The underlying FHIR lab result type. */ -public interface Result { - T getUnderlyingResult(); - - String getFhirResourceId(); - - String getPlacerOrderNumber(); - - MessageHdDataType getSendingApplicationDetails(); - - MessageHdDataType getSendingFacilityDetails(); - - MessageHdDataType getReceivingApplicationDetails(); - - MessageHdDataType getReceivingFacilityDetails(); -} +public interface Result extends Message {} diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 2e9026de6..65becf05b 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -23,7 +23,7 @@ public HapiOrder(Bundle innerOrder) { } @Override - public Bundle getUnderlyingOrder() { + public Bundle getUnderlyingElement() { return innerOrder; } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java index fdb0ff7d9..752003e16 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java @@ -96,7 +96,7 @@ public Order convertToOmlOrder(Order order) { logger.logInfo("Converting order to have OML metadata"); var hapiOrder = (Order) order; - var orderBundle = hapiOrder.getUnderlyingOrder(); + var orderBundle = hapiOrder.getUnderlyingElement(); var messageHeader = hapiMessageConverterHelper.findOrInitializeMessageHeader(orderBundle); messageHeader.setEvent(OML_CODING); @@ -109,7 +109,7 @@ public Order addContactSectionToPatientResource(Order order) { logger.logInfo("Adding contact section in Patient resource"); var hapiOrder = (Order) order; - var orderBundle = hapiOrder.getUnderlyingOrder(); + var orderBundle = hapiOrder.getUnderlyingElement(); HapiHelper.resourcesInBundle(orderBundle, Patient.class) .forEach( @@ -159,7 +159,7 @@ private MessageHeader createMessageHeader() { @Override public Order addEtorProcessingTag(Order message) { var hapiOrder = (Order) message; - var messageBundle = hapiOrder.getUnderlyingOrder(); + var messageBundle = hapiOrder.getUnderlyingElement(); hapiMessageConverterHelper.addEtorTagToBundle(messageBundle); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 5b7a86a63..38d055837 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -18,7 +18,7 @@ public HapiResult(Bundle innerResult) { } @Override - public Bundle getUnderlyingResult() { + public Bundle getUnderlyingElement() { return innerResult; } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java index ed7c9a21e..4d730cf91 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java @@ -27,7 +27,7 @@ private HapiResultConverter() {} @Override public Result addEtorProcessingTag(final Result message) { var hapiResult = (Result) message; - var messageBundle = hapiResult.getUnderlyingResult(); + var messageBundle = hapiResult.getUnderlyingElement(); hapiMessageConverterHelper.addEtorTagToBundle(messageBundle); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java index 63b20bd3d..5c3ad6c85 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java @@ -26,7 +26,7 @@ private ReportStreamOrderSender() {} @Override public Optional send(final Order order) throws UnableToSendMessageException { logger.logInfo("Sending the order to ReportStream"); - String json = fhir.encodeResourceToJson(order.getUnderlyingOrder()); + String json = fhir.encodeResourceToJson(order.getUnderlyingElement()); return sender.sendOrderToReportStream(json, order.getFhirResourceId()); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java index 38b22c452..428c1078e 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java @@ -29,7 +29,7 @@ private ReportStreamResultSender() {} @Override public Optional send(Result result) throws UnableToSendMessageException { logger.logInfo("Sending results to ReportStream"); - String json = fhir.encodeResourceToJson(result.getUnderlyingResult()); + String json = fhir.encodeResourceToJson(result.getUnderlyingElement()); return sender.sendResultToReportStream(json, result.getFhirResourceId()); } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index e7ba7438e..7869934c0 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -30,7 +30,7 @@ class OrderMock implements Order { } @Override - T getUnderlyingOrder() { + T getUnderlyingElement() { return this.underlyingOrders } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index 03470510b..6b7a00c61 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -29,7 +29,7 @@ class ResultMock implements Result { } @Override - T getUnderlyingResult() { + T getUnderlyingElement() { return this.underlyingResult } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy index 84fb84761..528b1a939 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy @@ -3,15 +3,11 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import gov.hhs.cdc.trustedintermediary.DemographicsMock import gov.hhs.cdc.trustedintermediary.OrderMock import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext -import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata -import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataMessageType import gov.hhs.cdc.trustedintermediary.etor.orders.OrderConverter -import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataStatus import org.hl7.fhir.r4.model.Address import org.hl7.fhir.r4.model.ContactPoint import org.hl7.fhir.r4.model.Extension import org.hl7.fhir.r4.model.HumanName -import org.hl7.fhir.r4.model.OperationOutcome import org.hl7.fhir.r4.model.StringType import java.time.Instant @@ -51,7 +47,7 @@ class HapiOrderConverterTest extends Specification { def "the converter fills in gaps of any missing data in the Bundle"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() then: orderBundle.hasId() @@ -71,7 +67,7 @@ class HapiOrderConverterTest extends Specification { mockDemographicsBundle.setTimestamp(mockTimestamp) when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() then: orderBundle.getId() == mockId @@ -85,7 +81,7 @@ class HapiOrderConverterTest extends Specification { mockDemographicsBundle.setType(Bundle.BundleType.COLLECTION) when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() then: orderBundle.getType() == Bundle.BundleType.MESSAGE @@ -94,7 +90,7 @@ class HapiOrderConverterTest extends Specification { def "the demographics correctly constructs a message header in the lab order"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() then: def messageHeader = orderBundle.getEntry().get(0).getResource() as MessageHeader @@ -112,7 +108,7 @@ class HapiOrderConverterTest extends Specification { def "the converter correctly reuses the patient from the passed in demographics"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() then: def patient = orderBundle.getEntry().get(1).getResource() as Patient @@ -123,7 +119,7 @@ class HapiOrderConverterTest extends Specification { def "the converter correctly constructs a service request in the lab order"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() then: def serviceRequest = orderBundle.getEntry().get(2).getResource() as ServiceRequest @@ -138,7 +134,7 @@ class HapiOrderConverterTest extends Specification { def "the order datetime should match for bundle, service request, and provenance resources"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingOrder() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() def bundleDateTime = orderBundle.getTimestamp() def serviceRequest = orderBundle.getEntry().get(2).getResource() as ServiceRequest def provenance = orderBundle.getEntry().get(3).getResource() as Provenance @@ -162,7 +158,7 @@ class HapiOrderConverterTest extends Specification { "ORM")))) when: - def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingOrder() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingElement() as Bundle then: def convertedMessageHeader = convertedOrderBundle.getEntry().get(1).getResource() as MessageHeader @@ -173,7 +169,7 @@ class HapiOrderConverterTest extends Specification { def "adds the message header to specify OML"() { when: - def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingOrder() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingElement() as Bundle then: def convertedMessageHeader = convertedOrderBundle.getEntry().get(1).getResource() as MessageHeader @@ -196,7 +192,7 @@ class HapiOrderConverterTest extends Specification { mockOrderBundle.setEntry(entryList) when: - def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingOrder() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingElement() as Bundle then: def convertedPatient = convertedOrderBundle.getEntry().get(0).getResource() as Patient @@ -240,10 +236,10 @@ class HapiOrderConverterTest extends Specification { messageHeader.setId(UUID.randomUUID().toString()) def messageHeaderEntry = new Bundle.BundleEntryComponent().setResource(messageHeader) mockOrderBundle.getEntry().add(1, messageHeaderEntry) - mockOrder.getUnderlyingOrder() >> mockOrderBundle + mockOrder.getUnderlyingElement() >> mockOrderBundle when: - def convertedOrderBundle = HapiOrderConverter.getInstance().addEtorProcessingTag(mockOrder).getUnderlyingOrder() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().addEtorProcessingTag(mockOrder).getUnderlyingElement() as Bundle then: def messageHeaders = convertedOrderBundle.getEntry().get(1).getResource() as MessageHeader @@ -265,7 +261,7 @@ class HapiOrderConverterTest extends Specification { entryList.add(patientEntry) mockOrderBundle.setEntry(entryList) when: - def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingOrder() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingElement() as Bundle then: def convertedPatient = convertedOrderBundle.getEntry().get(0).getResource() as Patient diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index c835e337b..2ebc35270 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -29,13 +29,13 @@ class HapiOrderTest extends Specification { TestApplicationContext.injectRegisteredImplementations() } - def "getUnderlyingOrder Works"() { + def "getUnderlyingElement Works"() { given: def expectedInnerOrder = new Bundle() def order = new HapiOrder(expectedInnerOrder) when: - def actualInnerOrder = order.getUnderlyingOrder() + def actualInnerOrder = order.getUnderlyingElement() then: actualInnerOrder == expectedInnerOrder diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy index 7cddefcfb..395591d89 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy @@ -38,10 +38,10 @@ class HapiResultConverterTest extends Specification { messageHeader.setId(UUID.randomUUID().toString()) def messageHeaderEntry = new Bundle.BundleEntryComponent().setResource(messageHeader) mockResultBundle.getEntry().add(1, messageHeaderEntry) - mockResult.getUnderlyingResult() >> mockResultBundle + mockResult.getUnderlyingElement() >> mockResultBundle when: - def convertedResultBundle = HapiResultConverter.getInstance().addEtorProcessingTag(mockResult).getUnderlyingResult() as Bundle + def convertedResultBundle = HapiResultConverter.getInstance().addEtorProcessingTag(mockResult).getUnderlyingElement() as Bundle then: def messageHeaders = convertedResultBundle.getEntry().get(1).getResource() as MessageHeader diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 04046aa4e..24f93079c 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -18,13 +18,13 @@ class HapiResultTest extends Specification { TestApplicationContext.injectRegisteredImplementations() } - def "getUnderlyingResult works"() { + def "getUnderlyingElement works"() { given: def expectedResult = new Bundle() def result = new HapiResult(expectedResult) when: - def actualResult = result.getUnderlyingResult() + def actualResult = result.getUnderlyingElement() then: actualResult == expectedResult From 0832e421de3351ac109cecf65d0c8ff94ab42096 Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Thu, 4 Apr 2024 14:28:33 -0400 Subject: [PATCH 59/92] Fixed missing rename --- .../trustedintermediary/etor/orders/OrderControllerTest.groovy | 2 +- .../etor/results/ResultControllerTest.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy index 580b4b313..3172fe033 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy @@ -34,7 +34,7 @@ class OrderControllerTest extends Specification { TestApplicationContext.injectRegisteredImplementations() when: - def actualBundle = controller.parseOrders(new DomainRequest()).underlyingOrder + def actualBundle = controller.parseOrders(new DomainRequest()).underlyingElement then: actualBundle == expectedBundle diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy index bf8348653..587951cd4 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy @@ -32,7 +32,7 @@ class ResultControllerTest extends Specification { TestApplicationContext.injectRegisteredImplementations() when: - def actualBundle = controller.parseResults(new DomainRequest()).underlyingResult + def actualBundle = controller.parseResults(new DomainRequest()).underlyingElement then: actualBundle == expectedBundle From a4992b27809a2e193064d66193fcf76ea9754513 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 11:48:23 -0700 Subject: [PATCH 60/92] unit test: receivingFacilityDetails happy path --- .../external/hapi/HapiOrderTest.groovy | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 2ebc35270..7e647a175 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -271,11 +271,54 @@ class HapiOrderTest extends Specification { def "getReceivingFacilityDetails happy path works"() { given: - def expected = 1 + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def organizationReference = "Organization/1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a" + def destination = new MessageHeader.MessageDestinationComponent() + destination.setReceiver(new Reference(organizationReference)) + messageHeader.addDestination(destination) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def organization = new Organization() + organization.setId("1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a") + + // Facility + def facilityName = "Central Hospital" + def identifierFacilityName = new Identifier() + def extensionFacilityName = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + identifierFacilityName.addExtension(extensionFacilityName) + identifierFacilityName.setValue(facilityName) + + // Universal ID + def universalId = "2.16.840.1.113883.3.4.5" + def identifierUniversalId = new Identifier() + def extensionUniversalId = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + identifierUniversalId.addExtension(extensionUniversalId) + identifierUniversalId.setValue(universalId) + + // Universal ID type + def universalIdType = "ISO" + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0203", universalIdType, null) + def typeCodeableConcept = new CodeableConcept() + typeCodeableConcept.addCoding(coding) + identifierUniversalId.setType(typeCodeableConcept) + + organization.addIdentifier(identifierFacilityName) + organization.addIdentifier(identifierUniversalId) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + + // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() + // as part of the fhir path. + def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) + def orders = new HapiOrder(jsonOrders) + + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) when: - def actual = 1 + def actualFacilityDetails = orders.getReceivingFacilityDetails() + then: - actual == expected + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } def "getReceivingFacilityDetails unhappy path works"() { From 9c598276194f1255a4ff14d4e9372843767d5a4b Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 12:05:16 -0700 Subject: [PATCH 61/92] unit test: getReceivingFacilityDetails unhappy path --- .../external/hapi/HapiOrderTest.groovy | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 7e647a175..0d36cad59 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -17,6 +17,8 @@ import org.hl7.fhir.r4.model.StringType import org.hl7.fhir.r4.model.UrlType import spock.lang.Specification +import javax.print.attribute.standard.Destination + class HapiOrderTest extends Specification { def fhirEngine = HapiFhirImplementation.getInstance() @@ -323,10 +325,26 @@ class HapiOrderTest extends Specification { def "getReceivingFacilityDetails unhappy path works"() { given: - def expected = 1 + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def organizationReference = "Organization/missing" + def destination = new MessageHeader.MessageDestinationComponent() + destination.setReceiver(new Reference(organizationReference)) + messageHeader.addDestination(destination) + def expectedFacilityDetails = new MessageHdDataType("", "", "") + + // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() + // as part of the fhir path. + def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) + def orders = new HapiOrder(jsonOrders) + when: - def actual = 1 + def actualFacilityDetails = orders.getReceivingFacilityDetails() + then: - actual == expected + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } } From 6f48e59e436dcb5d1276a98eb0af5000f1247422 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 12:18:16 -0700 Subject: [PATCH 62/92] skeleton for HapiMessageHelperTest --- .../hapi/HapiMessageHelperTest.groovy | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy new file mode 100644 index 000000000..db8e739c8 --- /dev/null +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy @@ -0,0 +1,57 @@ +package gov.hhs.cdc.trustedintermediary.external.hapi + +import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir +import spock.lang.Specification + +class HapiMessageHelperTest extends Specification { + + def fhirEngineMock = Mock(HapiFhir) + + void setup() { + TestApplicationContext.reset() + TestApplicationContext.init() + TestApplicationContext.register(HapiFhir.class, fhirEngineMock) + TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) + TestApplicationContext.injectRegisteredImplementations() + } + + def "extractPlacerOrderNumber works"() { + } + + def "extractSendingApplicationNamespace works"() { + } + + def "extractSendingApplicationUniversalId works"() { + } + + def "extractSendingApplicationUniversalIdType works"() { + } + + def "extractSendingFacilityNamespace works"() { + } + + def "extractSendingFacilityUniversalId works"() { + } + + def "extractSendingFacilityUniversalIdType works"() { + } + + def "extractReceivingApplicationNamespace works"() { + } + + def "extractReceivingApplicationUniversalId works"() { + } + + def "extractReceivingApplicationUniversalIdType works"() { + } + + def "extractReceivingFacilityNamespace works"() { + } + + def "extractReceivingFacilityUniversalId works"() { + } + + def "extractReceivingFacilityUniversalIdType works"() { + } +} From ea8134f14ee99f934639cb233b8f6d65135d3f47 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 12:37:56 -0700 Subject: [PATCH 63/92] remove spaces from text blocks --- .../external/hapi/HapiMessageHelper.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 7ea765ff8..7e8ee7691 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -14,9 +14,9 @@ public class HapiMessageHelper { public static final String SENDING_FACILITY_NAMESPACE = """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.1' - ).value + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.1' + ).value """; public static final String SENDING_FACILITY_UNIVERSAL_ID = """ @@ -54,16 +54,16 @@ public class HapiMessageHelper { public static final String RECEIVING_FACILITY_UNIVERSAL_ID = """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).value + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).value """; public static final String RECEIVING_FACILITY_UNIVERSAL_ID_TYPE = """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).type.coding.code + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).type.coding.code """; public static final String RECEIVING_APPLICATION_NAMESPACE = """ From 7c65c82f6d10966f2c13f62cb522d2e51d7b5701 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Thu, 4 Apr 2024 15:20:09 -0500 Subject: [PATCH 64/92] Extract Fhir paths to new FhirPath enum in a new plugin directory - any new plugins can be added to this directory --- .../external/hapi/HapiMessageHelper.java | 109 ++++-------------- .../plugin/path/FhirPath.java | 83 +++++++++++++ 2 files changed, 107 insertions(+), 85 deletions(-) create mode 100644 etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 7ea765ff8..c904324f2 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -1,83 +1,12 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; +import gov.hhs.cdc.trustedintermediary.plugin.path.FhirPath; import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir; import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; public class HapiMessageHelper { - public static final String PLACER_ORDER_NUMBER = - """ - Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value - """; - - public static final String SENDING_FACILITY_NAMESPACE = - """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.1' - ).value - """; - public static final String SENDING_FACILITY_UNIVERSAL_ID = - """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).value - """; - public static final String SENDING_FACILITY_UNIVERSAL_ID_TYPE = - """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).type.coding.code - """; - public static final String SENDING_APPLICATION_NAMESPACE = - """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value - """; - public static final String SENDING_APPLICATION_UNIVERSAL_ID = - """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value - """; - public static final String SENDING_APPLICATION_UNIVERSAL_ID_TYPE = - """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value - """; - public static final String RECEIVING_FACILITY_NAMESPACE = - """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.1' - ).value - """; - public static final String RECEIVING_FACILITY_UNIVERSAL_ID = - """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).value - """; - public static final String RECEIVING_FACILITY_UNIVERSAL_ID_TYPE = - """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).type.coding.code - """; - public static final String RECEIVING_APPLICATION_NAMESPACE = - """ - Bundle.entry.resource.ofType(MessageHeader).destination.name - """; - public static final String RECEIVING_APPLICATION_UNIVERSAL_ID = - """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value - """; - public static final String RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE = - """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value - """; - private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); @Inject private HapiFhir fhirEngine; @@ -89,57 +18,67 @@ public static HapiMessageHelper getInstance() { private HapiMessageHelper() {} public String extractPlacerOrderNumber(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, PLACER_ORDER_NUMBER); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.PLACER_ORDER_NUMBER.getPath()); } public String extractSendingApplicationNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_APPLICATION_NAMESPACE); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.SENDING_APPLICATION_NAMESPACE.getPath()); } public String extractSendingApplicationUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_APPLICATION_UNIVERSAL_ID); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.SENDING_APPLICATION_UNIVERSAL_ID.getPath()); } public String extractSendingApplicationUniversalIdType(Bundle messageBundle) { return fhirEngine.getStringFromFhirPath( - messageBundle, SENDING_APPLICATION_UNIVERSAL_ID_TYPE); + messageBundle, FhirPath.SENDING_APPLICATION_UNIVERSAL_ID_TYPE.getPath()); } public String extractSendingFacilityNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_FACILITY_NAMESPACE); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.SENDING_FACILITY_NAMESPACE.getPath()); } public String extractSendingFacilityUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_FACILITY_UNIVERSAL_ID); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.SENDING_FACILITY_UNIVERSAL_ID.getPath()); } public String extractSendingFacilityUniversalIdType(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, SENDING_FACILITY_UNIVERSAL_ID_TYPE); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.SENDING_FACILITY_UNIVERSAL_ID_TYPE.getPath()); } public String extractReceivingApplicationNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_APPLICATION_NAMESPACE); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.RECEIVING_APPLICATION_NAMESPACE.getPath()); } public String extractReceivingApplicationUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_APPLICATION_UNIVERSAL_ID); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.RECEIVING_APPLICATION_UNIVERSAL_ID.getPath()); } public String extractReceivingApplicationUniversalIdType(Bundle messageBundle) { return fhirEngine.getStringFromFhirPath( - messageBundle, RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE); + messageBundle, FhirPath.RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE.getPath()); } public String extractReceivingFacilityNamespace(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_FACILITY_NAMESPACE); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.RECEIVING_FACILITY_NAMESPACE.getPath()); } public String extractReceivingFacilityUniversalId(Bundle messageBundle) { - return fhirEngine.getStringFromFhirPath(messageBundle, RECEIVING_FACILITY_UNIVERSAL_ID); + return fhirEngine.getStringFromFhirPath( + messageBundle, FhirPath.RECEIVING_FACILITY_UNIVERSAL_ID.getPath()); } public String extractReceivingFacilityUniversalIdType(Bundle messageBundle) { return fhirEngine.getStringFromFhirPath( - messageBundle, RECEIVING_FACILITY_UNIVERSAL_ID_TYPE); + messageBundle, FhirPath.RECEIVING_FACILITY_UNIVERSAL_ID_TYPE.getPath()); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java new file mode 100644 index 000000000..379aa634f --- /dev/null +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java @@ -0,0 +1,83 @@ +package gov.hhs.cdc.trustedintermediary.plugin.path; + +public enum FhirPath { + PLACER_ORDER_NUMBER( + """ + Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"""), + SENDING_FACILITY_NAMESPACE( + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.1' + ).value + """), + SENDING_FACILITY_UNIVERSAL_ID( + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).value + """), + SENDING_FACILITY_UNIVERSAL_ID_TYPE( + """ + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).type.coding.code + """), + SENDING_APPLICATION_NAMESPACE( + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value + """), + SENDING_APPLICATION_UNIVERSAL_ID( + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value + """), + SENDING_APPLICATION_UNIVERSAL_ID_TYPE( + """ + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value + """), + RECEIVING_FACILITY_NAMESPACE( + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.1' + ).value + """), + RECEIVING_FACILITY_UNIVERSAL_ID( + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).value + """), + RECEIVING_FACILITY_UNIVERSAL_ID_TYPE( + """ + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).type.coding.code + """), + RECEIVING_APPLICATION_NAMESPACE( + """ + Bundle.entry.resource.ofType(MessageHeader).destination.name + """), + RECEIVING_APPLICATION_UNIVERSAL_ID( + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value + """), + RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE( + """ + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value + """); + + private final String path; + + FhirPath(String path) { + this.path = path; + } + + public String getPath() { + return path; + } +} From 71b93a0801e03d2633bb6a6060b8b747986ee765 Mon Sep 17 00:00:00 2001 From: saquino0827 Date: Thu, 4 Apr 2024 15:28:39 -0500 Subject: [PATCH 65/92] Fix HapiFhir injection for HapiMessageHelper --- .../trustedintermediary/external/hapi/HapiMessageHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index c904324f2..2f826fbf4 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -9,7 +9,7 @@ public class HapiMessageHelper { private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); - @Inject private HapiFhir fhirEngine; + @Inject HapiFhir fhirEngine; public static HapiMessageHelper getInstance() { return INSTANCE; From 8390285bb3b588dff9c5b560c15cb9dd71248df8 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 14:41:05 -0700 Subject: [PATCH 66/92] deleted redundant test: HapiMessageHelperTest --- .../hapi/HapiMessageHelperTest.groovy | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy deleted file mode 100644 index db8e739c8..000000000 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelperTest.groovy +++ /dev/null @@ -1,57 +0,0 @@ -package gov.hhs.cdc.trustedintermediary.external.hapi - -import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext -import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir -import spock.lang.Specification - -class HapiMessageHelperTest extends Specification { - - def fhirEngineMock = Mock(HapiFhir) - - void setup() { - TestApplicationContext.reset() - TestApplicationContext.init() - TestApplicationContext.register(HapiFhir.class, fhirEngineMock) - TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) - TestApplicationContext.injectRegisteredImplementations() - } - - def "extractPlacerOrderNumber works"() { - } - - def "extractSendingApplicationNamespace works"() { - } - - def "extractSendingApplicationUniversalId works"() { - } - - def "extractSendingApplicationUniversalIdType works"() { - } - - def "extractSendingFacilityNamespace works"() { - } - - def "extractSendingFacilityUniversalId works"() { - } - - def "extractSendingFacilityUniversalIdType works"() { - } - - def "extractReceivingApplicationNamespace works"() { - } - - def "extractReceivingApplicationUniversalId works"() { - } - - def "extractReceivingApplicationUniversalIdType works"() { - } - - def "extractReceivingFacilityNamespace works"() { - } - - def "extractReceivingFacilityUniversalId works"() { - } - - def "extractReceivingFacilityUniversalIdType works"() { - } -} From 46595faec5563096f42a053ab3cec7b9ac5a5063 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 17:10:09 -0700 Subject: [PATCH 67/92] clear white spaces from long fhir paths --- .../plugin/path/FhirPath.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java index 379aa634f..2c866fd5d 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java @@ -6,25 +6,25 @@ public enum FhirPath { Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"""), SENDING_FACILITY_NAMESPACE( """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.1' - ).value - """), + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.1' + ).value + """), SENDING_FACILITY_UNIVERSAL_ID( """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).value - """), + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).value + """), SENDING_FACILITY_UNIVERSAL_ID_TYPE( """ - Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).type.coding.code - """), + Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).type.coding.code + """), SENDING_APPLICATION_NAMESPACE( """ Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value @@ -39,25 +39,25 @@ public enum FhirPath { """), RECEIVING_FACILITY_NAMESPACE( """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.1' - ).value - """), + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.1' + ).value + """), RECEIVING_FACILITY_UNIVERSAL_ID( """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).value - """), + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).value + """), RECEIVING_FACILITY_UNIVERSAL_ID_TYPE( """ - Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( - extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and - extension.value = 'HD.2,HD.3' - ).type.coding.code - """), + Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( + extension.url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field' and + extension.value = 'HD.2,HD.3' + ).type.coding.code + """), RECEIVING_APPLICATION_NAMESPACE( """ Bundle.entry.resource.ofType(MessageHeader).destination.name From b75f4dd608a0a254c6582cf7a3a003cdede117a9 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Thu, 4 Apr 2024 17:17:02 -0700 Subject: [PATCH 68/92] clear white spaces from short fhir paths --- .../plugin/path/FhirPath.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java index 2c866fd5d..168424511 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java @@ -3,7 +3,8 @@ public enum FhirPath { PLACER_ORDER_NUMBER( """ - Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value"""), + Bundle.entry.resource.ofType(ServiceRequest).identifier.where(type.coding.code = 'PLAC').value + """), SENDING_FACILITY_NAMESPACE( """ Bundle.entry.resource.ofType(MessageHeader).sender.resolve().identifier.where( @@ -27,16 +28,16 @@ public enum FhirPath { """), SENDING_APPLICATION_NAMESPACE( """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value - """), + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id').value + """), SENDING_APPLICATION_UNIVERSAL_ID( """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value - """), + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value + """), SENDING_APPLICATION_UNIVERSAL_ID_TYPE( """ - Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value - """), + Bundle.entry.resource.ofType(MessageHeader).source.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value + """), RECEIVING_FACILITY_NAMESPACE( """ Bundle.entry.resource.ofType(MessageHeader).destination.receiver.resolve().identifier.where( @@ -60,16 +61,16 @@ public enum FhirPath { """), RECEIVING_APPLICATION_NAMESPACE( """ - Bundle.entry.resource.ofType(MessageHeader).destination.name - """), + Bundle.entry.resource.ofType(MessageHeader).destination.name + """), RECEIVING_APPLICATION_UNIVERSAL_ID( """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value - """), + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id').value + """), RECEIVING_APPLICATION_UNIVERSAL_ID_TYPE( """ - Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value - """); + Bundle.entry.resource.ofType(MessageHeader).destination.extension.where(url = 'https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type').value + """); private final String path; From ed83d187d44d9763e21a015d2e3aec39ce0d6b01 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 00:57:56 -0700 Subject: [PATCH 69/92] refactor: HapiOrderTest --- .../external/hapi/HapiOrderTest.groovy | 220 +++++++++--------- 1 file changed, 110 insertions(+), 110 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 0d36cad59..9c0679284 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -107,8 +107,7 @@ class HapiOrderTest extends Specification { def "getPlacerOrderNumber unhappy path"() { given: - def innerOrders = new Bundle() - def orders = new HapiOrder(innerOrders) + def orders = setupOrderWithEmptyMessageHeader() def expectedPlacerOrderNumber = "" when: @@ -121,23 +120,11 @@ class HapiOrderTest extends Specification { def "getSendingApplicationDetails happy path works"() { given: def nameSpaceId = "Natus" - def innerOrders = new Bundle() - def messageHeader = new MessageHeader() - def endpoint = "urn:dns:natus.health.state.mn.us" - messageHeader.setSource(new MessageHeader.MessageSourceComponent(new UrlType(endpoint))) - def nameSpaceIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(nameSpaceId)) - messageHeader.getSource().addExtension(nameSpaceIdExtension) def universalId = "natus.health.state.mn.us" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) - messageHeader.getSource().addExtension(universalIdExtension) def universalIdType = "DNS" - def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) - messageHeader.getSource().addExtension(universalIdTypeExtension) + def orders = setupOrderWithSendingApplicationDetails(nameSpaceId, universalId, universalIdType) def expectedApplicationDetails = new MessageHdDataType(nameSpaceId, universalId, universalIdType) - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiOrder(innerOrders) - when: def actualApplicationDetails = orders.getSendingApplicationDetails() @@ -150,10 +137,7 @@ class HapiOrderTest extends Specification { def "getSendingApplicationDetails unhappy path works"() { given: def expectedApplicationDetails = new MessageHdDataType("", "", "") - def innerOrders = new Bundle() - MessageHeader messageHeader = new MessageHeader() - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiOrder(innerOrders) + def orders = setupOrderWithEmptyMessageHeader() when: def actualApplicationDetails = orders.getSendingApplicationDetails() @@ -166,40 +150,11 @@ class HapiOrderTest extends Specification { def "getSendingFacilityDetails happy path works"() { given: - def innerOrders = new Bundle() - - def messageHeader = new MessageHeader() - def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" - messageHeader.setSender(new Reference(orgReference)) - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - - def organization = new Organization() - organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") - // facility name - def facilityIdentifier = new Identifier() def facilityName = "MN Public Health Lab" - def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) - facilityIdentifier.addExtension(facilityNameExtension) - facilityIdentifier.setValue(facilityName) - // universal id - def universalIdIdentifier = new Identifier() - def universalIdIdentifierValue = "2.16.840.1.114222.4.1.10080" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) - universalIdIdentifier.addExtension(universalIdExtension) - universalIdIdentifier.setValue(universalIdIdentifierValue) - // Type - def typeConcept = new CodeableConcept() - def theCode = "ISO" - def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", theCode, null) - typeConcept.addCoding(coding) - universalIdIdentifier.setType(typeConcept) - - organization.addIdentifier(facilityIdentifier) - organization.addIdentifier(universalIdIdentifier) - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) - def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) - def orders = new HapiOrder(jsonOrders) - def expectedFacilityDetails = new MessageHdDataType(facilityName, universalIdIdentifierValue, theCode) + def universalId = "2.16.840.1.114222.4.1.10080" + def universalIdType = "ISO" + def orders = setupOrderWithSendingFacilityDetails(facilityName, universalId, universalIdType) + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) when: def actualFacilityDetails = orders.getSendingFacilityDetails() @@ -212,12 +167,8 @@ class HapiOrderTest extends Specification { def "getSendingFacilityDetails unhappy path works"() { given: - def innerOrders = new Bundle() def expectedFacilityDetails = new MessageHdDataType("", "", "") - def messageHeader = new MessageHeader() - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - - def orders = new HapiOrder(innerOrders) + def orders = setupOrderWithEmptyMessageHeader() when: def actualFacilityDetails = orders.getSendingFacilityDetails() @@ -230,22 +181,11 @@ class HapiOrderTest extends Specification { def "getReceivingApplicationDetails happy path works"() { given: - def innerOrders = new Bundle() - def messageHeader = new MessageHeader() - def destination = new MessageHeader.MessageDestinationComponent() def universalId = "1.2.840.114350.1.13.145.2.7.2.695071" - def name = "Epic" + def namespaceId = "Epic" def universalIdType = "ISO" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) - def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) - def expectedApplicationDetails = new MessageHdDataType(name, universalId, universalIdType) - - destination.setName(name) - destination.addExtension(universalIdExtension) - destination.addExtension(universalIdTypeExtension) - messageHeader.setDestination([destination]) - innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiOrder(innerOrders) + def expectedApplicationDetails = new MessageHdDataType(namespaceId, universalId, universalIdType) + def orders = setupOrderWithReceivingApplicationDetails(namespaceId, universalId, universalIdType) when: def actualApplicationDetails = orders.getReceivingApplicationDetails() @@ -258,8 +198,7 @@ class HapiOrderTest extends Specification { def "getReceivingApplicationDetails unhappy path works"() { given: - def innerOrders = new Bundle() - def orders = new HapiOrder(innerOrders) + def orders = setupOrderWithEmptyMessageHeader() def expectedApplicationDetails = new MessageHdDataType("", "", "") when: @@ -273,6 +212,100 @@ class HapiOrderTest extends Specification { def "getReceivingFacilityDetails happy path works"() { given: + def facilityName = "Central Hospital" + def universalId = "2.16.840.1.113883.3.4.5" + def universalIdType = "ISO" + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) + def orders = setupOrderWithReceivingFacilityDetails(facilityName, universalId, universalIdType) + + when: + def actualFacilityDetails = orders.getReceivingFacilityDetails() + + then: + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() + } + + def "getReceivingFacilityDetails unhappy path works"() { + given: + def expectedFacilityDetails = new MessageHdDataType("", "", "") + def orders = setupOrderWithEmptyMessageHeader() + + when: + def actualFacilityDetails = orders.getReceivingFacilityDetails() + + then: + actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() + actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() + actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() + } + + protected HapiOrder setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def endpoint = "urn:dns:natus.health.state.mn.us" + messageHeader.setSource(new MessageHeader.MessageSourceComponent(new UrlType(endpoint))) + def nameSpaceIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(nameSpaceId)) + messageHeader.getSource().addExtension(nameSpaceIdExtension) + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + messageHeader.getSource().addExtension(universalIdExtension) + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + messageHeader.getSource().addExtension(universalIdTypeExtension) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + return new HapiOrder(innerOrders) + } + + protected HapiOrder setupOrderWithSendingFacilityDetails(String facilityName, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" + messageHeader.setSender(new Reference(orgReference)) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def organization = new Organization() + organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") + // facility name + def facilityIdentifier = new Identifier() + def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + facilityIdentifier.addExtension(facilityNameExtension) + facilityIdentifier.setValue(facilityName) + // universal id + def universalIdIdentifier = new Identifier() + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + universalIdIdentifier.addExtension(universalIdExtension) + universalIdIdentifier.setValue(universalId) + // Type + def typeConcept = new CodeableConcept() + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", universalIdType, null) + typeConcept.addCoding(coding) + universalIdIdentifier.setType(typeConcept) + + organization.addIdentifier(facilityIdentifier) + organization.addIdentifier(universalIdIdentifier) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + + // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() + // as part of the fhir path. + def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) + return new HapiOrder(jsonOrders) + } + + protected HapiOrder setupOrderWithReceivingApplicationDetails(String namespaceId, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def destination = new MessageHeader.MessageDestinationComponent() + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + + destination.setName(namespaceId) + destination.addExtension(universalIdExtension) + destination.addExtension(universalIdTypeExtension) + messageHeader.setDestination([destination]) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + return new HapiOrder(innerOrders) + } + + protected HapiOrder setupOrderWithReceivingFacilityDetails(String facilityName, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def organizationReference = "Organization/1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a" @@ -282,23 +315,17 @@ class HapiOrderTest extends Specification { innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def organization = new Organization() organization.setId("1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a") - // Facility - def facilityName = "Central Hospital" def identifierFacilityName = new Identifier() def extensionFacilityName = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) identifierFacilityName.addExtension(extensionFacilityName) identifierFacilityName.setValue(facilityName) - // Universal ID - def universalId = "2.16.840.1.113883.3.4.5" def identifierUniversalId = new Identifier() def extensionUniversalId = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) identifierUniversalId.addExtension(extensionUniversalId) identifierUniversalId.setValue(universalId) - // Universal ID type - def universalIdType = "ISO" def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0203", universalIdType, null) def typeCodeableConcept = new CodeableConcept() typeCodeableConcept.addCoding(coding) @@ -311,40 +338,13 @@ class HapiOrderTest extends Specification { // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() // as part of the fhir path. def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) - def orders = new HapiOrder(jsonOrders) - - def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) - when: - def actualFacilityDetails = orders.getReceivingFacilityDetails() - - then: - actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() - actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() - actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() + return new HapiOrder(jsonOrders) } - def "getReceivingFacilityDetails unhappy path works"() { - given: + protected HapiOrder setupOrderWithEmptyMessageHeader() { def innerOrders = new Bundle() - def messageHeader = new MessageHeader() + MessageHeader messageHeader = new MessageHeader() innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def organizationReference = "Organization/missing" - def destination = new MessageHeader.MessageDestinationComponent() - destination.setReceiver(new Reference(organizationReference)) - messageHeader.addDestination(destination) - def expectedFacilityDetails = new MessageHdDataType("", "", "") - - // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() - // as part of the fhir path. - def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) - def orders = new HapiOrder(jsonOrders) - - when: - def actualFacilityDetails = orders.getReceivingFacilityDetails() - - then: - actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() - actualFacilityDetails.universalId() == expectedFacilityDetails.universalId() - actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() + return new HapiOrder(innerOrders) } } From c0ffbf688aa3d58208d822208386017f1d76d6b6 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:00:39 -0700 Subject: [PATCH 70/92] add helper methods to HapiResultTest --- .../external/hapi/HapiResultTest.groovy | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 24f93079c..26cd0a9be 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -288,4 +288,111 @@ class HapiResultTest extends Specification { actualApplicationDetails.universalId() == expectedApplicationDetails.universalId() actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } + + protected HapiOrder setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def endpoint = "urn:dns:natus.health.state.mn.us" + messageHeader.setSource(new MessageHeader.MessageSourceComponent(new UrlType(endpoint))) + def nameSpaceIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(nameSpaceId)) + messageHeader.getSource().addExtension(nameSpaceIdExtension) + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + messageHeader.getSource().addExtension(universalIdExtension) + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + messageHeader.getSource().addExtension(universalIdTypeExtension) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + return new HapiOrder(innerOrders) + } + + protected HapiOrder setupOrderWithSendingFacilityDetails(String facilityName, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" + messageHeader.setSender(new Reference(orgReference)) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def organization = new Organization() + organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") + // facility name + def facilityIdentifier = new Identifier() + def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + facilityIdentifier.addExtension(facilityNameExtension) + facilityIdentifier.setValue(facilityName) + // universal id + def universalIdIdentifier = new Identifier() + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + universalIdIdentifier.addExtension(universalIdExtension) + universalIdIdentifier.setValue(universalId) + // Type + def typeConcept = new CodeableConcept() + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", universalIdType, null) + typeConcept.addCoding(coding) + universalIdIdentifier.setType(typeConcept) + + organization.addIdentifier(facilityIdentifier) + organization.addIdentifier(universalIdIdentifier) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + + // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() + // as part of the fhir path. + def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) + return new HapiOrder(jsonOrders) + } + + protected HapiOrder setupOrderWithReceivingApplicationDetails(String namespaceId, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def destination = new MessageHeader.MessageDestinationComponent() + def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) + def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) + + destination.setName(namespaceId) + destination.addExtension(universalIdExtension) + destination.addExtension(universalIdTypeExtension) + messageHeader.setDestination([destination]) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + return new HapiOrder(innerOrders) + } + + protected HapiOrder setupOrderWithReceivingFacilityDetails(String facilityName, String universalId, String universalIdType) { + def innerOrders = new Bundle() + def messageHeader = new MessageHeader() + def organizationReference = "Organization/1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a" + def destination = new MessageHeader.MessageDestinationComponent() + destination.setReceiver(new Reference(organizationReference)) + messageHeader.addDestination(destination) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + def organization = new Organization() + organization.setId("1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a") + // Facility + def identifierFacilityName = new Identifier() + def extensionFacilityName = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) + identifierFacilityName.addExtension(extensionFacilityName) + identifierFacilityName.setValue(facilityName) + // Universal ID + def identifierUniversalId = new Identifier() + def extensionUniversalId = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) + identifierUniversalId.addExtension(extensionUniversalId) + identifierUniversalId.setValue(universalId) + // Universal ID type + def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0203", universalIdType, null) + def typeCodeableConcept = new CodeableConcept() + typeCodeableConcept.addCoding(coding) + identifierUniversalId.setType(typeCodeableConcept) + + organization.addIdentifier(identifierFacilityName) + organization.addIdentifier(identifierUniversalId) + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) + + // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() + // as part of the fhir path. + def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) + return new HapiOrder(jsonOrders) + } + + protected HapiOrder setupOrderWithEmptyMessageHeader() { + def innerOrders = new Bundle() + MessageHeader messageHeader = new MessageHeader() + innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) + return new HapiOrder(innerOrders) + } } From 8018bc69c4facb55e961a1565b29b0e2ec32aac1 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:04:34 -0700 Subject: [PATCH 71/92] refactor: HapiResultTest-unhappy path cases --- .../external/hapi/HapiResultTest.groovy | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 26cd0a9be..8b885be9e 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -63,8 +63,7 @@ class HapiResultTest extends Specification { def "getPlacerOrderNumber unhappy path"() { given: def expectedPlacerOrderNumber = "" - def bundle = new Bundle() - def result = new HapiResult(bundle) + def result = setupOrderWithEmptyMessageHeader() when: def actualPlacerOrderNumber = result.getPlacerOrderNumber() @@ -105,8 +104,7 @@ class HapiResultTest extends Specification { def "getSendingApplicationDetails unhappy path"() { given: def expectedApplicationDetails = new MessageHdDataType("", "", "") - def bundle = new Bundle() - def result = new HapiResult(bundle) + def result = setupOrderWithEmptyMessageHeader() when: def actualApplicationDetails = result.getSendingApplicationDetails() @@ -165,12 +163,8 @@ class HapiResultTest extends Specification { def "getSendingFacilityDetails unhappy path works"() { given: - def innerResults = new Bundle() def expectedFacilityDetails = new MessageHdDataType("", "", "") - def messageHeader = new MessageHeader() - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - - def orders = new HapiResult(innerResults) + def orders = setupOrderWithEmptyMessageHeader() when: def actualFacilityDetails = orders.getSendingFacilityDetails() @@ -211,8 +205,7 @@ class HapiResultTest extends Specification { def "getReceivingApplicationDetails unhappy path"() { given: - def innerResults = new Bundle() - def results = new HapiResult(innerResults) + def results = setupOrderWithEmptyMessageHeader() def expectedApplicationDetails = new MessageHdDataType("", "", "") when: @@ -276,8 +269,7 @@ class HapiResultTest extends Specification { def "getReceivingFacilityDetails unhappy path"() { given: - def innerResults = new Bundle() - def results = new HapiResult(innerResults) + def results = setupOrderWithEmptyMessageHeader() def expectedApplicationDetails = new MessageHdDataType("", "", "") when: From f6fb1b57c3aeb53ec1c201629ade565aced0052d Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:07:39 -0700 Subject: [PATCH 72/92] refactor: HapiResultTest-getSendingApplicationDetails --- .../external/hapi/HapiResultTest.groovy | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 8b885be9e..a7e3511d5 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -75,22 +75,10 @@ class HapiResultTest extends Specification { def "getSendingApplicationDetails works"() { given: def nameSpaceId = "Natus" - def innerResults = new Bundle() - def messageHeader = new MessageHeader() - def endpoint = "urn:dns:natus.health.state.mn.us" - messageHeader.setSource(new MessageHeader.MessageSourceComponent(new UrlType(endpoint))) - def nameSpaceIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/namespace-id", new StringType(nameSpaceId)) - messageHeader.getSource().addExtension(nameSpaceIdExtension) def universalId = "natus.health.state.mn.us" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) - messageHeader.getSource().addExtension(universalIdExtension) def universalIdType = "DNS" - def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) - messageHeader.getSource().addExtension(universalIdTypeExtension) def expectedApplicationDetails = new MessageHdDataType(nameSpaceId, universalId, universalIdType) - - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def orders = new HapiResult(innerResults) + def orders = setupOrderWithSendingApplicationDetails(nameSpaceId, universalId, universalIdType) when: def actualApplicationDetails = orders.getSendingApplicationDetails() From 50fd3791492b0af8a76fdc9185cde224bb0c203f Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:10:34 -0700 Subject: [PATCH 73/92] refactor: HapiResultTest-getSendingFacilityDetails --- .../external/hapi/HapiResultTest.groovy | 37 ++----------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index a7e3511d5..5bc8061ff 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -105,40 +105,11 @@ class HapiResultTest extends Specification { def "getSendingFacilityDetails happy path works"() { given: - def innerResults = new Bundle() - - def messageHeader = new MessageHeader() - def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" - messageHeader.setSender(new Reference(orgReference)) - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - - def organization = new Organization() - organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") - // facility name - def facilityIdentifier = new Identifier() def facilityName = "MN Public Health Lab" - def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) - facilityIdentifier.addExtension(facilityNameExtension) - facilityIdentifier.setValue(facilityName) - // universal id - def universalIdIdentifier = new Identifier() - def universalIdIdentifierValue = "2.16.840.1.114222.4.1.10080" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) - universalIdIdentifier.addExtension(universalIdExtension) - universalIdIdentifier.setValue(universalIdIdentifierValue) - // Type - def typeConcept = new CodeableConcept() - def theCode = "ISO" - def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", theCode, null) - typeConcept.addCoding(coding) - universalIdIdentifier.setType(typeConcept) - - organization.addIdentifier(facilityIdentifier) - organization.addIdentifier(universalIdIdentifier) - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) - def parsedResults = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerResults), Bundle) - def results = new HapiResult(parsedResults) - def expectedFacilityDetails = new MessageHdDataType(facilityName, universalIdIdentifierValue, theCode) + def universalId = "2.16.840.1.114222.4.1.10080" + def universalIdType = "ISO" + def results = setupOrderWithSendingFacilityDetails(facilityName, universalId, universalIdType) + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) when: def actualFacilityDetails = results.getSendingFacilityDetails() From e12b1bf81fa41ea2548af0470176bc44a39856e4 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:13:17 -0700 Subject: [PATCH 74/92] refactor: HapiResultTest-getReceivingApplicationDetails --- .../external/hapi/HapiResultTest.groovy | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 5bc8061ff..450de83ff 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -136,22 +136,11 @@ class HapiResultTest extends Specification { def "getReceivingApplicationDetails works"() { given: - def innerResults = new Bundle() - def messageHeader = new MessageHeader() - def destination = new MessageHeader.MessageDestinationComponent() + def namespaceId = "Epic" def universalId = "1.2.840.114350.1.13.145.2.7.2.695071" - def name = "Epic" def universalIdType = "ISO" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id", new StringType(universalId)) - def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) - def expectedApplicationDetails = new MessageHdDataType(name, universalId, universalIdType) - - destination.setName(name) - destination.addExtension(universalIdExtension) - destination.addExtension(universalIdTypeExtension) - messageHeader.setDestination([destination]) - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - def results = new HapiResult(innerResults) + def expectedApplicationDetails = new MessageHdDataType(namespaceId, universalId, universalIdType) + def results = setupOrderWithReceivingApplicationDetails(namespaceId, universalId, universalIdType) when: def actualApplicationDetails = results.getReceivingApplicationDetails() From c3d4be7134aec028dcb5eaa1b5726ee46eaba7ed Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:16:40 -0700 Subject: [PATCH 75/92] refactor: HapiResultTest-getReceivingFacilityDetails --- .../external/hapi/HapiResultTest.groovy | 41 ++----------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 450de83ff..b6a452dc3 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -167,44 +167,11 @@ class HapiResultTest extends Specification { def "getReceivingFacilityDetails works"() { given: - def innerResults = new Bundle() - def messageHeader = new MessageHeader() - def destination = new MessageHeader.MessageDestinationComponent(new UrlType("urn:oid:1.2.840.114350.1.13.145.2.7.2.695071")) - def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" - destination.setReceiver(new Reference(orgReference)) - messageHeader.setDestination(Arrays.asList(destination)) - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - - def organization = new Organization() - organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") - - // facility name - def facilityIdentifier = new Identifier() def facilityName = "Samtracare" - def facilityNameExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.1")) - facilityIdentifier.addExtension(facilityNameExtension) - facilityIdentifier.setValue(facilityName) - - // universal id - def universalIdIdentifier = new Identifier() - def universalIdIdentifierValue = "Samtracare.com" - def universalIdExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/hl7v2Field", new StringType("HD.2,HD.3")) - universalIdIdentifier.addExtension(universalIdExtension) - universalIdIdentifier.setValue(universalIdIdentifierValue) - - // Type - def typeConcept = new CodeableConcept() - def theCode = "DNS" - def coding = new Coding("http://terminology.hl7.org/CodeSystem/v2-0301", theCode, null) - typeConcept.addCoding(coding) - universalIdIdentifier.setType(typeConcept) - - organization.addIdentifier(facilityIdentifier) - organization.addIdentifier(universalIdIdentifier) - innerResults.addEntry(new Bundle.BundleEntryComponent().setResource(organization)) - def parsedResults = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerResults), Bundle) - def results = new HapiResult(parsedResults) - def expectedFacilityDetails = new MessageHdDataType(facilityName, universalIdIdentifierValue, theCode) + def universalId = "Samtracare.com" + def universalIdType = "DNS" + def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) + def results = setupOrderWithReceivingFacilityDetails(facilityName, universalId, universalIdType) when: def actualFacilityDetails = results.getReceivingFacilityDetails() From 29e90e7d6bcc537d3bdbdc2710e830ba57bcbf53 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:31:31 -0700 Subject: [PATCH 76/92] refactor: Order.java and Result.java :: javadocs --- .../gov/hhs/cdc/trustedintermediary/etor/orders/Order.java | 6 +----- .../hhs/cdc/trustedintermediary/etor/results/Result.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java index ad08c1391..4f338e48b 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/orders/Order.java @@ -2,11 +2,7 @@ import gov.hhs.cdc.trustedintermediary.etor.messages.Message; -/** - * Interface to wrap a third-party lab order class (Ex: Hapi FHIR Bundle) - * - * @param The underlying FHIR lab order type. - */ +/** Interface to wrap a third-party lab order class (Ex: Hapi FHIR Bundle) */ public interface Order extends Message { String getPatientId(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java index 8843ae2d2..b5ccd2df4 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/results/Result.java @@ -2,9 +2,5 @@ import gov.hhs.cdc.trustedintermediary.etor.messages.Message; -/** - * Interface to wrap a third-party lab result class (Ex: Hapi FHIR Bundle) - * - * @param The underlying FHIR lab result type. - */ +/** Interface to wrap a third-party lab result class (Ex: Hapi FHIR Bundle) */ public interface Result extends Message {} From 229914a8ab0448a697cbb5a0b3eb3b4f011b3678 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:46:20 -0700 Subject: [PATCH 77/92] javadocs: Message.java --- .../hhs/cdc/trustedintermediary/etor/messages/Message.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java index be5a6527c..9d4045d6a 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java @@ -1,5 +1,10 @@ package gov.hhs.cdc.trustedintermediary.etor.messages; +/** + * Defines the structure and operations for a message. This interface allows for the retrieval of + * various pieces of information related to a message, including details about the sending and + * receiving applications and facilities, as well as order numbers. + */ public interface Message { T getUnderlyingElement(); From 0dc7e1b7468bb079dac95a714eb9e2b1a73bfef7 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 01:49:47 -0700 Subject: [PATCH 78/92] javadocs: HapiMessageHelper.java --- .../trustedintermediary/external/hapi/HapiMessageHelper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java index 2f826fbf4..d117e4d33 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessageHelper.java @@ -5,6 +5,11 @@ import javax.inject.Inject; import org.hl7.fhir.r4.model.Bundle; +/** + * Helper class for extracting various pieces of information from FHIR messages using defined FHIR + * paths. This class utilizes the {@link HapiFhir} engine to execute FHIR path expressions against a + * given {@link Bundle}. + */ public class HapiMessageHelper { private static final HapiMessageHelper INSTANCE = new HapiMessageHelper(); From b6cb0c80b4d1043ba1870372887ade9076f672ac Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 02:09:22 -0700 Subject: [PATCH 79/92] refactor: HapiOrder --- .../external/hapi/HapiOrder.java | 73 ++++++++----------- 1 file changed, 29 insertions(+), 44 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 65becf05b..37f68c8a0 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -3,6 +3,7 @@ import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.orders.Order; +import java.util.function.Supplier; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.Patient; @@ -55,61 +56,45 @@ public String getPlacerOrderNumber() { @Override public MessageHdDataType getSendingApplicationDetails() { - String sendingApplicationNamespace = - MESSAGE_HELPER.extractSendingApplicationNamespace(innerOrder); - String sendingApplicationUniversalId = - MESSAGE_HELPER.extractSendingApplicationUniversalId(innerOrder); - String sendingApplicationUniversalIdType = - MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerOrder); - - return new MessageHdDataType( - sendingApplicationNamespace, - sendingApplicationUniversalId, - sendingApplicationUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractSendingApplicationNamespace(innerOrder), + () -> MESSAGE_HELPER.extractSendingApplicationUniversalId(innerOrder), + () -> MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerOrder)); } @Override public MessageHdDataType getSendingFacilityDetails() { - String sendingFacilityNamespace = - MESSAGE_HELPER.extractSendingFacilityNamespace(innerOrder); - String sendingFacilityUniversalId = - MESSAGE_HELPER.extractSendingFacilityUniversalId(innerOrder); - String sendingFacilityUniversalIdType = - MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerOrder); - - return new MessageHdDataType( - sendingFacilityNamespace, - sendingFacilityUniversalId, - sendingFacilityUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractSendingFacilityNamespace(innerOrder), + () -> MESSAGE_HELPER.extractSendingFacilityUniversalId(innerOrder), + () -> MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerOrder)); } @Override public MessageHdDataType getReceivingApplicationDetails() { - String receivingApplicationNamespace = - MESSAGE_HELPER.extractReceivingApplicationNamespace(innerOrder); - String receivingApplicationUniversalId = - MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerOrder); - String receivingApplicationUniversalIdType = - MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerOrder); - - return new MessageHdDataType( - receivingApplicationNamespace, - receivingApplicationUniversalId, - receivingApplicationUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractReceivingApplicationNamespace(innerOrder), + () -> MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerOrder), + () -> MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerOrder)); } @Override public MessageHdDataType getReceivingFacilityDetails() { - String receivingFacilityNamespace = - MESSAGE_HELPER.extractReceivingFacilityNamespace(innerOrder); - String receivingFacilityUniversalId = - MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerOrder); - String receivingFacilityUniversalIdType = - MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerOrder); - - return new MessageHdDataType( - receivingFacilityNamespace, - receivingFacilityUniversalId, - receivingFacilityUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractReceivingFacilityNamespace(innerOrder), + () -> MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerOrder), + () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerOrder)); + } + + private MessageHdDataType extractMessageHdDataType( + Supplier namespaceExtractor, + Supplier universalIdExtractor, + Supplier universalIdTypeExtractor) { + + String namespace = namespaceExtractor.get(); + String universalId = universalIdExtractor.get(); + String universalIdType = universalIdTypeExtractor.get(); + + return new MessageHdDataType(namespace, universalId, universalIdType); } } From 112b9a0373da4349b775abb49f0cb1132c22636a Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 02:19:41 -0700 Subject: [PATCH 80/92] refactor: HapiResult --- .../external/hapi/HapiResult.java | 70 +++++++------------ 1 file changed, 27 insertions(+), 43 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 38d055837..ba4c96309 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -3,6 +3,7 @@ import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.results.Result; +import java.util.function.Supplier; import org.hl7.fhir.r4.model.Bundle; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ @@ -34,61 +35,44 @@ public String getPlacerOrderNumber() { @Override public MessageHdDataType getSendingApplicationDetails() { - String sendingApplicationNamespace = - MESSAGE_HELPER.extractSendingApplicationNamespace(innerResult); - String sendingApplicationUniversalId = - MESSAGE_HELPER.extractSendingApplicationUniversalId(innerResult); - String sendingApplicationUniversalIdType = - MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerResult); - - return new MessageHdDataType( - sendingApplicationNamespace, - sendingApplicationUniversalId, - sendingApplicationUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractSendingApplicationNamespace(innerResult), + () -> MESSAGE_HELPER.extractSendingApplicationUniversalId(innerResult), + () -> MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerResult)); } @Override public MessageHdDataType getSendingFacilityDetails() { - String sendingFacilityNamespace = - MESSAGE_HELPER.extractSendingFacilityNamespace(innerResult); - String sendingFacilityUniversalId = - MESSAGE_HELPER.extractSendingFacilityUniversalId(innerResult); - String sendingFacilityUniversalIdType = - MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerResult); - - return new MessageHdDataType( - sendingFacilityNamespace, - sendingFacilityUniversalId, - sendingFacilityUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractSendingFacilityNamespace(innerResult), + () -> MESSAGE_HELPER.extractSendingFacilityUniversalId(innerResult), + () -> MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerResult)); } @Override public MessageHdDataType getReceivingApplicationDetails() { - String receivingApplicationNamespace = - MESSAGE_HELPER.extractReceivingApplicationNamespace(innerResult); - String receivingApplicationUniversalId = - MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerResult); - String receivingApplicationUniversalIdType = - MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerResult); - - return new MessageHdDataType( - receivingApplicationNamespace, - receivingApplicationUniversalId, - receivingApplicationUniversalIdType); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractReceivingApplicationNamespace(innerResult), + () -> MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerResult), + () -> MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerResult)); } @Override public MessageHdDataType getReceivingFacilityDetails() { - String receivingFacilityNamespace = - MESSAGE_HELPER.extractReceivingFacilityNamespace(innerResult); - String receivingFacilityUniversalId = - MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerResult); - String receivingFacilityUniversalIdType = - MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResult); + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractReceivingFacilityNamespace(innerResult), + () -> MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerResult), + () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResult)); + } + + private MessageHdDataType extractMessageHdDataType( + Supplier namespaceExtractor, + Supplier universalIdExtractor, + Supplier universalIdTypeExtractor) { + String namespace = namespaceExtractor.get(); + String universalId = universalIdExtractor.get(); + String universalIdType = universalIdTypeExtractor.get(); - return new MessageHdDataType( - receivingFacilityNamespace, - receivingFacilityUniversalId, - receivingFacilityUniversalIdType); + return new MessageHdDataType(namespace, universalId, universalIdType); } } From b26b96e73e5061b5bb9ff238ca8a64feeb79ede3 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 02:22:58 -0700 Subject: [PATCH 81/92] javadocs: FhirPath.java --- .../hhs/cdc/trustedintermediary/plugin/path/FhirPath.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java index 168424511..c28bbf6e8 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/plugin/path/FhirPath.java @@ -1,5 +1,10 @@ package gov.hhs.cdc.trustedintermediary.plugin.path; +/** + * Enumerates FHIR path expressions for various data elements within a FHIR message. These paths can + * be used to extract specific pieces of data from a FHIR message, such as identifiers, namespaces, + * and codes related to sending and receiving facilities and applications. + */ public enum FhirPath { PLACER_ORDER_NUMBER( """ From c77cc29e8115d4daa295d89f7073296f0cf3ea0f Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 02:57:14 -0700 Subject: [PATCH 82/92] unit tests for extractMessageHdDataType --- .../external/hapi/HapiOrder.java | 2 +- .../external/hapi/HapiResult.java | 2 +- .../external/hapi/HapiOrderTest.groovy | 20 +++++++++++++++++ .../external/hapi/HapiResultTest.groovy | 22 +++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 37f68c8a0..f527f5711 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -86,7 +86,7 @@ public MessageHdDataType getReceivingFacilityDetails() { () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerOrder)); } - private MessageHdDataType extractMessageHdDataType( + protected MessageHdDataType extractMessageHdDataType( Supplier namespaceExtractor, Supplier universalIdExtractor, Supplier universalIdTypeExtractor) { diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index ba4c96309..41fcf3522 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -65,7 +65,7 @@ public MessageHdDataType getReceivingFacilityDetails() { () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResult)); } - private MessageHdDataType extractMessageHdDataType( + protected MessageHdDataType extractMessageHdDataType( Supplier namespaceExtractor, Supplier universalIdExtractor, Supplier universalIdTypeExtractor) { diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 9c0679284..5e86576ed 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -241,6 +241,26 @@ class HapiOrderTest extends Specification { actualFacilityDetails.universalIdType() == expectedFacilityDetails.universalIdType() } + def "extractMessageHdDataType works" () { + given: + def namespace = "Central Hospital" + def universalId = "2.16.842.1.113883.4.5" + def universalIdType = "ISO" + def expectedDetails = new MessageHdDataType(namespace, universalId, universalIdType) + def hapiResult = new HapiResult(null) + + when: + def actualDetails = hapiResult.extractMessageHdDataType( + {namespace}, + {universalId}, + {universalIdType}) + + then: + actualDetails.namespace() == expectedDetails.namespace() + actualDetails.universalId() == expectedDetails.universalId() + actualDetails.universalIdType() == expectedDetails.universalIdType() + } + protected HapiOrder setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index b6a452dc3..ba0cae8f6 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -6,6 +6,8 @@ import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.* import spock.lang.Specification +import java.util.function.Supplier + class HapiResultTest extends Specification { def fhirEngine = HapiFhirImplementation.getInstance() @@ -196,6 +198,26 @@ class HapiResultTest extends Specification { actualApplicationDetails.universalIdType() == expectedApplicationDetails.universalIdType() } + def "extractMessageHdDataType works" () { + given: + def namespace = "Central Hospital" + def universalId = "2.16.842.1.113883.4.5" + def universalIdType = "ISO" + def expectedDetails = new MessageHdDataType(namespace, universalId, universalIdType) + def hapiResult = new HapiResult(null) + + when: + def actualDetails = hapiResult.extractMessageHdDataType( + {namespace}, + {universalId}, + {universalIdType}) + + then: + actualDetails.namespace() == expectedDetails.namespace() + actualDetails.universalId() == expectedDetails.universalId() + actualDetails.universalIdType() == expectedDetails.universalIdType() + } + protected HapiOrder setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() From ab617890c4a766720abbc1fc0b31dda7697dffeb Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 03:18:28 -0700 Subject: [PATCH 83/92] fixed HapiResultTest --- .../external/hapi/HapiResultTest.groovy | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index ba0cae8f6..bb99972f7 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -80,10 +80,10 @@ class HapiResultTest extends Specification { def universalId = "natus.health.state.mn.us" def universalIdType = "DNS" def expectedApplicationDetails = new MessageHdDataType(nameSpaceId, universalId, universalIdType) - def orders = setupOrderWithSendingApplicationDetails(nameSpaceId, universalId, universalIdType) + def results = setupOrderWithSendingApplicationDetails(nameSpaceId, universalId, universalIdType) when: - def actualApplicationDetails = orders.getSendingApplicationDetails() + def actualApplicationDetails = results.getSendingApplicationDetails() then: actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() @@ -94,10 +94,10 @@ class HapiResultTest extends Specification { def "getSendingApplicationDetails unhappy path"() { given: def expectedApplicationDetails = new MessageHdDataType("", "", "") - def result = setupOrderWithEmptyMessageHeader() + def results = setupOrderWithEmptyMessageHeader() when: - def actualApplicationDetails = result.getSendingApplicationDetails() + def actualApplicationDetails = results.getSendingApplicationDetails() then: actualApplicationDetails.namespace() == expectedApplicationDetails.namespace() @@ -125,10 +125,10 @@ class HapiResultTest extends Specification { def "getSendingFacilityDetails unhappy path works"() { given: def expectedFacilityDetails = new MessageHdDataType("", "", "") - def orders = setupOrderWithEmptyMessageHeader() + def results = setupOrderWithEmptyMessageHeader() when: - def actualFacilityDetails = orders.getSendingFacilityDetails() + def actualFacilityDetails = results.getSendingFacilityDetails() then: actualFacilityDetails.namespace() == expectedFacilityDetails.namespace() @@ -218,7 +218,7 @@ class HapiResultTest extends Specification { actualDetails.universalIdType() == expectedDetails.universalIdType() } - protected HapiOrder setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { + protected HapiResult setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def endpoint = "urn:dns:natus.health.state.mn.us" @@ -230,10 +230,10 @@ class HapiResultTest extends Specification { def universalIdTypeExtension = new Extension("https://reportstream.cdc.gov/fhir/StructureDefinition/universal-id-type", new StringType(universalIdType)) messageHeader.getSource().addExtension(universalIdTypeExtension) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - return new HapiOrder(innerOrders) + return new HapiResult(innerOrders) } - protected HapiOrder setupOrderWithSendingFacilityDetails(String facilityName, String universalId, String universalIdType) { + protected HapiResult setupOrderWithSendingFacilityDetails(String facilityName, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" @@ -264,10 +264,10 @@ class HapiResultTest extends Specification { // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() // as part of the fhir path. def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) - return new HapiOrder(jsonOrders) + return new HapiResult(jsonOrders) } - protected HapiOrder setupOrderWithReceivingApplicationDetails(String namespaceId, String universalId, String universalIdType) { + protected HapiResult setupOrderWithReceivingApplicationDetails(String namespaceId, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def destination = new MessageHeader.MessageDestinationComponent() @@ -279,10 +279,10 @@ class HapiResultTest extends Specification { destination.addExtension(universalIdTypeExtension) messageHeader.setDestination([destination]) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - return new HapiOrder(innerOrders) + return new HapiResult(innerOrders) } - protected HapiOrder setupOrderWithReceivingFacilityDetails(String facilityName, String universalId, String universalIdType) { + protected HapiResult setupOrderWithReceivingFacilityDetails(String facilityName, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def organizationReference = "Organization/1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a" @@ -315,13 +315,13 @@ class HapiResultTest extends Specification { // Convert orders to json so the reference is added as part of the bundle so we can use .resolve() // as part of the fhir path. def jsonOrders = fhirEngine.parseResource(fhirEngine.encodeResourceToJson(innerOrders), Bundle) - return new HapiOrder(jsonOrders) + return new HapiResult(jsonOrders) } - protected HapiOrder setupOrderWithEmptyMessageHeader() { + protected HapiResult setupOrderWithEmptyMessageHeader() { def innerOrders = new Bundle() MessageHeader messageHeader = new MessageHeader() innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) - return new HapiOrder(innerOrders) + return new HapiResult(innerOrders) } } From 709f014ee7c344fa418ed60ed608388f2898481b Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 03:53:04 -0700 Subject: [PATCH 84/92] renamed helper methods to include result in HapiResultTest --- .../external/hapi/HapiResultTest.groovy | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index bb99972f7..cf2ab1e2c 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -6,8 +6,6 @@ import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.* import spock.lang.Specification -import java.util.function.Supplier - class HapiResultTest extends Specification { def fhirEngine = HapiFhirImplementation.getInstance() @@ -65,7 +63,7 @@ class HapiResultTest extends Specification { def "getPlacerOrderNumber unhappy path"() { given: def expectedPlacerOrderNumber = "" - def result = setupOrderWithEmptyMessageHeader() + def result = setupResultWithEmptyMessageHeader() when: def actualPlacerOrderNumber = result.getPlacerOrderNumber() @@ -80,7 +78,7 @@ class HapiResultTest extends Specification { def universalId = "natus.health.state.mn.us" def universalIdType = "DNS" def expectedApplicationDetails = new MessageHdDataType(nameSpaceId, universalId, universalIdType) - def results = setupOrderWithSendingApplicationDetails(nameSpaceId, universalId, universalIdType) + def results = setupResultWithSendingApplicationDetails(nameSpaceId, universalId, universalIdType) when: def actualApplicationDetails = results.getSendingApplicationDetails() @@ -94,7 +92,7 @@ class HapiResultTest extends Specification { def "getSendingApplicationDetails unhappy path"() { given: def expectedApplicationDetails = new MessageHdDataType("", "", "") - def results = setupOrderWithEmptyMessageHeader() + def results = setupResultWithEmptyMessageHeader() when: def actualApplicationDetails = results.getSendingApplicationDetails() @@ -110,7 +108,7 @@ class HapiResultTest extends Specification { def facilityName = "MN Public Health Lab" def universalId = "2.16.840.1.114222.4.1.10080" def universalIdType = "ISO" - def results = setupOrderWithSendingFacilityDetails(facilityName, universalId, universalIdType) + def results = setupResultWithSendingFacilityDetails(facilityName, universalId, universalIdType) def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) when: @@ -125,7 +123,7 @@ class HapiResultTest extends Specification { def "getSendingFacilityDetails unhappy path works"() { given: def expectedFacilityDetails = new MessageHdDataType("", "", "") - def results = setupOrderWithEmptyMessageHeader() + def results = setupResultWithEmptyMessageHeader() when: def actualFacilityDetails = results.getSendingFacilityDetails() @@ -142,7 +140,7 @@ class HapiResultTest extends Specification { def universalId = "1.2.840.114350.1.13.145.2.7.2.695071" def universalIdType = "ISO" def expectedApplicationDetails = new MessageHdDataType(namespaceId, universalId, universalIdType) - def results = setupOrderWithReceivingApplicationDetails(namespaceId, universalId, universalIdType) + def results = setupResultWithReceivingApplicationDetails(namespaceId, universalId, universalIdType) when: def actualApplicationDetails = results.getReceivingApplicationDetails() @@ -155,7 +153,7 @@ class HapiResultTest extends Specification { def "getReceivingApplicationDetails unhappy path"() { given: - def results = setupOrderWithEmptyMessageHeader() + def results = setupResultWithEmptyMessageHeader() def expectedApplicationDetails = new MessageHdDataType("", "", "") when: @@ -173,7 +171,7 @@ class HapiResultTest extends Specification { def universalId = "Samtracare.com" def universalIdType = "DNS" def expectedFacilityDetails = new MessageHdDataType(facilityName, universalId, universalIdType) - def results = setupOrderWithReceivingFacilityDetails(facilityName, universalId, universalIdType) + def results = setupResultWithReceivingFacilityDetails(facilityName, universalId, universalIdType) when: def actualFacilityDetails = results.getReceivingFacilityDetails() @@ -186,7 +184,7 @@ class HapiResultTest extends Specification { def "getReceivingFacilityDetails unhappy path"() { given: - def results = setupOrderWithEmptyMessageHeader() + def results = setupResultWithEmptyMessageHeader() def expectedApplicationDetails = new MessageHdDataType("", "", "") when: @@ -218,7 +216,7 @@ class HapiResultTest extends Specification { actualDetails.universalIdType() == expectedDetails.universalIdType() } - protected HapiResult setupOrderWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { + protected HapiResult setupResultWithSendingApplicationDetails(String nameSpaceId, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def endpoint = "urn:dns:natus.health.state.mn.us" @@ -233,7 +231,7 @@ class HapiResultTest extends Specification { return new HapiResult(innerOrders) } - protected HapiResult setupOrderWithSendingFacilityDetails(String facilityName, String universalId, String universalIdType) { + protected HapiResult setupResultWithSendingFacilityDetails(String facilityName, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" @@ -267,7 +265,7 @@ class HapiResultTest extends Specification { return new HapiResult(jsonOrders) } - protected HapiResult setupOrderWithReceivingApplicationDetails(String namespaceId, String universalId, String universalIdType) { + protected HapiResult setupResultWithReceivingApplicationDetails(String namespaceId, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def destination = new MessageHeader.MessageDestinationComponent() @@ -282,7 +280,7 @@ class HapiResultTest extends Specification { return new HapiResult(innerOrders) } - protected HapiResult setupOrderWithReceivingFacilityDetails(String facilityName, String universalId, String universalIdType) { + protected HapiResult setupResultWithReceivingFacilityDetails(String facilityName, String universalId, String universalIdType) { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def organizationReference = "Organization/1708034743312390878.b61e734a-4d65-4e25-b423-cdb19018d84a" @@ -318,7 +316,7 @@ class HapiResultTest extends Specification { return new HapiResult(jsonOrders) } - protected HapiResult setupOrderWithEmptyMessageHeader() { + protected HapiResult setupResultWithEmptyMessageHeader() { def innerOrders = new Bundle() MessageHeader messageHeader = new MessageHeader() innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) From 7a39a9f86dd25871dd937ba527df3255decd24b9 Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Fri, 5 Apr 2024 11:25:19 -0400 Subject: [PATCH 85/92] Message interface now extends FhirResource --- .../etor/messages/Message.java | 6 ++--- .../external/hapi/HapiOrder.java | 2 +- .../external/hapi/HapiOrderConverter.java | 6 ++--- .../external/hapi/HapiResult.java | 2 +- .../external/hapi/HapiResultConverter.java | 2 +- .../reportstream/ReportStreamOrderSender.java | 2 +- .../ReportStreamResultSender.java | 2 +- .../cdc/trustedintermediary/OrderMock.groovy | 2 +- .../cdc/trustedintermediary/ResultMock.groovy | 2 +- .../etor/orders/OrderControllerTest.groovy | 2 +- .../etor/results/ResultControllerTest.groovy | 2 +- .../hapi/HapiOrderConverterTest.groovy | 26 +++++++++---------- .../external/hapi/HapiOrderTest.groovy | 4 +-- .../hapi/HapiResultConverterTest.groovy | 4 +-- .../external/hapi/HapiResultTest.groovy | 4 +-- 15 files changed, 34 insertions(+), 34 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java index 9d4045d6a..bbe1da597 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java @@ -1,13 +1,13 @@ package gov.hhs.cdc.trustedintermediary.etor.messages; +import gov.hhs.cdc.trustedintermediary.etor.ruleengine.FhirResource; + /** * Defines the structure and operations for a message. This interface allows for the retrieval of * various pieces of information related to a message, including details about the sending and * receiving applications and facilities, as well as order numbers. */ -public interface Message { - T getUnderlyingElement(); - +public interface Message extends FhirResource { String getFhirResourceId(); String getPlacerOrderNumber(); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index f527f5711..09a773323 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -24,7 +24,7 @@ public HapiOrder(Bundle innerOrder) { } @Override - public Bundle getUnderlyingElement() { + public Bundle getUnderlyingResource() { return innerOrder; } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java index 752003e16..fc5d47ff8 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java @@ -96,7 +96,7 @@ public Order convertToOmlOrder(Order order) { logger.logInfo("Converting order to have OML metadata"); var hapiOrder = (Order) order; - var orderBundle = hapiOrder.getUnderlyingElement(); + var orderBundle = hapiOrder.getUnderlyingResource(); var messageHeader = hapiMessageConverterHelper.findOrInitializeMessageHeader(orderBundle); messageHeader.setEvent(OML_CODING); @@ -109,7 +109,7 @@ public Order addContactSectionToPatientResource(Order order) { logger.logInfo("Adding contact section in Patient resource"); var hapiOrder = (Order) order; - var orderBundle = hapiOrder.getUnderlyingElement(); + var orderBundle = hapiOrder.getUnderlyingResource(); HapiHelper.resourcesInBundle(orderBundle, Patient.class) .forEach( @@ -159,7 +159,7 @@ private MessageHeader createMessageHeader() { @Override public Order addEtorProcessingTag(Order message) { var hapiOrder = (Order) message; - var messageBundle = hapiOrder.getUnderlyingElement(); + var messageBundle = hapiOrder.getUnderlyingResource(); hapiMessageConverterHelper.addEtorTagToBundle(messageBundle); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 41fcf3522..1db47b7b4 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -19,7 +19,7 @@ public HapiResult(Bundle innerResult) { } @Override - public Bundle getUnderlyingElement() { + public Bundle getUnderlyingResource() { return innerResult; } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java index 4d730cf91..e7067a567 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverter.java @@ -27,7 +27,7 @@ private HapiResultConverter() {} @Override public Result addEtorProcessingTag(final Result message) { var hapiResult = (Result) message; - var messageBundle = hapiResult.getUnderlyingElement(); + var messageBundle = hapiResult.getUnderlyingResource(); hapiMessageConverterHelper.addEtorTagToBundle(messageBundle); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java index 5c3ad6c85..e001ab287 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamOrderSender.java @@ -26,7 +26,7 @@ private ReportStreamOrderSender() {} @Override public Optional send(final Order order) throws UnableToSendMessageException { logger.logInfo("Sending the order to ReportStream"); - String json = fhir.encodeResourceToJson(order.getUnderlyingElement()); + String json = fhir.encodeResourceToJson(order.getUnderlyingResource()); return sender.sendOrderToReportStream(json, order.getFhirResourceId()); } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java index 428c1078e..418791064 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/reportstream/ReportStreamResultSender.java @@ -29,7 +29,7 @@ private ReportStreamResultSender() {} @Override public Optional send(Result result) throws UnableToSendMessageException { logger.logInfo("Sending results to ReportStream"); - String json = fhir.encodeResourceToJson(result.getUnderlyingElement()); + String json = fhir.encodeResourceToJson(result.getUnderlyingResource()); return sender.sendResultToReportStream(json, result.getFhirResourceId()); } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy index 7869934c0..af74e1792 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/OrderMock.groovy @@ -30,7 +30,7 @@ class OrderMock implements Order { } @Override - T getUnderlyingElement() { + T getUnderlyingResource() { return this.underlyingOrders } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy index 6b7a00c61..46609bbc6 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/ResultMock.groovy @@ -29,7 +29,7 @@ class ResultMock implements Result { } @Override - T getUnderlyingElement() { + T getUnderlyingResource() { return this.underlyingResult } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy index 3172fe033..75bdc1bc1 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/orders/OrderControllerTest.groovy @@ -34,7 +34,7 @@ class OrderControllerTest extends Specification { TestApplicationContext.injectRegisteredImplementations() when: - def actualBundle = controller.parseOrders(new DomainRequest()).underlyingElement + def actualBundle = controller.parseOrders(new DomainRequest()).underlyingResource then: actualBundle == expectedBundle diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy index 587951cd4..1b35e32ca 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/results/ResultControllerTest.groovy @@ -32,7 +32,7 @@ class ResultControllerTest extends Specification { TestApplicationContext.injectRegisteredImplementations() when: - def actualBundle = controller.parseResults(new DomainRequest()).underlyingElement + def actualBundle = controller.parseResults(new DomainRequest()).underlyingResource then: actualBundle == expectedBundle diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy index 528b1a939..bbac342cb 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverterTest.groovy @@ -47,7 +47,7 @@ class HapiOrderConverterTest extends Specification { def "the converter fills in gaps of any missing data in the Bundle"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() then: orderBundle.hasId() @@ -67,7 +67,7 @@ class HapiOrderConverterTest extends Specification { mockDemographicsBundle.setTimestamp(mockTimestamp) when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() then: orderBundle.getId() == mockId @@ -81,7 +81,7 @@ class HapiOrderConverterTest extends Specification { mockDemographicsBundle.setType(Bundle.BundleType.COLLECTION) when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() then: orderBundle.getType() == Bundle.BundleType.MESSAGE @@ -90,7 +90,7 @@ class HapiOrderConverterTest extends Specification { def "the demographics correctly constructs a message header in the lab order"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() then: def messageHeader = orderBundle.getEntry().get(0).getResource() as MessageHeader @@ -108,7 +108,7 @@ class HapiOrderConverterTest extends Specification { def "the converter correctly reuses the patient from the passed in demographics"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() then: def patient = orderBundle.getEntry().get(1).getResource() as Patient @@ -119,7 +119,7 @@ class HapiOrderConverterTest extends Specification { def "the converter correctly constructs a service request in the lab order"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() then: def serviceRequest = orderBundle.getEntry().get(2).getResource() as ServiceRequest @@ -134,7 +134,7 @@ class HapiOrderConverterTest extends Specification { def "the order datetime should match for bundle, service request, and provenance resources"() { when: - def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingElement() + def orderBundle = HapiOrderConverter.getInstance().convertToOrder(mockDemographics).getUnderlyingResource() def bundleDateTime = orderBundle.getTimestamp() def serviceRequest = orderBundle.getEntry().get(2).getResource() as ServiceRequest def provenance = orderBundle.getEntry().get(3).getResource() as Provenance @@ -158,7 +158,7 @@ class HapiOrderConverterTest extends Specification { "ORM")))) when: - def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingElement() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingResource() as Bundle then: def convertedMessageHeader = convertedOrderBundle.getEntry().get(1).getResource() as MessageHeader @@ -169,7 +169,7 @@ class HapiOrderConverterTest extends Specification { def "adds the message header to specify OML"() { when: - def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingElement() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().convertToOmlOrder(mockOrder).getUnderlyingResource() as Bundle then: def convertedMessageHeader = convertedOrderBundle.getEntry().get(1).getResource() as MessageHeader @@ -192,7 +192,7 @@ class HapiOrderConverterTest extends Specification { mockOrderBundle.setEntry(entryList) when: - def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingElement() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingResource() as Bundle then: def convertedPatient = convertedOrderBundle.getEntry().get(0).getResource() as Patient @@ -236,10 +236,10 @@ class HapiOrderConverterTest extends Specification { messageHeader.setId(UUID.randomUUID().toString()) def messageHeaderEntry = new Bundle.BundleEntryComponent().setResource(messageHeader) mockOrderBundle.getEntry().add(1, messageHeaderEntry) - mockOrder.getUnderlyingElement() >> mockOrderBundle + mockOrder.getUnderlyingResource() >> mockOrderBundle when: - def convertedOrderBundle = HapiOrderConverter.getInstance().addEtorProcessingTag(mockOrder).getUnderlyingElement() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().addEtorProcessingTag(mockOrder).getUnderlyingResource() as Bundle then: def messageHeaders = convertedOrderBundle.getEntry().get(1).getResource() as MessageHeader @@ -261,7 +261,7 @@ class HapiOrderConverterTest extends Specification { entryList.add(patientEntry) mockOrderBundle.setEntry(entryList) when: - def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingElement() as Bundle + def convertedOrderBundle = HapiOrderConverter.getInstance().addContactSectionToPatientResource(mockOrder).getUnderlyingResource() as Bundle then: def convertedPatient = convertedOrderBundle.getEntry().get(0).getResource() as Patient diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy index 5e86576ed..dab5cd610 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderTest.groovy @@ -31,13 +31,13 @@ class HapiOrderTest extends Specification { TestApplicationContext.injectRegisteredImplementations() } - def "getUnderlyingElement Works"() { + def "getUnderlyingResource Works"() { given: def expectedInnerOrder = new Bundle() def order = new HapiOrder(expectedInnerOrder) when: - def actualInnerOrder = order.getUnderlyingElement() + def actualInnerOrder = order.getUnderlyingResource() then: actualInnerOrder == expectedInnerOrder diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy index 395591d89..42285b7f5 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultConverterTest.groovy @@ -38,10 +38,10 @@ class HapiResultConverterTest extends Specification { messageHeader.setId(UUID.randomUUID().toString()) def messageHeaderEntry = new Bundle.BundleEntryComponent().setResource(messageHeader) mockResultBundle.getEntry().add(1, messageHeaderEntry) - mockResult.getUnderlyingElement() >> mockResultBundle + mockResult.getUnderlyingResource() >> mockResultBundle when: - def convertedResultBundle = HapiResultConverter.getInstance().addEtorProcessingTag(mockResult).getUnderlyingElement() as Bundle + def convertedResultBundle = HapiResultConverter.getInstance().addEtorProcessingTag(mockResult).getUnderlyingResource() as Bundle then: def messageHeaders = convertedResultBundle.getEntry().get(1).getResource() as MessageHeader diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index cf2ab1e2c..95eff186c 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -18,13 +18,13 @@ class HapiResultTest extends Specification { TestApplicationContext.injectRegisteredImplementations() } - def "getUnderlyingElement works"() { + def "getUnderlyingResource works"() { given: def expectedResult = new Bundle() def result = new HapiResult(expectedResult) when: - def actualResult = result.getUnderlyingElement() + def actualResult = result.getUnderlyingResource() then: actualResult == expectedResult From 38735e0f31962304963e92c77eafdbe1f732ca70 Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Fri, 5 Apr 2024 11:41:59 -0400 Subject: [PATCH 86/92] Moved getFhirResourceId to FhirResource interface --- .../hhs/cdc/trustedintermediary/etor/messages/Message.java | 2 -- .../trustedintermediary/etor/ruleengine/FhirResource.java | 2 ++ .../trustedintermediary/external/hapi/HapiFhirResource.java | 5 +++++ .../gov/hhs/cdc/trustedintermediary/FhirResourceMock.groovy | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java index bbe1da597..67b24684e 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/messages/Message.java @@ -8,8 +8,6 @@ * receiving applications and facilities, as well as order numbers. */ public interface Message extends FhirResource { - String getFhirResourceId(); - String getPlacerOrderNumber(); MessageHdDataType getSendingApplicationDetails(); diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/FhirResource.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/FhirResource.java index e3fa5bda9..0b15aa3a9 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/FhirResource.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/FhirResource.java @@ -8,4 +8,6 @@ */ public interface FhirResource { T getUnderlyingResource(); + + String getFhirResourceId(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirResource.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirResource.java index a0f41783e..697a07ecf 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirResource.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiFhirResource.java @@ -16,4 +16,9 @@ public HapiFhirResource(IBaseResource innerResource) { public IBaseResource getUnderlyingResource() { return innerResource; } + + @Override + public String getFhirResourceId() { + return innerResource.getIdElement().getIdPart(); + } } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/FhirResourceMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/FhirResourceMock.groovy index 07a000688..d6433a486 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/FhirResourceMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/FhirResourceMock.groovy @@ -14,4 +14,9 @@ class FhirResourceMock implements FhirResource { public T getUnderlyingResource() { return innerResource } + + @Override + String getFhirResourceId() { + return null + } } From 0134326d5feb6bc459acf570e99c2766d10baa10 Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 08:44:19 -0700 Subject: [PATCH 87/92] remove wildcard import --- .../external/hapi/HapiResultTest.groovy | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 95eff186c..79ab91ef3 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -3,7 +3,16 @@ package gov.hhs.cdc.trustedintermediary.external.hapi import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir -import org.hl7.fhir.r4.model.* +import org.hl7.fhir.r4.model.Bundle +import org.hl7.fhir.r4.model.CodeableConcept +import org.hl7.fhir.r4.model.Coding +import org.hl7.fhir.r4.model.Extension +import org.hl7.fhir.r4.model.Identifier +import org.hl7.fhir.r4.model.MessageHeader +import org.hl7.fhir.r4.model.Organization +import org.hl7.fhir.r4.model.ServiceRequest +import org.hl7.fhir.r4.model.StringType +import org.hl7.fhir.r4.model.UrlType import spock.lang.Specification class HapiResultTest extends Specification { From 06a2ac52c68d187192c3ae6ca625b00dfe9744cd Mon Sep 17 00:00:00 2001 From: jorge Lopez Date: Fri, 5 Apr 2024 08:55:08 -0700 Subject: [PATCH 88/92] aded: as reference to test case --- .../trustedintermediary/external/hapi/HapiResultTest.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy index 79ab91ef3..5997a313b 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResultTest.groovy @@ -10,6 +10,7 @@ import org.hl7.fhir.r4.model.Extension import org.hl7.fhir.r4.model.Identifier import org.hl7.fhir.r4.model.MessageHeader import org.hl7.fhir.r4.model.Organization +import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.ServiceRequest import org.hl7.fhir.r4.model.StringType import org.hl7.fhir.r4.model.UrlType @@ -244,7 +245,7 @@ class HapiResultTest extends Specification { def innerOrders = new Bundle() def messageHeader = new MessageHeader() def orgReference = "Organization/1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db" - messageHeader.setSender(new Reference(orgReference)) + messageHeader.setSender(new Reference(orgReference) as Reference) innerOrders.addEntry(new Bundle.BundleEntryComponent().setResource(messageHeader)) def organization = new Organization() organization.setId("1708034743302204787.82104dfb-e854-47de-b7ce-19a2b71e61db") From 1a9835d5e2fc2b9cdb584007f5c8687041d48643 Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Fri, 5 Apr 2024 13:11:10 -0400 Subject: [PATCH 89/92] Add common parent for hapiOrder and hapiResult --- .../external/hapi/HapiMessage.java | 77 +++++++++++++++++++ .../external/hapi/HapiOrder.java | 73 +----------------- .../external/hapi/HapiResult.java | 70 +---------------- 3 files changed, 82 insertions(+), 138 deletions(-) create mode 100644 etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java new file mode 100644 index 000000000..7c5f20744 --- /dev/null +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java @@ -0,0 +1,77 @@ +package gov.hhs.cdc.trustedintermediary.external.hapi; + +import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; +import gov.hhs.cdc.trustedintermediary.etor.messages.Message; +import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; +import java.util.function.Supplier; +import org.hl7.fhir.r4.model.Bundle; + +public class HapiMessage implements Message { + + protected final HapiMessageHelper MESSAGE_HELPER = + ApplicationContext.getImplementation(HapiMessageHelper.class); + + protected final Bundle innerResource; + + public HapiMessage(Bundle innerResource) { + this.innerResource = innerResource; + } + + @Override + public Bundle getUnderlyingResource() { + return innerResource; + } + + @Override + public String getFhirResourceId() { + return innerResource.getId(); + } + + @Override + public String getPlacerOrderNumber() { + return MESSAGE_HELPER.extractPlacerOrderNumber(innerResource); + } + + @Override + public MessageHdDataType getSendingApplicationDetails() { + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractSendingApplicationNamespace(innerResource), + () -> MESSAGE_HELPER.extractSendingApplicationUniversalId(innerResource), + () -> MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerResource)); + } + + @Override + public MessageHdDataType getSendingFacilityDetails() { + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractSendingFacilityNamespace(innerResource), + () -> MESSAGE_HELPER.extractSendingFacilityUniversalId(innerResource), + () -> MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerResource)); + } + + @Override + public MessageHdDataType getReceivingApplicationDetails() { + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractReceivingApplicationNamespace(innerResource), + () -> MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerResource), + () -> MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerResource)); + } + + @Override + public MessageHdDataType getReceivingFacilityDetails() { + return extractMessageHdDataType( + () -> MESSAGE_HELPER.extractReceivingFacilityNamespace(innerResource), + () -> MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerResource), + () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResource)); + } + + protected MessageHdDataType extractMessageHdDataType( + Supplier namespaceExtractor, + Supplier universalIdExtractor, + Supplier universalIdTypeExtractor) { + String namespace = namespaceExtractor.get(); + String universalId = universalIdExtractor.get(); + String universalIdType = universalIdTypeExtractor.get(); + + return new MessageHdDataType(namespace, universalId, universalIdType); + } +} diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 09a773323..860322752 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -1,9 +1,6 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; -import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; -import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.orders.Order; -import java.util.function.Supplier; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.Patient; @@ -12,30 +9,15 @@ * A concrete implementation of a {@link Order} that uses the Hapi FHIR bundle as its underlying * type. */ -public class HapiOrder implements Order { - - private final HapiMessageHelper MESSAGE_HELPER = - ApplicationContext.getImplementation(HapiMessageHelper.class); - - private final Bundle innerOrder; +public class HapiOrder extends HapiMessage implements Order { public HapiOrder(Bundle innerOrder) { - this.innerOrder = innerOrder; - } - - @Override - public Bundle getUnderlyingResource() { - return innerOrder; - } - - @Override - public String getFhirResourceId() { - return innerOrder.getId(); + super(innerOrder); } @Override public String getPatientId() { - return HapiHelper.resourcesInBundle(innerOrder, Patient.class) + return HapiHelper.resourcesInBundle(innerResource, Patient.class) .flatMap(patient -> patient.getIdentifier().stream()) .filter( identifier -> @@ -48,53 +30,4 @@ public String getPatientId() { .findFirst() .orElse(""); } - - @Override - public String getPlacerOrderNumber() { - return MESSAGE_HELPER.extractPlacerOrderNumber(innerOrder); - } - - @Override - public MessageHdDataType getSendingApplicationDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractSendingApplicationNamespace(innerOrder), - () -> MESSAGE_HELPER.extractSendingApplicationUniversalId(innerOrder), - () -> MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerOrder)); - } - - @Override - public MessageHdDataType getSendingFacilityDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractSendingFacilityNamespace(innerOrder), - () -> MESSAGE_HELPER.extractSendingFacilityUniversalId(innerOrder), - () -> MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerOrder)); - } - - @Override - public MessageHdDataType getReceivingApplicationDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractReceivingApplicationNamespace(innerOrder), - () -> MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerOrder), - () -> MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerOrder)); - } - - @Override - public MessageHdDataType getReceivingFacilityDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractReceivingFacilityNamespace(innerOrder), - () -> MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerOrder), - () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerOrder)); - } - - protected MessageHdDataType extractMessageHdDataType( - Supplier namespaceExtractor, - Supplier universalIdExtractor, - Supplier universalIdTypeExtractor) { - - String namespace = namespaceExtractor.get(); - String universalId = universalIdExtractor.get(); - String universalIdType = universalIdTypeExtractor.get(); - - return new MessageHdDataType(namespace, universalId, universalIdType); - } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java index 1db47b7b4..20d690e69 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiResult.java @@ -1,78 +1,12 @@ package gov.hhs.cdc.trustedintermediary.external.hapi; -import gov.hhs.cdc.trustedintermediary.context.ApplicationContext; -import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import gov.hhs.cdc.trustedintermediary.etor.results.Result; -import java.util.function.Supplier; import org.hl7.fhir.r4.model.Bundle; /** Filler concrete implementation of a {@link Result} using the Hapi FHIR library */ -public class HapiResult implements Result { - - private final HapiMessageHelper MESSAGE_HELPER = - ApplicationContext.getImplementation(HapiMessageHelper.class); - - private final Bundle innerResult; +public class HapiResult extends HapiMessage implements Result { public HapiResult(Bundle innerResult) { - this.innerResult = innerResult; - } - - @Override - public Bundle getUnderlyingResource() { - return innerResult; - } - - @Override - public String getFhirResourceId() { - return innerResult.getId(); - } - - @Override - public String getPlacerOrderNumber() { - return MESSAGE_HELPER.extractPlacerOrderNumber(innerResult); - } - - @Override - public MessageHdDataType getSendingApplicationDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractSendingApplicationNamespace(innerResult), - () -> MESSAGE_HELPER.extractSendingApplicationUniversalId(innerResult), - () -> MESSAGE_HELPER.extractSendingApplicationUniversalIdType(innerResult)); - } - - @Override - public MessageHdDataType getSendingFacilityDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractSendingFacilityNamespace(innerResult), - () -> MESSAGE_HELPER.extractSendingFacilityUniversalId(innerResult), - () -> MESSAGE_HELPER.extractSendingFacilityUniversalIdType(innerResult)); - } - - @Override - public MessageHdDataType getReceivingApplicationDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractReceivingApplicationNamespace(innerResult), - () -> MESSAGE_HELPER.extractReceivingApplicationUniversalId(innerResult), - () -> MESSAGE_HELPER.extractReceivingApplicationUniversalIdType(innerResult)); - } - - @Override - public MessageHdDataType getReceivingFacilityDetails() { - return extractMessageHdDataType( - () -> MESSAGE_HELPER.extractReceivingFacilityNamespace(innerResult), - () -> MESSAGE_HELPER.extractReceivingFacilityUniversalId(innerResult), - () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResult)); - } - - protected MessageHdDataType extractMessageHdDataType( - Supplier namespaceExtractor, - Supplier universalIdExtractor, - Supplier universalIdTypeExtractor) { - String namespace = namespaceExtractor.get(); - String universalId = universalIdExtractor.get(); - String universalIdType = universalIdTypeExtractor.get(); - - return new MessageHdDataType(namespace, universalId, universalIdType); + super(innerResult); } } From 6e8f9c5137dfc2ff82afe6248d1bdb0a7722306b Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Fri, 5 Apr 2024 13:58:24 -0400 Subject: [PATCH 90/92] Extending Demographics interface with FhirResource --- .../etor/demographics/Demographics.java | 8 +++----- .../external/hapi/HapiDemographics.java | 2 +- .../external/hapi/HapiOrderConverter.java | 2 +- .../hhs/cdc/trustedintermediary/DemographicsMock.groovy | 2 +- .../demographics/PatientDemographicsControllerTest.groovy | 2 +- .../external/hapi/HapiDemographicsTest.groovy | 4 ++-- 6 files changed, 9 insertions(+), 11 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/demographics/Demographics.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/demographics/Demographics.java index 82d5b9d5d..662ff477a 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/demographics/Demographics.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/demographics/Demographics.java @@ -1,14 +1,12 @@ package gov.hhs.cdc.trustedintermediary.etor.demographics; +import gov.hhs.cdc.trustedintermediary.etor.ruleengine.FhirResource; + /** * Interface to wrap a third-party demographics class (Ex: Hapi FHIR Bundle) * * @param The underlying FHIR demographics type. */ -public interface Demographics { - T getUnderlyingDemographics(); - - String getFhirResourceId(); - +public interface Demographics extends FhirResource { String getPatientId(); } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java index b86a07970..fd49445e0 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java @@ -18,7 +18,7 @@ public HapiDemographics(Bundle innerDemographics) { } @Override - public Bundle getUnderlyingDemographics() { + public Bundle getUnderlyingResource() { return innerDemographics; } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java index fc5d47ff8..0a2457d96 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrderConverter.java @@ -54,7 +54,7 @@ public HapiOrder convertToOrder(final Demographics demographics) { logger.logInfo("Converting demographics to order"); var hapiDemographics = (Demographics) demographics; - var demographicsBundle = hapiDemographics.getUnderlyingDemographics(); + var demographicsBundle = hapiDemographics.getUnderlyingResource(); var overallId = UUID.randomUUID().toString(); if (!demographicsBundle.hasId()) { diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/DemographicsMock.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/DemographicsMock.groovy index 5a84f1d43..86fd2c319 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/DemographicsMock.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/DemographicsMock.groovy @@ -19,7 +19,7 @@ class DemographicsMock implements Demographics { } @Override - T getUnderlyingDemographics() { + T getUnderlyingResource() { return underlyingDemographics } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy index d6b39accc..9e6479bf8 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy @@ -27,7 +27,7 @@ class PatientDemographicsControllerTest extends Specification { def patientDemographics = PatientDemographicsController.getInstance().parseDemographics(new DomainRequest()) then: - patientDemographics.getUnderlyingDemographics() == expectedBundle + patientDemographics.getUnderlyingResource() == expectedBundle } def "parseDemographics throws an exception when unable to parse de request"() { diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy index 44d97d5b3..5937457fe 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy @@ -9,13 +9,13 @@ import spock.lang.Specification class HapiDemographicsTest extends Specification { - def "getUnderlyingDemographics works"() { + def "getUnderlyingResource works"() { given: def expectedInnerDemographics = new Bundle() def demographics = new HapiDemographics(expectedInnerDemographics) when: - def actualInnerDemographics = demographics.getUnderlyingDemographics() + def actualInnerDemographics = demographics.getUnderlyingResource() then: actualInnerDemographics == expectedInnerDemographics From cd0b882e6ef6b591f9b9686cd13fd27752aa47b2 Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Fri, 5 Apr 2024 14:46:24 -0400 Subject: [PATCH 91/92] HapiDemographics is another implementation of the same FhirResource logic --- .../external/hapi/HapiDemographics.java | 18 +++--------------- .../PatientDemographicsControllerTest.groovy | 2 ++ .../external/hapi/HapiDemographicsTest.groovy | 9 +++++++++ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java index fd49445e0..c1f67b07c 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java @@ -9,27 +9,15 @@ * A concrete implementation of a {@link Demographics} that uses the Hapi FHIR bundle as its * underlying type. */ -public class HapiDemographics implements Demographics { - - private final Bundle innerDemographics; +public class HapiDemographics extends HapiMessage implements Demographics { public HapiDemographics(Bundle innerDemographics) { - this.innerDemographics = innerDemographics; - } - - @Override - public Bundle getUnderlyingResource() { - return innerDemographics; - } - - @Override - public String getFhirResourceId() { - return innerDemographics.getId(); + super(innerDemographics); } @Override public String getPatientId() { - return HapiHelper.resourcesInBundle(innerDemographics, Patient.class) + return HapiHelper.resourcesInBundle(innerResource, Patient.class) .flatMap(patient -> patient.getIdentifier().stream()) .filter( identifier -> diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy index 9e6479bf8..e2bcddb57 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/etor/demographics/PatientDemographicsControllerTest.groovy @@ -2,6 +2,7 @@ package gov.hhs.cdc.trustedintermediary.etor.demographics import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext import gov.hhs.cdc.trustedintermediary.domainconnector.DomainRequest +import gov.hhs.cdc.trustedintermediary.external.hapi.HapiMessageHelper import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle @@ -12,6 +13,7 @@ class PatientDemographicsControllerTest extends Specification { def setup() { TestApplicationContext.reset() TestApplicationContext.init() + TestApplicationContext.register(HapiMessageHelper, HapiMessageHelper.getInstance()) TestApplicationContext.register(PatientDemographicsController, PatientDemographicsController.getInstance()) } diff --git a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy index 5937457fe..cedd255c3 100644 --- a/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy +++ b/etor/src/test/groovy/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographicsTest.groovy @@ -1,5 +1,7 @@ package gov.hhs.cdc.trustedintermediary.external.hapi +import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext +import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir import org.hl7.fhir.r4.model.Bundle import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding @@ -9,6 +11,13 @@ import spock.lang.Specification class HapiDemographicsTest extends Specification { + def setup() { + TestApplicationContext.reset() + TestApplicationContext.init() + TestApplicationContext.register(HapiMessageHelper.class, HapiMessageHelper.getInstance()) + TestApplicationContext.injectRegisteredImplementations() + } + def "getUnderlyingResource works"() { given: def expectedInnerDemographics = new Bundle() From 5e6f03939a12bae1b45b0b13d0b229fab7c7cb3c Mon Sep 17 00:00:00 2001 From: Luis Pabon Date: Fri, 5 Apr 2024 15:12:28 -0400 Subject: [PATCH 92/92] Move getPatientId up the chain --- .../external/hapi/HapiDemographics.java | 18 ------------------ .../external/hapi/HapiMessage.java | 17 +++++++++++++++++ .../external/hapi/HapiOrder.java | 18 ------------------ 3 files changed, 17 insertions(+), 36 deletions(-) diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java index c1f67b07c..4722ae76c 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiDemographics.java @@ -2,8 +2,6 @@ import gov.hhs.cdc.trustedintermediary.etor.demographics.Demographics; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.Patient; /** * A concrete implementation of a {@link Demographics} that uses the Hapi FHIR bundle as its @@ -14,20 +12,4 @@ public class HapiDemographics extends HapiMessage implements Demographics patient.getIdentifier().stream()) - .filter( - identifier -> - identifier - .getType() - .hasCoding( - "http://terminology.hl7.org/CodeSystem/v2-0203", - "MR")) - .map(Identifier::getValue) - .findFirst() - .orElse(""); - } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java index 7c5f20744..3b29169b4 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiMessage.java @@ -5,6 +5,8 @@ import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType; import java.util.function.Supplier; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.Patient; public class HapiMessage implements Message { @@ -64,6 +66,21 @@ public MessageHdDataType getReceivingFacilityDetails() { () -> MESSAGE_HELPER.extractReceivingFacilityUniversalIdType(innerResource)); } + public String getPatientId() { + return HapiHelper.resourcesInBundle(innerResource, Patient.class) + .flatMap(patient -> patient.getIdentifier().stream()) + .filter( + identifier -> + identifier + .getType() + .hasCoding( + "http://terminology.hl7.org/CodeSystem/v2-0203", + "MR")) + .map(Identifier::getValue) + .findFirst() + .orElse(""); + } + protected MessageHdDataType extractMessageHdDataType( Supplier namespaceExtractor, Supplier universalIdExtractor, diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java index 860322752..889ec25ee 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/external/hapi/HapiOrder.java @@ -2,8 +2,6 @@ import gov.hhs.cdc.trustedintermediary.etor.orders.Order; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.Patient; /** * A concrete implementation of a {@link Order} that uses the Hapi FHIR bundle as its underlying @@ -14,20 +12,4 @@ public class HapiOrder extends HapiMessage implements Order { public HapiOrder(Bundle innerOrder) { super(innerOrder); } - - @Override - public String getPatientId() { - return HapiHelper.resourcesInBundle(innerResource, Patient.class) - .flatMap(patient -> patient.getIdentifier().stream()) - .filter( - identifier -> - identifier - .getType() - .hasCoding( - "http://terminology.hl7.org/CodeSystem/v2-0203", - "MR")) - .map(Identifier::getValue) - .findFirst() - .orElse(""); - } }