3719 enable map response terminology for bulk export (#3735)
* added failing test for Map Response Terminology for bulk export * moved logic for terminology translation out of the interceptor to svc, added translation logic to bulk export file writer, added more tests * added changelog * Wip refactor dependency fix * wip terminology translation code refactor * terminology translation code refactor * refactor clean up * Remove circular dependency * Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/6_1_0/3719-enable-map-response-terminology-for-bulk-export.yaml * bump version of hapi to 6.1.0-PRE7-SNAPSHOT * doc update * fix issue when search param registry doesn't contain search param for the resource type * fix beans * hapi version bump from PRE7 to PRE10 * doc update * add ResponseTerminologyTranslationSvc as a constructor variable to the interceptor * fixed ResponseTerminologyInterceptorLoaderTest, added IT for cdr side * version bump to PRE13 * removed unused import Co-authored-by: Steven Li <steven@smilecdr.com> Co-authored-by: Tadgh <garygrantgraham@gmail.com> Co-authored-by: Ken Stevens <ken@smilecdr.com>
This commit is contained in:
parent
3d4556b70b
commit
2bc6c91153
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -3,14 +3,14 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-bom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>HAPI FHIR BOM</name>
|
||||
|
||||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-cli</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../hapi-deployable-pom</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -249,13 +249,14 @@ public class ServletExamples {
|
|||
public class RestfulServerWithResponseTerminologyTranslationInterceptor extends RestfulServer {
|
||||
|
||||
private IValidationSupport myValidationSupport;
|
||||
private ResponseTerminologyTranslationSvc myResponseTerminologyTranslationSvc;
|
||||
|
||||
@Override
|
||||
protected void initialize() throws ServletException {
|
||||
// START SNIPPET: ResponseTerminologyTranslationInterceptor
|
||||
|
||||
// Create an interceptor that will map from a proprietary CodeSystem to LOINC
|
||||
ResponseTerminologyTranslationInterceptor interceptor = new ResponseTerminologyTranslationInterceptor(myValidationSupport);
|
||||
ResponseTerminologyTranslationInterceptor interceptor = new ResponseTerminologyTranslationInterceptor(myValidationSupport, myResponseTerminologyTranslationSvc);
|
||||
interceptor.addMappingSpecification("http://examplelabs.org", "http://loinc.org");
|
||||
|
||||
// Register the interceptor
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
type: add
|
||||
issue: 3719
|
||||
title: "Added support to Bulk Export for FHIR Response Terminology Translation. It will use the same mappings as the Translation Interceptor."
|
|
@ -11,7 +11,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -140,6 +140,7 @@ import ca.uhn.fhir.rest.api.server.RequestDetails;
|
|||
import ca.uhn.fhir.rest.api.server.storage.IDeleteExpungeJobSubmitter;
|
||||
import ca.uhn.fhir.rest.api.server.storage.ResourcePersistentId;
|
||||
import ca.uhn.fhir.rest.server.interceptor.ResponseTerminologyTranslationInterceptor;
|
||||
import ca.uhn.fhir.rest.server.interceptor.ResponseTerminologyTranslationSvc;
|
||||
import ca.uhn.fhir.rest.server.interceptor.consent.IConsentContextServices;
|
||||
import ca.uhn.fhir.rest.server.interceptor.partition.RequestTenantPartitionInterceptor;
|
||||
import ca.uhn.fhir.util.ThreadPoolUtil;
|
||||
|
@ -223,8 +224,14 @@ public class JpaConfig {
|
|||
|
||||
@Lazy
|
||||
@Bean
|
||||
public ResponseTerminologyTranslationInterceptor responseTerminologyTranslationInterceptor(IValidationSupport theValidationSupport) {
|
||||
return new ResponseTerminologyTranslationInterceptor(theValidationSupport);
|
||||
public ResponseTerminologyTranslationInterceptor responseTerminologyTranslationInterceptor(IValidationSupport theValidationSupport, ResponseTerminologyTranslationSvc theResponseTerminologyTranslationSvc) {
|
||||
return new ResponseTerminologyTranslationInterceptor(theValidationSupport, theResponseTerminologyTranslationSvc);
|
||||
}
|
||||
|
||||
@Lazy
|
||||
@Bean
|
||||
public ResponseTerminologyTranslationSvc responseTerminologyTranslationSvc(IValidationSupport theValidationSupport) {
|
||||
return new ResponseTerminologyTranslationSvc(theValidationSupport);
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -1,11 +1,21 @@
|
|||
package ca.uhn.fhir.jpa.interceptor;
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.interceptor.api.IInterceptorService;
|
||||
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
|
||||
import ca.uhn.fhir.jpa.batch.config.BatchConstants;
|
||||
import ca.uhn.fhir.jpa.bulk.export.api.IBulkDataExportJobSchedulingHelper;
|
||||
import ca.uhn.fhir.jpa.bulk.export.api.IBulkDataExportSvc;
|
||||
import ca.uhn.fhir.jpa.bulk.export.model.BulkExportJobStatusEnum;
|
||||
import ca.uhn.fhir.jpa.provider.r4.BaseResourceProviderR4Test;
|
||||
import ca.uhn.fhir.rest.api.Constants;
|
||||
import ca.uhn.fhir.rest.api.server.bulk.BulkDataExportOptions;
|
||||
import ca.uhn.fhir.rest.server.interceptor.ResponseTerminologyTranslationInterceptor;
|
||||
import ca.uhn.fhir.util.UrlUtil;
|
||||
import com.google.common.collect.Sets;
|
||||
import org.hamcrest.Matchers;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
import org.hl7.fhir.r4.model.Binary;
|
||||
import org.hl7.fhir.r4.model.Coding;
|
||||
import org.hl7.fhir.r4.model.Observation;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
|
@ -14,16 +24,21 @@ import org.junit.jupiter.api.Test;
|
|||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.containsString;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceProviderR4Test {
|
||||
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResponseTerminologyTranslationInterceptorTest.class);
|
||||
public static final String TEST_OBV_FILTER = "Observation?status=amended";
|
||||
|
||||
@Autowired
|
||||
private DaoRegistry myDaoRegistry;
|
||||
|
@ -31,6 +46,13 @@ public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceP
|
|||
private IInterceptorService myInterceptorBroadcaster;
|
||||
@Autowired
|
||||
private ResponseTerminologyTranslationInterceptor myResponseTerminologyTranslationInterceptor;
|
||||
@Autowired
|
||||
private IBulkDataExportSvc myBulkDataExportSvc;
|
||||
@Autowired
|
||||
private IBulkDataExportJobSchedulingHelper myBulkDataExportJobSchedulingHelper;
|
||||
|
||||
@Autowired
|
||||
private FhirContext myFhirContext;
|
||||
|
||||
@BeforeEach
|
||||
public void beforeEach() {
|
||||
|
@ -50,7 +72,7 @@ public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceP
|
|||
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation .getCode()
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "12345", null));
|
||||
IIdType id = myObservationDao.create(observation).getId();
|
||||
|
||||
|
@ -69,7 +91,7 @@ public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceP
|
|||
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation .getCode()
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "12345", null));
|
||||
IIdType id = myObservationDao.create(observation).getId();
|
||||
|
||||
|
@ -92,7 +114,7 @@ public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceP
|
|||
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation .getCode()
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "12345", null))
|
||||
.addCoding(new Coding(CS_URL_2, "9999", "Display 9999"));
|
||||
IIdType id = myObservationDao.create(observation).getId();
|
||||
|
@ -112,7 +134,7 @@ public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceP
|
|||
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation .getCode()
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "FOO", null));
|
||||
IIdType id = myObservationDao.create(observation).getId();
|
||||
|
||||
|
@ -124,10 +146,111 @@ public class ResponseTerminologyTranslationInterceptorTest extends BaseResourceP
|
|||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBulkExport_TerminologyTranslation_MappingFound() {
|
||||
// Create some resources to load
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "12345", null));
|
||||
myObservationDao.create(observation);
|
||||
|
||||
// set mapping specs
|
||||
myResponseTerminologyTranslationInterceptor.addMappingSpecification(CS_URL, CS_URL_2);
|
||||
List<String> codingList = Arrays.asList(
|
||||
"{\"system\":\"http://example.com/my_code_system\",\"code\":\"12345\"}",
|
||||
"{\"system\":\"http://example.com/my_code_system2\",\"code\":\"34567\",\"display\":\"Target Code 34567\"}");
|
||||
|
||||
createBulkJobAndCheckCodingList(codingList);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBulkExport_TerminologyTranslation_MappingNotNeeded() {
|
||||
// Create some resources to load
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "12345", null))
|
||||
.addCoding(new Coding(CS_URL_2, "9999", "Display 9999"));
|
||||
myObservationDao.create(observation);
|
||||
|
||||
// set mapping specs
|
||||
myResponseTerminologyTranslationInterceptor.addMappingSpecification(CS_URL, CS_URL_2);
|
||||
List<String> codingList = Arrays.asList(
|
||||
"{\"system\":\"http://example.com/my_code_system\",\"code\":\"12345\"}",
|
||||
"{\"system\":\"http://example.com/my_code_system2\",\"code\":\"9999\",\"display\":\"Display 9999\"}");
|
||||
|
||||
createBulkJobAndCheckCodingList(codingList);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBulkExport_TerminologyTranslation_NoMapping() {
|
||||
// Create some resources to load
|
||||
Observation observation = new Observation();
|
||||
observation.setStatus(Observation.ObservationStatus.AMENDED);
|
||||
observation.getCode()
|
||||
.addCoding(new Coding(CS_URL, "12345", null));
|
||||
myObservationDao.create(observation);
|
||||
|
||||
List<String> codingList = List.of(
|
||||
"{\"system\":\"http://example.com/my_code_system\",\"code\":\"12345\"}");
|
||||
|
||||
createBulkJobAndCheckCodingList(codingList);
|
||||
}
|
||||
|
||||
private void createBulkJobAndCheckCodingList(List<String> codingList) {
|
||||
// Create a bulk job
|
||||
BulkDataExportOptions options = new BulkDataExportOptions();
|
||||
options.setResourceTypes(Sets.newHashSet("Observation"));
|
||||
options.setFilters(Sets.newHashSet(TEST_OBV_FILTER));
|
||||
options.setExportStyle(BulkDataExportOptions.ExportStyle.SYSTEM);
|
||||
|
||||
IBulkDataExportSvc.JobInfo jobDetails = myBulkDataExportSvc.submitJob(options, true, mySrd);
|
||||
assertNotNull(jobDetails.getJobId());
|
||||
|
||||
// Check the status
|
||||
IBulkDataExportSvc.JobInfo status = myBulkDataExportSvc.getJobInfoOrThrowResourceNotFound(jobDetails.getJobId());
|
||||
assertEquals(BulkExportJobStatusEnum.SUBMITTED, status.getStatus());
|
||||
assertEquals("/$export?_outputFormat=application%2Ffhir%2Bndjson&_type=Observation&_typeFilter=" + UrlUtil.escapeUrlParam(TEST_OBV_FILTER), status.getRequest());
|
||||
|
||||
// Run a scheduled pass to build the export
|
||||
myBulkDataExportJobSchedulingHelper.startSubmittedJobs();
|
||||
awaitAllBulkJobCompletions();
|
||||
|
||||
// Fetch the job again
|
||||
status = myBulkDataExportSvc.getJobInfoOrThrowResourceNotFound(jobDetails.getJobId());
|
||||
assertEquals(BulkExportJobStatusEnum.COMPLETE, status.getStatus());
|
||||
|
||||
// Iterate over the files
|
||||
for (IBulkDataExportSvc.FileEntry next : status.getFiles()) {
|
||||
Binary nextBinary = myBinaryDao.read(next.getResourceId());
|
||||
assertEquals(Constants.CT_FHIR_NDJSON, nextBinary.getContentType());
|
||||
String nextContents = new String(nextBinary.getContent(), Constants.CHARSET_UTF8);
|
||||
ourLog.info("Next contents for type {}:\n{}", next.getResourceType(), nextContents);
|
||||
if ("Observation".equals(next.getResourceType())) {
|
||||
for (String coding : codingList) {
|
||||
assertThat(nextContents, containsString(coding));
|
||||
}
|
||||
} else {
|
||||
fail(next.getResourceType());
|
||||
}
|
||||
}
|
||||
|
||||
assertEquals(1, status.getFiles().size());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private List<String> toCodeStrings(Observation observation) {
|
||||
return observation.getCode().getCoding().stream().map(t -> "[system=" + t.getSystem() + ", code=" + t.getCode() + ", display=" + t.getDisplay() + "]").collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
private void awaitAllBulkJobCompletions() {
|
||||
myBatchJobHelper.awaitAllBulkJobCompletions(
|
||||
BatchConstants.BULK_EXPORT_JOB_NAME,
|
||||
BatchConstants.PATIENT_BULK_EXPORT_JOB_NAME,
|
||||
BatchConstants.GROUP_BULK_EXPORT_JOB_NAME,
|
||||
BatchConstants.DELETE_EXPUNGE_JOB_NAME,
|
||||
BatchConstants.MDM_CLEAR_JOB_NAME
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@ public class BaseResponseTerminologyInterceptor {
|
|||
Validate.notNull(myContext, "The validation support must not return a null context");
|
||||
}
|
||||
|
||||
|
||||
@Nonnull
|
||||
protected List<IBaseResource> toListForProcessing(RequestDetails theRequestDetails, IBaseResource theResource) {
|
||||
|
||||
|
|
|
@ -20,34 +20,19 @@ package ca.uhn.fhir.rest.server.interceptor;
|
|||
* #L%
|
||||
*/
|
||||
|
||||
import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
|
||||
import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
|
||||
import ca.uhn.fhir.context.BaseRuntimeElementDefinition;
|
||||
import ca.uhn.fhir.context.RuntimePrimitiveDatatypeDefinition;
|
||||
import ca.uhn.fhir.context.support.IValidationSupport;
|
||||
import ca.uhn.fhir.context.support.TranslateConceptResult;
|
||||
import ca.uhn.fhir.context.support.TranslateConceptResults;
|
||||
import ca.uhn.fhir.interceptor.api.Hook;
|
||||
import ca.uhn.fhir.interceptor.api.Pointcut;
|
||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||
import ca.uhn.fhir.util.FhirTerser;
|
||||
import ca.uhn.fhir.util.IModelVisitor;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.hl7.fhir.instance.model.api.IBase;
|
||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import static ca.uhn.fhir.rest.server.interceptor.InterceptorOrders.RESPONSE_TERMINOLOGY_TRANSLATION_INTERCEPTOR;
|
||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||
|
||||
/**
|
||||
* This interceptor leverages ConceptMap resources stored in the repository to automatically map
|
||||
|
@ -62,39 +47,16 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
|||
*/
|
||||
public class ResponseTerminologyTranslationInterceptor extends BaseResponseTerminologyInterceptor {
|
||||
|
||||
private final BaseRuntimeChildDefinition myCodingSystemChild;
|
||||
private final BaseRuntimeChildDefinition myCodingCodeChild;
|
||||
private final BaseRuntimeElementDefinition<IPrimitiveType<?>> myUriDefinition;
|
||||
private final BaseRuntimeElementDefinition<IPrimitiveType<?>> myCodeDefinition;
|
||||
private final Class<? extends IBase> myCodeableConceptType;
|
||||
private final Class<? extends IBase> myCodingType;
|
||||
private final BaseRuntimeChildDefinition myCodeableConceptCodingChild;
|
||||
private final BaseRuntimeElementCompositeDefinition<?> myCodingDefinitition;
|
||||
private final RuntimePrimitiveDatatypeDefinition myStringDefinition;
|
||||
private final BaseRuntimeChildDefinition myCodingDisplayChild;
|
||||
private Map<String, String> myMappingSpecifications = new HashMap<>();
|
||||
private final ResponseTerminologyTranslationSvc myResponseTerminologyTranslationSvc;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param theValidationSupport The validation support module
|
||||
*/
|
||||
public ResponseTerminologyTranslationInterceptor(IValidationSupport theValidationSupport) {
|
||||
public ResponseTerminologyTranslationInterceptor(IValidationSupport theValidationSupport, ResponseTerminologyTranslationSvc theResponseTerminologyTranslationSvc) {
|
||||
super(theValidationSupport);
|
||||
|
||||
BaseRuntimeElementCompositeDefinition<?> codeableConceptDef = (BaseRuntimeElementCompositeDefinition<?>) Objects.requireNonNull(myContext.getElementDefinition("CodeableConcept"));
|
||||
myCodeableConceptType = codeableConceptDef.getImplementingClass();
|
||||
myCodeableConceptCodingChild = codeableConceptDef.getChildByName("coding");
|
||||
|
||||
myCodingDefinitition = (BaseRuntimeElementCompositeDefinition<?>) Objects.requireNonNull(myContext.getElementDefinition("Coding"));
|
||||
myCodingType = myCodingDefinitition.getImplementingClass();
|
||||
myCodingSystemChild = myCodingDefinitition.getChildByName("system");
|
||||
myCodingCodeChild = myCodingDefinitition.getChildByName("code");
|
||||
myCodingDisplayChild = myCodingDefinitition.getChildByName("display");
|
||||
|
||||
myUriDefinition = (RuntimePrimitiveDatatypeDefinition) myContext.getElementDefinition("uri");
|
||||
myCodeDefinition = (RuntimePrimitiveDatatypeDefinition) myContext.getElementDefinition("code");
|
||||
myStringDefinition = (RuntimePrimitiveDatatypeDefinition) myContext.getElementDefinition("string");
|
||||
myResponseTerminologyTranslationSvc = theResponseTerminologyTranslationSvc;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -105,94 +67,23 @@ public class ResponseTerminologyTranslationInterceptor extends BaseResponseTermi
|
|||
* @param theTargetCodeSystemUrl The target CodeSystem URL
|
||||
*/
|
||||
public void addMappingSpecification(String theSourceCodeSystemUrl, String theTargetCodeSystemUrl) {
|
||||
Validate.notBlank(theSourceCodeSystemUrl, "theSourceCodeSystemUrl must not be null or blank");
|
||||
Validate.notBlank(theTargetCodeSystemUrl, "theTargetCodeSystemUrl must not be null or blank");
|
||||
|
||||
myMappingSpecifications.put(theSourceCodeSystemUrl, theTargetCodeSystemUrl);
|
||||
myResponseTerminologyTranslationSvc.addMappingSpecification(theSourceCodeSystemUrl, theTargetCodeSystemUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all mapping specifications
|
||||
*/
|
||||
public void clearMappingSpecifications() {
|
||||
myMappingSpecifications.clear();
|
||||
myResponseTerminologyTranslationSvc.clearMappingSpecifications();
|
||||
}
|
||||
|
||||
public Map<String, String> getMappingSpecifications() {
|
||||
return myResponseTerminologyTranslationSvc.getMappingSpecifications();
|
||||
}
|
||||
|
||||
@Hook(value = Pointcut.SERVER_OUTGOING_RESPONSE, order = RESPONSE_TERMINOLOGY_TRANSLATION_INTERCEPTOR)
|
||||
public void handleResource(RequestDetails theRequestDetails, IBaseResource theResource) {
|
||||
List<IBaseResource> resources = toListForProcessing(theRequestDetails, theResource);
|
||||
|
||||
FhirTerser terser = myContext.newTerser();
|
||||
for (IBaseResource nextResource : resources) {
|
||||
terser.visit(nextResource, new MappingVisitor());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private class MappingVisitor implements IModelVisitor {
|
||||
|
||||
@Override
|
||||
public void acceptElement(IBaseResource theResource, IBase theElement, List<String> thePathToElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition) {
|
||||
if (myCodeableConceptType.isAssignableFrom(theElement.getClass())) {
|
||||
|
||||
// Find all existing Codings
|
||||
Multimap<String, String> foundSystemsToCodes = ArrayListMultimap.create();
|
||||
List<IBase> nextCodeableConceptCodings = myCodeableConceptCodingChild.getAccessor().getValues(theElement);
|
||||
for (IBase nextCodeableConceptCoding : nextCodeableConceptCodings) {
|
||||
String system = myCodingSystemChild.getAccessor().getFirstValueOrNull(nextCodeableConceptCoding).map(t -> (IPrimitiveType<?>) t).map(t -> t.getValueAsString()).orElse(null);
|
||||
String code = myCodingCodeChild.getAccessor().getFirstValueOrNull(nextCodeableConceptCoding).map(t -> (IPrimitiveType<?>) t).map(t -> t.getValueAsString()).orElse(null);
|
||||
if (isNotBlank(system) && isNotBlank(code) && !foundSystemsToCodes.containsKey(system)) {
|
||||
foundSystemsToCodes.put(system, code);
|
||||
}
|
||||
}
|
||||
|
||||
// Look for mappings
|
||||
for (String nextSourceSystem : foundSystemsToCodes.keySet()) {
|
||||
String wantTargetSystem = myMappingSpecifications.get(nextSourceSystem);
|
||||
if (wantTargetSystem != null) {
|
||||
if (!foundSystemsToCodes.containsKey(wantTargetSystem)) {
|
||||
|
||||
for (String code : foundSystemsToCodes.get(nextSourceSystem)) {
|
||||
List<IBaseCoding> codings = new ArrayList<IBaseCoding>();
|
||||
codings.add(createCodingFromPrimitives(nextSourceSystem, code, null));
|
||||
TranslateConceptResults translateConceptResults = myValidationSupport.translateConcept(new IValidationSupport.TranslateCodeRequest(codings, wantTargetSystem));
|
||||
if (translateConceptResults != null) {
|
||||
List<TranslateConceptResult> mappings = translateConceptResults.getResults();
|
||||
for (TranslateConceptResult nextMapping : mappings) {
|
||||
|
||||
IBase newCoding = createCodingFromPrimitives(
|
||||
nextMapping.getSystem(),
|
||||
nextMapping.getCode(),
|
||||
nextMapping.getDisplay());
|
||||
|
||||
// Add coding to existing CodeableConcept
|
||||
myCodeableConceptCodingChild.getMutator().addValue(theElement, newCoding);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private IBaseCoding createCodingFromPrimitives(String system, String code, String display) {
|
||||
IBaseCoding newCoding = (IBaseCoding) myCodingDefinitition.newInstance();
|
||||
IPrimitiveType<?> newSystem = myUriDefinition.newInstance(system);
|
||||
myCodingSystemChild.getMutator().addValue(newCoding, newSystem);
|
||||
IPrimitiveType<?> newCode = myCodeDefinition.newInstance(code);
|
||||
myCodingCodeChild.getMutator().addValue(newCoding, newCode);
|
||||
if (isNotBlank(display)) {
|
||||
IPrimitiveType<?> newDisplay = myStringDefinition.newInstance(display);
|
||||
myCodingDisplayChild.getMutator().addValue(newCoding, newDisplay);
|
||||
}
|
||||
return newCoding;
|
||||
}
|
||||
|
||||
myResponseTerminologyTranslationSvc.processResourcesForTerminologyTranslation(resources);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,179 @@
|
|||
package ca.uhn.fhir.rest.server.interceptor;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* HAPI FHIR - Server Framework
|
||||
* %%
|
||||
* Copyright (C) 2014 - 2022 Smile CDR, Inc.
|
||||
* %%
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
|
||||
import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
|
||||
import ca.uhn.fhir.context.BaseRuntimeElementDefinition;
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.RuntimePrimitiveDatatypeDefinition;
|
||||
import ca.uhn.fhir.context.support.IValidationSupport;
|
||||
import ca.uhn.fhir.context.support.TranslateConceptResult;
|
||||
import ca.uhn.fhir.context.support.TranslateConceptResults;
|
||||
import ca.uhn.fhir.util.FhirTerser;
|
||||
import ca.uhn.fhir.util.IModelVisitor;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.hl7.fhir.instance.model.api.IBase;
|
||||
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
public class ResponseTerminologyTranslationSvc {
|
||||
private BaseRuntimeChildDefinition myCodingSystemChild;
|
||||
private BaseRuntimeChildDefinition myCodingCodeChild;
|
||||
private BaseRuntimeElementDefinition<IPrimitiveType<?>> myUriDefinition;
|
||||
private BaseRuntimeElementDefinition<IPrimitiveType<?>> myCodeDefinition;
|
||||
private Class<? extends IBase> myCodeableConceptType;
|
||||
private Class<? extends IBase> myCodingType;
|
||||
private BaseRuntimeChildDefinition myCodeableConceptCodingChild;
|
||||
private BaseRuntimeElementCompositeDefinition<?> myCodingDefinition;
|
||||
private RuntimePrimitiveDatatypeDefinition myStringDefinition;
|
||||
private BaseRuntimeChildDefinition myCodingDisplayChild;
|
||||
private Map<String, String> myMappingSpec;
|
||||
private final IValidationSupport myValidationSupport;
|
||||
private final FhirContext myFhirContext;
|
||||
|
||||
public ResponseTerminologyTranslationSvc(@Nonnull IValidationSupport theValidationSupport) {
|
||||
myValidationSupport = theValidationSupport;
|
||||
Validate.notNull(theValidationSupport, "The validation support must not be null");
|
||||
|
||||
myFhirContext = theValidationSupport.getFhirContext();
|
||||
Validate.notNull(myFhirContext, "The validation support must not return a null context");
|
||||
|
||||
BaseRuntimeElementCompositeDefinition<?> codeableConceptDef = (BaseRuntimeElementCompositeDefinition<?>) Objects.requireNonNull(myFhirContext.getElementDefinition("CodeableConcept"));
|
||||
|
||||
myCodeableConceptType = codeableConceptDef.getImplementingClass();
|
||||
myCodeableConceptCodingChild = codeableConceptDef.getChildByName("coding");
|
||||
|
||||
myCodingDefinition = (BaseRuntimeElementCompositeDefinition<?>) Objects.requireNonNull(myFhirContext.getElementDefinition("Coding"));
|
||||
myCodingType = myCodingDefinition.getImplementingClass();
|
||||
myCodingSystemChild = myCodingDefinition.getChildByName("system");
|
||||
myCodingCodeChild = myCodingDefinition.getChildByName("code");
|
||||
myCodingDisplayChild = myCodingDefinition.getChildByName("display");
|
||||
|
||||
myUriDefinition = (RuntimePrimitiveDatatypeDefinition) myFhirContext.getElementDefinition("uri");
|
||||
myCodeDefinition = (RuntimePrimitiveDatatypeDefinition) myFhirContext.getElementDefinition("code");
|
||||
myStringDefinition = (RuntimePrimitiveDatatypeDefinition) myFhirContext.getElementDefinition("string");
|
||||
}
|
||||
|
||||
public void processResourcesForTerminologyTranslation(List<IBaseResource> resources) {
|
||||
FhirTerser terser = myFhirContext.newTerser();
|
||||
for (IBaseResource nextResource : resources) {
|
||||
terser.visit(nextResource, new MappingVisitor());
|
||||
}
|
||||
}
|
||||
|
||||
public void addMappingSpecification(String theSourceCodeSystemUrl, String theTargetCodeSystemUrl) {
|
||||
Validate.notBlank(theSourceCodeSystemUrl, "theSourceCodeSystemUrl must not be null or blank");
|
||||
Validate.notBlank(theTargetCodeSystemUrl, "theTargetCodeSystemUrl must not be null or blank");
|
||||
|
||||
getMappingSpecifications().put(theSourceCodeSystemUrl, theTargetCodeSystemUrl);
|
||||
}
|
||||
|
||||
public void clearMappingSpecifications() {
|
||||
myMappingSpec.clear();
|
||||
}
|
||||
|
||||
public Map<String, String> getMappingSpecifications() {
|
||||
if (myMappingSpec == null) {
|
||||
myMappingSpec = new HashMap<>();
|
||||
}
|
||||
return myMappingSpec;
|
||||
}
|
||||
|
||||
private class MappingVisitor implements IModelVisitor {
|
||||
|
||||
@Override
|
||||
public void acceptElement(IBaseResource theResource, IBase theElement, List<String> thePathToElement, BaseRuntimeChildDefinition theChildDefinition, BaseRuntimeElementDefinition<?> theDefinition) {
|
||||
if (myCodeableConceptType.isAssignableFrom(theElement.getClass())) {
|
||||
|
||||
// Find all existing Codings
|
||||
Multimap<String, String> foundSystemsToCodes = ArrayListMultimap.create();
|
||||
List<IBase> nextCodeableConceptCodings = myCodeableConceptCodingChild.getAccessor().getValues(theElement);
|
||||
for (IBase nextCodeableConceptCoding : nextCodeableConceptCodings) {
|
||||
String system = myCodingSystemChild.getAccessor().getFirstValueOrNull(nextCodeableConceptCoding).map(t -> (IPrimitiveType<?>) t).map(IPrimitiveType::getValueAsString).orElse(null);
|
||||
String code = myCodingCodeChild.getAccessor().getFirstValueOrNull(nextCodeableConceptCoding).map(t -> (IPrimitiveType<?>) t).map(IPrimitiveType::getValueAsString).orElse(null);
|
||||
if (StringUtils.isNotBlank(system) && StringUtils.isNotBlank(code) && !foundSystemsToCodes.containsKey(system)) {
|
||||
foundSystemsToCodes.put(system, code);
|
||||
}
|
||||
}
|
||||
|
||||
// Look for mappings
|
||||
for (String nextSourceSystem : foundSystemsToCodes.keySet()) {
|
||||
String wantTargetSystem = getMappingSpecifications().get(nextSourceSystem);
|
||||
if (wantTargetSystem != null) {
|
||||
if (!foundSystemsToCodes.containsKey(wantTargetSystem)) {
|
||||
|
||||
for (String code : foundSystemsToCodes.get(nextSourceSystem)) {
|
||||
List<IBaseCoding> codings = new ArrayList<>();
|
||||
codings.add(createCodingFromPrimitives(nextSourceSystem, code, null));
|
||||
TranslateConceptResults translateConceptResults = myValidationSupport.translateConcept(new IValidationSupport.TranslateCodeRequest(codings, wantTargetSystem));
|
||||
if (translateConceptResults != null) {
|
||||
List<TranslateConceptResult> mappings = translateConceptResults.getResults();
|
||||
for (TranslateConceptResult nextMapping : mappings) {
|
||||
|
||||
IBase newCoding = createCodingFromPrimitives(
|
||||
nextMapping.getSystem(),
|
||||
nextMapping.getCode(),
|
||||
nextMapping.getDisplay());
|
||||
|
||||
// Add coding to existing CodeableConcept
|
||||
myCodeableConceptCodingChild.getMutator().addValue(theElement, newCoding);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private IBaseCoding createCodingFromPrimitives(String system, String code, String display) {
|
||||
assert myUriDefinition != null;
|
||||
assert myCodeDefinition != null;
|
||||
IBaseCoding newCoding = (IBaseCoding) myCodingDefinition.newInstance();
|
||||
IPrimitiveType<?> newSystem = myUriDefinition.newInstance(system);
|
||||
myCodingSystemChild.getMutator().addValue(newCoding, newSystem);
|
||||
IPrimitiveType<?> newCode = myCodeDefinition.newInstance(code);
|
||||
myCodingCodeChild.getMutator().addValue(newCoding, newCode);
|
||||
if (StringUtils.isNotBlank(display)) {
|
||||
assert myStringDefinition != null;
|
||||
IPrimitiveType<?> newDisplay = myStringDefinition.newInstance(display);
|
||||
myCodingDisplayChild.getMutator().addValue(newCoding, newDisplay);
|
||||
}
|
||||
return newCoding;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-spring-boot-samples</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>hapi-fhir-spring-boot-sample-client-apache</artifactId>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-spring-boot-samples</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>hapi-fhir-spring-boot-sample-client-okhttp</artifactId>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-spring-boot-samples</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>hapi-fhir-spring-boot-sample-server-jersey</artifactId>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-spring-boot</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>hapi-fhir-spring-boot-samples</artifactId>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -30,12 +30,15 @@ import ca.uhn.fhir.jpa.batch.log.Logs;
|
|||
import ca.uhn.fhir.jpa.partition.SystemRequestDetails;
|
||||
import ca.uhn.fhir.parser.IParser;
|
||||
import ca.uhn.fhir.rest.api.Constants;
|
||||
import ca.uhn.fhir.rest.server.interceptor.ResponseTerminologyTranslationInterceptor;
|
||||
import ca.uhn.fhir.rest.server.interceptor.ResponseTerminologyTranslationSvc;
|
||||
import ca.uhn.fhir.util.BinaryUtil;
|
||||
import org.hl7.fhir.instance.model.api.IBaseBinary;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
import org.slf4j.Logger;
|
||||
import org.springframework.batch.item.ItemWriter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
|
@ -62,6 +65,9 @@ public abstract class BaseResourceToFileWriter implements ItemWriter<List<IBaseR
|
|||
private final OutputStreamWriter myWriter;
|
||||
private final IParser myParser;
|
||||
|
||||
@Autowired
|
||||
private ResponseTerminologyTranslationSvc myResponseTerminologyTranslationSvc;
|
||||
|
||||
protected BaseResourceToFileWriter(FhirContext theFhirContext, DaoRegistry theDaoRegistry) {
|
||||
myFhirContext = theFhirContext;
|
||||
myDaoRegistry = theDaoRegistry;
|
||||
|
@ -70,7 +76,6 @@ public abstract class BaseResourceToFileWriter implements ItemWriter<List<IBaseR
|
|||
myWriter = new OutputStreamWriter(myOutputStream, Constants.CHARSET_UTF8);
|
||||
}
|
||||
|
||||
|
||||
protected IIdType createBinaryFromOutputStream() {
|
||||
IBaseBinary binary = BinaryUtil.newBinary(myFhirContext);
|
||||
binary.setContentType(Constants.CT_FHIR_NDJSON);
|
||||
|
@ -81,9 +86,9 @@ public abstract class BaseResourceToFileWriter implements ItemWriter<List<IBaseR
|
|||
|
||||
@Override
|
||||
public void write(List<? extends List<IBaseResource>> theList) throws Exception {
|
||||
|
||||
int count = 0;
|
||||
for (List<IBaseResource> resourceList : theList) {
|
||||
myResponseTerminologyTranslationSvc.processResourcesForTerminologyTranslation(resourceList);
|
||||
for (IBaseResource nextFileResource : resourceList) {
|
||||
myParser.encodeResourceToWriter(nextFileResource, myWriter);
|
||||
myWriter.append("\n");
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-deployable-pom</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../hapi-deployable-pom/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
@ -58,37 +58,37 @@
|
|||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-structures-dstu3</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-structures-hl7org-dstu2</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-structures-r4</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-structures-r5</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-validation-resources-dstu2</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-validation-resources-dstu3</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-validation-resources-r4</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.velocity</groupId>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
4
pom.xml
4
pom.xml
|
@ -6,7 +6,7 @@
|
|||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<name>HAPI-FHIR</name>
|
||||
<description>An open-source implementation of the FHIR specification in Java.</description>
|
||||
<url>https://hapifhir.io</url>
|
||||
|
@ -2011,7 +2011,7 @@
|
|||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir-checkstyle</artifactId>
|
||||
<!-- Remember to bump this when you upgrade the version -->
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||
<artifactId>hapi-fhir</artifactId>
|
||||
<version>6.1.0-PRE12-SNAPSHOT</version>
|
||||
<version>6.1.0-PRE13-SNAPSHOT</version>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
|
Loading…
Reference in New Issue