From ebec8a3f43f420ccd036b228f327089331ba8570 Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Thu, 16 Dec 2021 15:28:39 +0000 Subject: [PATCH 01/12] AMB-962 rename test transformer namespace to converter --- .../{transformers => converter}/BundleConverterTest.java | 3 +-- .../MedicationRequestConverterTest.java | 3 +-- .../MedicationStatementConverterTest.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) rename docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/{transformers => converter}/BundleConverterTest.java (93%) rename docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/{transformers => converter}/MedicationRequestConverterTest.java (97%) rename docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/{transformers => converter}/MedicationStatementConverterTest.java (97%) diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/BundleConverterTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/BundleConverterTest.java similarity index 93% rename from docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/BundleConverterTest.java rename to docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/BundleConverterTest.java index 564adb4..ce05e24 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/BundleConverterTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/BundleConverterTest.java @@ -1,7 +1,6 @@ -package nhsd.fhir.converter.service.transformers; +package nhsd.fhir.converter.service.converter; import ca.uhn.fhir.context.FhirVersionEnum; -import nhsd.fhir.converter.service.converter.BundleConverter; import org.apache.commons.io.FileUtils; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/MedicationRequestConverterTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/MedicationRequestConverterTest.java similarity index 97% rename from docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/MedicationRequestConverterTest.java rename to docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/MedicationRequestConverterTest.java index 3d4f4ed..589fc68 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/MedicationRequestConverterTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/MedicationRequestConverterTest.java @@ -1,7 +1,6 @@ -package nhsd.fhir.converter.service.transformers; +package nhsd.fhir.converter.service.converter; import ca.uhn.fhir.context.FhirVersionEnum; -import nhsd.fhir.converter.service.converter.MedicationRequestConverter; import org.apache.commons.io.FileUtils; import org.json.JSONException; import org.json.JSONObject; diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/MedicationStatementConverterTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/MedicationStatementConverterTest.java similarity index 97% rename from docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/MedicationStatementConverterTest.java rename to docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/MedicationStatementConverterTest.java index a1685a3..86255bf 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/transformers/MedicationStatementConverterTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/converter/MedicationStatementConverterTest.java @@ -1,7 +1,6 @@ -package nhsd.fhir.converter.service.transformers; +package nhsd.fhir.converter.service.converter; import ca.uhn.fhir.context.FhirVersionEnum; -import nhsd.fhir.converter.service.converter.MedicationStatementConverter; import org.apache.commons.io.FileUtils; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; From 19188cb5f5a3bc3fae1f137e7a05c11dc10c994f Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Fri, 17 Dec 2021 16:16:23 +0000 Subject: [PATCH 02/12] AMB-962 get parser->converter->transformer->encoder working for stu3 json without transformer logic yet! --- .../converter/service/mapping/Converter.java | 193 ++++++++++++++++++ .../mapping/ConverterComponentTest.java | 41 ++++ .../service/mapping/ConverterServiceTest.java | 127 ++++++++++++ .../service/mapping/FhirParserTest.java | 36 ++++ .../MedicationRequest_GPConnect.json | 91 +++++++++ .../src/test/resources/STU3_MedRequest.json | 62 +++++- 6 files changed, 549 insertions(+), 1 deletion(-) create mode 100644 docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java create mode 100644 docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java create mode 100644 docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java create mode 100644 docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java create mode 100644 docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java new file mode 100644 index 0000000..125fa15 --- /dev/null +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java @@ -0,0 +1,193 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.FhirVersionEnum; +import ca.uhn.fhir.parser.IParser; +import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40; +import org.hl7.fhir.convertors.conv30_40.VersionConvertor_30_40; +import org.hl7.fhir.dstu3.model.Resource; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.MedicationRequest; +import org.hl7.fhir.r4.model.MedicationStatement; +import org.json.JSONObject; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.StringReader; + +@Configuration +class ConverterConfiguration { + @Bean + public FhirContext stu3FhirContext() { + return FhirContext.forDstu3(); + } + + @Bean + public FhirContext r4FhirContext() { + return FhirContext.forR4(); + } + + @Bean + public IParser stu3XmlParser(FhirContext stu3FhirContext) { + return stu3FhirContext.newXmlParser(); + } + + @Bean + public IParser stu3JsonParser(FhirContext stu3FhirContext) { + return stu3FhirContext.newJsonParser(); + } + + @Bean + public IParser r4XmlParser(FhirContext r4FhirContext) { + return r4FhirContext.newXmlParser(); + } + + @Bean + public IParser r4JsonParser(FhirContext r4FhirContext) { + return r4FhirContext.newJsonParser(); + } +} + +@Component +class ResourceTypeFactory { + public Class inferResourceType(String fhirResource, MediaType mediaType, FhirVersionEnum fhirVersion) throws ParserConfigurationException, IOException, SAXException { + String resourceType = getResourceType(fhirResource, mediaType); + switch (resourceType) { + case "MedicationRequest": + return FhirVersionEnum.R4.equals(fhirVersion) ? + MedicationRequest.class + : org.hl7.fhir.dstu3.model.MedicationRequest.class; + case "MedicationStatement": + return FhirVersionEnum.R4.equals(fhirVersion) ? + MedicationStatement.class + : org.hl7.fhir.dstu3.model.MedicationStatement.class; + } + throw new IllegalStateException("Resource not supported"); + } + + private String getResourceType(final String fhirSchema, MediaType mediaType) throws ParserConfigurationException, IOException, SAXException { + if ("xml".equals(mediaType.getSubtype())) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(new InputSource(new StringReader(fhirSchema))); + + return doc.getFirstChild().getNodeName(); + } else { + JSONObject json = new JSONObject(fhirSchema); + + return json.getString("resourceType"); + } + } + +} + +@Component +class Transformer { + T transform(T resource) { + return null; + } +} + +@Component +public class Converter { + private static final VersionConvertor_30_40 CONVERTER = new VersionConvertor_30_40(new BaseAdvisor_30_40()); + + public IBaseResource convert(IBaseResource resource, Class resourceType) { + boolean isR4 = "r4".contains(resourceType.getName()); + + if (isR4) { + return CONVERTER.convertResource((org.hl7.fhir.r4.model.Resource) resource); + } else { + return CONVERTER.convertResource((Resource) resource); + } + } +} + +@Component +class FhirParser { + private final IParser stu3JsonParser; + private final IParser r4JsonParser; + private final IParser stu3XmlParser; + private final IParser r4XmlParser; + + public FhirParser(IParser stu3JsonParser, IParser r4JsonParser, IParser stu3XmlParser, IParser r4XmlParser) { + this.stu3JsonParser = stu3JsonParser; + this.r4JsonParser = r4JsonParser; + this.stu3XmlParser = stu3XmlParser; + this.r4XmlParser = r4XmlParser; + } + + public T parse(String resource, Class resourceType, MediaType mediaType) { + boolean isR4 = resourceType.getName().contains("r4"); + + if (MediaType.APPLICATION_JSON == mediaType) { + if (isR4) { + return r4JsonParser.parseResource(resourceType, resource); + } else { + return stu3JsonParser.parseResource(resourceType, resource); + } + } +// } else if (MediaType.APPLICATION_XML == mediaType) { +// return stu3XmlParser.parseResource(MedicationRequest.class, resource); +// } + throw new IllegalStateException("Invalid Content-Type"); + } +} + +@Component +class FhirEncoder { + private final IParser stu3JsonParser; + private final IParser r4JsonParser; + private final IParser stu3XmlParser; + private final IParser r4XmlParser; + + public FhirEncoder(IParser stu3JsonParser, IParser r4JsonParser, IParser stu3XmlParser, IParser r4XmlParser) { + this.stu3JsonParser = stu3JsonParser; + this.r4JsonParser = r4JsonParser; + this.stu3XmlParser = stu3XmlParser; + this.r4XmlParser = r4XmlParser; + } + + public String encode(T resource, MediaType outMime, FhirVersionEnum outVersion) { + return ""; + } +} + +@Service +class ConverterService { + private final Converter converter; + private final Transformer transformer; + private final FhirParser fhirParser; + private final FhirEncoder fhirEncoder; + private final ResourceTypeFactory resourceTypeFactory; + + public ConverterService(Converter converter, Transformer transformer, FhirParser fhirParser, FhirEncoder fhirEncoder, ResourceTypeFactory resourceTypeFactory) { + this.converter = converter; + this.transformer = transformer; + this.fhirParser = fhirParser; + this.fhirEncoder = fhirEncoder; + this.resourceTypeFactory = resourceTypeFactory; + } + + public String convert(String resource, MediaType mediaType) throws ParserConfigurationException, IOException, SAXException { + Class resourceType = resourceTypeFactory.inferResourceType(resource, mediaType, FhirVersionEnum.DSTU3); + + IBaseResource fhirResource = fhirParser.parse(resource, resourceType, mediaType); + IBaseResource converted = converter.convert(fhirResource, resourceType); + IBaseResource transformed = transformer.transform(converted); + + String convertedStr = fhirEncoder.encode(transformed, MediaType.APPLICATION_JSON, FhirVersionEnum.R4); + + return convertedStr; + } +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java new file mode 100644 index 0000000..9b39f7c --- /dev/null +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java @@ -0,0 +1,41 @@ +package nhsd.fhir.converter.service.mapping; + +import nhsd.fhir.converter.service.ConverterTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.fail; + +@SpringBootTest +public class ConverterComponentTest { + @Autowired + private ConverterService converterService; + + private static String stu3JsonMedicationRequest; + + @Test + void it_should_convert_json_stu3_medication_request_to_r4() throws ParserConfigurationException, IOException, SAXException { + // When + String m = converterService.convert(stu3JsonMedicationRequest, MediaType.APPLICATION_JSON); + System.out.println(m); + + + } + + static { + InputStream is = ConverterTest.class.getClassLoader().getResourceAsStream("GPConnect/MedicationRequest_GPConnect.json"); +// InputStream is = ConverterTest.class.getClassLoader().getResourceAsStream("STU3_MedRequest.json"); + try { + stu3JsonMedicationRequest = new String(is.readAllBytes()); + } catch (IOException e) { + fail("Can't open test resource file"); + } + } +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java new file mode 100644 index 0000000..35a32f9 --- /dev/null +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java @@ -0,0 +1,127 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.context.FhirVersionEnum; +import nhsd.fhir.converter.service.ConverterTest; +import org.hl7.fhir.dstu3.model.MedicationRequest; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + + +@ExtendWith(MockitoExtension.class) +class ConverterServiceTest { + private ConverterService converterService; + + @Mock + private Converter converter; + @Mock + private Transformer transformer; + @Mock + private FhirParser fhirParser; + @Mock + private FhirEncoder fhirEncoder; + @Mock + private ResourceTypeFactory resourceTypeFactory; + + private static String stu3JsonResource = "some stu3 json resource"; + private static String r4JsonResource = "some r4 json resource"; + private static String stu3XmlResource = "some stu3 xml resource"; + + private static final MediaType jsonIn = MediaType.APPLICATION_JSON; + private static final MediaType xmlIn = MediaType.APPLICATION_XML; + + + @BeforeEach + void setUp() { + converterService = new ConverterService(converter, transformer, fhirParser, fhirEncoder, resourceTypeFactory); + } + + @Test + void it_should_convert_stu3_json_resource() throws ParserConfigurationException, IOException, SAXException { + // Given + String expectedConvertedResource = "a converted resource"; + org.hl7.fhir.dstu3.model.MedicationRequest expStu3Resource = new MedicationRequest(); + org.hl7.fhir.r4.model.MedicationRequest expR4Converted = new org.hl7.fhir.r4.model.MedicationRequest(); + org.hl7.fhir.r4.model.MedicationRequest expR4Transformed = new org.hl7.fhir.r4.model.MedicationRequest(); + + Class inferredType = MedicationRequest.class; + + doReturn(inferredType) + .when(resourceTypeFactory) + .inferResourceType(eq(stu3JsonResource), eq(MediaType.APPLICATION_JSON), eq(FhirVersionEnum.DSTU3)); + + doReturn(expStu3Resource) + .when(fhirParser) + .parse(eq(stu3JsonResource), eq(inferredType), eq(MediaType.APPLICATION_JSON)); + + doReturn(expR4Converted) + .when(converter) + .convert(eq(expStu3Resource), eq(inferredType)); + + doReturn(expR4Transformed) + .when(transformer) + .transform(eq(expR4Converted)); + + when(fhirEncoder.encode(eq(expR4Transformed), eq(MediaType.APPLICATION_JSON), eq(FhirVersionEnum.R4))) + .thenReturn(expectedConvertedResource); + + // When + String actualConverted = converterService.convert(stu3JsonResource, jsonIn); + + // Then + assertThat(actualConverted).isEqualTo(expectedConvertedResource); + } + + /* + + @Test + void it_should_convert_r4_json_resource() { + // Given + org.hl7.fhir.dstu3.model.MedicationRequest expStu3Resource = new org.hl7.fhir.dstu3.model.MedicationRequest(); + when(r4JsonParser.parseResource(any(), eq(r4JsonResource))).thenReturn(expStu3Resource); + + // When + org.hl7.fhir.dstu3.model.MedicationRequest stu3Resource = converterService.convert(r4JsonResource, jsonIn); + + // Then + assertThat(stu3Resource).isEqualTo(expStu3Resource); + } + + @Test + void it_should_convert_stu3_xml_resource() { + // Given + MedicationRequest expR4Resource = new MedicationRequest(); + when(stu3XmlParser.parseResource(any(), eq(stu3XmlResource))).thenReturn(expR4Resource); + + // When + MedicationRequest r4Resource = converterService.convert(stu3XmlResource, xmlIn); + + // Then + assertThat(r4Resource).isEqualTo(expR4Resource); + } + + */ + static { + InputStream is = ConverterTest.class.getClassLoader().getResourceAsStream("GPConnect/MedicationRequest_GPConnect.json"); + try { + stu3JsonResource = new String(is.readAllBytes()); + } catch (IOException e) { + fail("Can't open test resource file"); + } + } +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java new file mode 100644 index 0000000..73906ea --- /dev/null +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java @@ -0,0 +1,36 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.parser.IParser; +import org.hl7.fhir.dstu3.model.MedicationRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; + + +@ExtendWith(MockitoExtension.class) +class FhirParserTest { + @Mock + private IParser stu3JsonParser; + @Mock + private IParser stu3XmlParser; + @Mock + private IParser r4JsonParser; + @Mock + private IParser r4XmlParser; + + private FhirParser fhirParser; + + @BeforeEach + void setUp() { + fhirParser = new FhirParser(stu3JsonParser, stu3XmlParser, r4JsonParser, r4XmlParser); + } + + @Test + void it_should_parse_stu3_json_resource() { + // When + MedicationRequest resource = fhirParser.parse("", MedicationRequest.class, MediaType.APPLICATION_JSON); + } +} diff --git a/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json b/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json new file mode 100644 index 0000000..ae3bb0d --- /dev/null +++ b/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json @@ -0,0 +1,91 @@ +{ + "resourceType": "MedicationRequest", + "id": "20", + "meta": { + "profile": [ + "https://fhir.nhs.uk/STU3/StructureDefinition/CareConnect-GPC-MedicationRequest-1" + ] + }, + "extension": [ + { + "url": "https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-MedicationRepeatInformation-1", + "extension": [ + { + "url": "numberOfRepeatPrescriptionsAllowed", + "valuePositiveInt": 12 + }, + { + "url": "numberOfRepeatPrescriptionsIssued", + "valuePositiveInt": 11 + } + ] + }, + { + "url": "https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-PrescriptionType-1", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://fhir.nhs.uk/STU3/CodeSystem/CareConnect-PrescriptionType-1", + "code": "repeat", + "display": "Repeat" + } + ] + } + } + ], + "requester": { + "onBehalfOf": { + "reference": "Patient/someone" + } + }, + "identifier": [ + { + "system": "https://fhir.nhs.uk/Id/cross-care-setting-identifier", + "value": "4534a031-e778-11eb-935a-00505692d4aa" + } + ], + "groupIdentifier": { + "value": "M-3" + }, + "status": "active", + "intent": "plan", + "medicationReference": { + "reference": "Medication/20" + }, + "subject": { + "reference": "Patient/2" + }, + "authoredOn": "2017-11-10T00:00:00+00:00", + "recorder": { + "reference": "Practitioner/1" + }, + "dosageInstruction": [ + { + "text": "1 tablet once a day", + "patientInstruction": "Take in morning" + } + ], + "dispenseRequest": { + "validityPeriod": { + "start": "2017-11-10T00:00:00+00:00", + "end": "2018-08-15T00:00:00+01:00" + }, + "quantity": { + "extension": [ + { + "url": "https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-MedicationQuantityText-1", + "valueString": "28" + } + ] + }, + "expectedSupplyDuration": { + "value": 28, + "unit": "day", + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "performer": { + "reference": "Organization/1" + } + } +} diff --git a/docker/Transformation-Engine/src/test/resources/STU3_MedRequest.json b/docker/Transformation-Engine/src/test/resources/STU3_MedRequest.json index b6d22c9..317df64 100644 --- a/docker/Transformation-Engine/src/test/resources/STU3_MedRequest.json +++ b/docker/Transformation-Engine/src/test/resources/STU3_MedRequest.json @@ -1 +1,61 @@ -{"resourceType":"MedicationRequest","id":"medrx002","text":{"status":"generated","div":"

Generated Narrative with Details

id: medrx002

identifier: 12345 (OFFICIAL)

status: active

intent: order

medication: prescribed medication

subject: Donald Duck

context: encounter that leads to this prescription

authoredOn: 01/03/2015

Requesters

-AgentOnBehalfOf
*Patrick PumpOrganization/f002

reasonCode: Essential hypertension (disorder) (Details : {SNOMED CT code '59621000' = 'Essential hypertension', given as 'Essential hypertension (disorder)'})

dosageInstruction:

"},"extension":[{"url":"http://hl7.org/fhir/3.0/StructureDefinition/extension-MedicationRequest.requester.onBehalfOf","valueReference":{"reference":"Organization/f002"}}],"identifier":[{"use":"official","system":"http://www.bmc.nl/portal/prescriptions","value":"12345"}],"status":"active","intent":"order","medicationReference":{"reference":"Medication/med0316","display":"prescribed medication"},"subject":{"reference":"Patient/pat1","display":"Donald Duck"},"context":{"reference":"Encounter/f001","display":"encounter that leads to this prescription"},"authoredOn":"2015-03-01","requester":{"agent":{"reference":"Practitioner/f007","display":"Patrick Pump"}},"reasonCode":[{"coding":[{"system":"http://snomed.info/sct","code":"59621000","display":"Essential hypertension (disorder)"}]}],"dosageInstruction":[{"sequence":1,"text":"Take one tablet daily as directed"}]} \ No newline at end of file +{ + "resourceType": "MedicationRequest", + "id": "medrx002", + "text": { + "status": "generated", + "div": "

Generated Narrative with Details

id: medrx002

identifier: 12345 (OFFICIAL)

status: active

intent: order

medication: prescribed medication

subject: Donald Duck

context: encounter that leads to this prescription

authoredOn: 01/03/2015

Requesters

-AgentOnBehalfOf
*Patrick PumpOrganization/f002

reasonCode: Essential hypertension (disorder) (Details : {SNOMED CT code '59621000' = 'Essential hypertension', given as 'Essential hypertension (disorder)'})

dosageInstruction:

" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/3.0/StructureDefinition/extension-MedicationRequest.requester.onBehalfOf", + "valueReference": { + "reference": "Organization/f002" + } + } + ], + "identifier": [ + { + "use": "official", + "system": "http://www.bmc.nl/portal/prescriptions", + "value": "12345" + } + ], + "status": "active", + "intent": "order", + "medicationReference": { + "reference": "Medication/med0316", + "display": "prescribed medication" + }, + "subject": { + "reference": "Patient/pat1", + "display": "Donald Duck" + }, + "context": { + "reference": "Encounter/f001", + "display": "encounter that leads to this prescription" + }, + "authoredOn": "2015-03-01", + "requester": { + "agent": { + "reference": "Practitioner/f007", + "display": "Patrick Pump" + } + }, + "reasonCode": [ + { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "59621000", + "display": "Essential hypertension (disorder)" + } + ] + } + ], + "dosageInstruction": [ + { + "sequence": 1, + "text": "Take one tablet daily as directed" + } + ] +} From f8802729aac2851772334f4c2456dca275873f1d Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Mon, 20 Dec 2021 13:16:49 +0000 Subject: [PATCH 03/12] AMB-962 hook up converter --- .../nhsd/fhir/converter/service/mapping/Converter.java | 7 +++---- .../converter/service/mapping/ConverterServiceTest.java | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java index 125fa15..b600901 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java @@ -60,7 +60,7 @@ public IParser r4JsonParser(FhirContext r4FhirContext) { @Component class ResourceTypeFactory { - public Class inferResourceType(String fhirResource, MediaType mediaType, FhirVersionEnum fhirVersion) throws ParserConfigurationException, IOException, SAXException { + public Class createResourceType(String fhirResource, MediaType mediaType, FhirVersionEnum fhirVersion) throws ParserConfigurationException, IOException, SAXException { String resourceType = getResourceType(fhirResource, mediaType); switch (resourceType) { case "MedicationRequest": @@ -88,12 +88,11 @@ private String getResourceType(final String fhirSchema, MediaType mediaType) thr return json.getString("resourceType"); } } - } @Component class Transformer { - T transform(T resource) { + T transform(IBaseResource resource) { return null; } } @@ -180,7 +179,7 @@ public ConverterService(Converter converter, Transformer transformer, FhirParser } public String convert(String resource, MediaType mediaType) throws ParserConfigurationException, IOException, SAXException { - Class resourceType = resourceTypeFactory.inferResourceType(resource, mediaType, FhirVersionEnum.DSTU3); + Class resourceType = resourceTypeFactory.createResourceType(resource, mediaType, FhirVersionEnum.DSTU3); IBaseResource fhirResource = fhirParser.parse(resource, resourceType, mediaType); IBaseResource converted = converter.convert(fhirResource, resourceType); diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java index 35a32f9..d6a7a65 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java @@ -63,7 +63,7 @@ void it_should_convert_stu3_json_resource() throws ParserConfigurationException, doReturn(inferredType) .when(resourceTypeFactory) - .inferResourceType(eq(stu3JsonResource), eq(MediaType.APPLICATION_JSON), eq(FhirVersionEnum.DSTU3)); + .createResourceType(eq(stu3JsonResource), eq(MediaType.APPLICATION_JSON), eq(FhirVersionEnum.DSTU3)); doReturn(expStu3Resource) .when(fhirParser) From e6c6768802f9d5792fd3e9c25edee0c91fc99312 Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Mon, 20 Dec 2021 16:46:26 +0000 Subject: [PATCH 04/12] AMB-962 extract FhirParser to it's own class and add decode funcionality to it as well --- .../converter/service/mapping/FhirParser.java | 59 +++++++++ .../service/mapping/FhirParserTest.java | 123 +++++++++++++++++- 2 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java new file mode 100644 index 0000000..5c4b032 --- /dev/null +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java @@ -0,0 +1,59 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.parser.IParser; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +@Component +public class FhirParser { + private final IParser stu3JsonParser; + private final IParser r4JsonParser; + private final IParser stu3XmlParser; + private final IParser r4XmlParser; + + public FhirParser(IParser stu3JsonParser, IParser r4JsonParser, IParser stu3XmlParser, IParser r4XmlParser) { + this.stu3JsonParser = stu3JsonParser; + this.r4JsonParser = r4JsonParser; + this.stu3XmlParser = stu3XmlParser; + this.r4XmlParser = r4XmlParser; + } + + public T parse(String resource, Class resourceType, MediaType mediaType) { + boolean isR4 = resourceType.getName().contains("r4"); + + if (MediaType.APPLICATION_JSON == mediaType) { + if (isR4) { + return r4JsonParser.parseResource(resourceType, resource); + } else { + return stu3JsonParser.parseResource(resourceType, resource); + } + } else if (MediaType.APPLICATION_XML == mediaType) { + if (isR4) { + return r4XmlParser.parseResource(resourceType, resource); + } else { + return stu3XmlParser.parseResource(resourceType, resource); + } + } + throw new IllegalStateException("Invalid Content-Type"); + } + + public String encode(T resource, Class resourceType, MediaType mediaType) { + boolean isR4 = resourceType.getName().contains("r4"); + + if (MediaType.APPLICATION_JSON == mediaType) { + if (isR4) { + return r4JsonParser.encodeResourceToString(resource); + } else { + return stu3JsonParser.encodeResourceToString(resource); + } + } else if (MediaType.APPLICATION_XML == mediaType) { + if (isR4) { + return r4XmlParser.encodeResourceToString(resource); + } else { + return stu3XmlParser.encodeResourceToString(resource); + } + } + throw new IllegalStateException("Invalid Accept header"); + } +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java index 73906ea..fe8d843 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java @@ -1,7 +1,6 @@ package nhsd.fhir.converter.service.mapping; import ca.uhn.fhir.parser.IParser; -import org.hl7.fhir.dstu3.model.MedicationRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -9,6 +8,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.MediaType; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + @ExtendWith(MockitoExtension.class) class FhirParserTest { @@ -23,14 +25,129 @@ class FhirParserTest { private FhirParser fhirParser; + private static final MediaType JSON = MediaType.APPLICATION_JSON; + private static final MediaType XML = MediaType.APPLICATION_XML; + + private static final String STU3_JSON_RES = "a stu3 json resource"; + private static final String STU3_XML_RES = "a stu3 xml resource"; + private static final String R4_JSON_RES = "a r4 json resource"; + private static final String R4_XML_RES = "a r4 xml resource"; + + private static final org.hl7.fhir.dstu3.model.MedicationRequest STU3_RES = new org.hl7.fhir.dstu3.model.MedicationRequest(); + private static final org.hl7.fhir.r4.model.MedicationRequest R4_RES = new org.hl7.fhir.r4.model.MedicationRequest(); + private static final Class STU3_CLASS = org.hl7.fhir.dstu3.model.MedicationRequest.class; + private static final Class R4_CLASS = org.hl7.fhir.r4.model.MedicationRequest.class; + @BeforeEach void setUp() { - fhirParser = new FhirParser(stu3JsonParser, stu3XmlParser, r4JsonParser, r4XmlParser); + fhirParser = new FhirParser(stu3JsonParser, r4JsonParser, stu3XmlParser, r4XmlParser); } @Test void it_should_parse_stu3_json_resource() { + // Given + when(stu3JsonParser.parseResource(STU3_CLASS, STU3_JSON_RES)) + .thenReturn(STU3_RES); + + // When + org.hl7.fhir.dstu3.model.MedicationRequest resource = + fhirParser.parse(STU3_JSON_RES, STU3_CLASS, JSON); + + // Then + assertThat(resource).isEqualTo(STU3_RES); + } + + @Test + void it_should_encode_stu3_json_resource() { + // Given + when(stu3JsonParser.encodeResourceToString(STU3_RES)) + .thenReturn(STU3_JSON_RES); + + // When + String resource = fhirParser.encode(STU3_RES, STU3_CLASS, JSON); + + // Then + assertThat(resource).isEqualTo(STU3_JSON_RES); + } + + @Test + void it_should_parse_stu3_xml_resource() { + // Given + when(stu3XmlParser.parseResource(STU3_CLASS, STU3_XML_RES)) + .thenReturn(STU3_RES); + + // When + org.hl7.fhir.dstu3.model.MedicationRequest resource = + fhirParser.parse(STU3_XML_RES, STU3_CLASS, XML); + + // Then + assertThat(resource).isEqualTo(STU3_RES); + } + + @Test + void it_should_encode_stu3_xml_resource() { + // Given + when(stu3XmlParser.encodeResourceToString(STU3_RES)) + .thenReturn(STU3_XML_RES); + + // When + String resource = fhirParser.encode(STU3_RES, STU3_CLASS, XML); + + // Then + assertThat(resource).isEqualTo(STU3_XML_RES); + } + + @Test + void it_should_parse_r4_json_resource() { + // Given + when(r4JsonParser.parseResource(R4_CLASS, R4_JSON_RES)) + .thenReturn(R4_RES); + + // When + org.hl7.fhir.r4.model.MedicationRequest resource = + fhirParser.parse(R4_JSON_RES, R4_CLASS, JSON); + + // Then + assertThat(resource).isEqualTo(R4_RES); + } + + @Test + void it_should_encode_r4_json_resource() { + // Given + when(r4JsonParser.encodeResourceToString(R4_RES)) + .thenReturn(R4_JSON_RES); + + // When + String resource = fhirParser.encode(R4_RES, R4_CLASS, JSON); + + // Then + assertThat(resource).isEqualTo(R4_JSON_RES); + } + + @Test + void it_should_parse_r4_xml_resource() { + // Given + when(r4XmlParser.parseResource(R4_CLASS, R4_XML_RES)) + .thenReturn(R4_RES); + + // When + org.hl7.fhir.r4.model.MedicationRequest resource = + fhirParser.parse(R4_XML_RES, R4_CLASS, XML); + + // Then + assertThat(resource).isEqualTo(R4_RES); + } + + @Test + void it_should_encode_r4_xml_resource() { + // Given + when(r4XmlParser.encodeResourceToString(R4_RES)) + .thenReturn(R4_XML_RES); + // When - MedicationRequest resource = fhirParser.parse("", MedicationRequest.class, MediaType.APPLICATION_JSON); + String resource = fhirParser.encode(R4_RES, R4_CLASS, XML); + + // Then + assertThat(resource).isEqualTo(R4_XML_RES); } } From 2fb49812a826120f083aec4b59b30505d52538f9 Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Mon, 20 Dec 2021 16:47:03 +0000 Subject: [PATCH 05/12] AMB-962 extract FhirConfig out --- .../converter/service/mapping/FhirConfig.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirConfig.java diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirConfig.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirConfig.java new file mode 100644 index 0000000..86d3a00 --- /dev/null +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirConfig.java @@ -0,0 +1,46 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.parser.IParser; +import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40; +import org.hl7.fhir.convertors.conv30_40.VersionConvertor_30_40; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FhirConfig { + @Bean + public FhirContext stu3FhirContext() { + return FhirContext.forDstu3(); + } + + @Bean + public FhirContext r4FhirContext() { + return FhirContext.forR4(); + } + + @Bean + public IParser stu3XmlParser(FhirContext stu3FhirContext) { + return stu3FhirContext.newXmlParser(); + } + + @Bean + public IParser stu3JsonParser(FhirContext stu3FhirContext) { + return stu3FhirContext.newJsonParser(); + } + + @Bean + public IParser r4XmlParser(FhirContext r4FhirContext) { + return r4FhirContext.newXmlParser(); + } + + @Bean + public IParser r4JsonParser(FhirContext r4FhirContext) { + return r4FhirContext.newJsonParser(); + } + + @Bean + public VersionConvertor_30_40 Converter30To40() { + return new VersionConvertor_30_40(new BaseAdvisor_30_40()); + } +} From e22f94ddbcac398fd1c7b89097db7a87c51e3db1 Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Mon, 20 Dec 2021 17:10:54 +0000 Subject: [PATCH 06/12] AMB-962 extract ResourceTypeFactory out --- .../service/mapping/ResourceTypeFactory.java | 50 ++++++++++ .../mapping/ResourceTypeFactoryTest.java | 91 +++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactory.java create mode 100644 docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactoryTest.java diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactory.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactory.java new file mode 100644 index 0000000..064a9b6 --- /dev/null +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactory.java @@ -0,0 +1,50 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.context.FhirVersionEnum; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.MedicationRequest; +import org.hl7.fhir.r4.model.MedicationStatement; +import org.json.JSONObject; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.StringReader; + +@Component +public class ResourceTypeFactory { + public static Class createResourceType(String fhirResource, MediaType mediaType, FhirVersionEnum fhirVersion) throws ParserConfigurationException, IOException, SAXException { + String resourceType = getResourceType(fhirResource, mediaType); + switch (resourceType) { + case "MedicationRequest": + return FhirVersionEnum.R4 == fhirVersion ? + MedicationRequest.class + : org.hl7.fhir.dstu3.model.MedicationRequest.class; + case "MedicationStatement": + return FhirVersionEnum.R4 == fhirVersion ? + MedicationStatement.class + : org.hl7.fhir.dstu3.model.MedicationStatement.class; + } + throw new IllegalStateException("Resource not supported"); + } + + private static String getResourceType(final String fhirSchema, MediaType mediaType) throws ParserConfigurationException, IOException, SAXException { + if ("xml".equals(mediaType.getSubtype())) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(new InputSource(new StringReader(fhirSchema))); + + return doc.getFirstChild().getNodeName(); + } else { + JSONObject json = new JSONObject(fhirSchema); + + return json.getString("resourceType"); + } + } +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactoryTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactoryTest.java new file mode 100644 index 0000000..84d0917 --- /dev/null +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ResourceTypeFactoryTest.java @@ -0,0 +1,91 @@ +package nhsd.fhir.converter.service.mapping; + +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; + +import static ca.uhn.fhir.context.FhirVersionEnum.DSTU3; +import static ca.uhn.fhir.context.FhirVersionEnum.R4; +import static org.assertj.core.api.Assertions.assertThat; + +class ResourceTypeFactoryTest { + private static final String MEDICATION_REQUEST_JSON = "{\"resourceType\": \"MedicationRequest\"}"; + private static final String MEDICATION_REQUEST_XML = ""; + + private static final String MEDICATION_STATEMENT_JSON = "{\"resourceType\": \"MedicationStatement\"}"; + private static final String MEDICATION_STATEMENT_XML = ""; + + private static final MediaType JSON = MediaType.APPLICATION_JSON; + private static final MediaType XML = MediaType.APPLICATION_XML; + + @Test + void it_should_return_stu_medication_request_given_json_input() throws ParserConfigurationException, IOException, SAXException { + // Given + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_REQUEST_JSON, JSON, DSTU3); + + assertThat(resource).isEqualTo(org.hl7.fhir.dstu3.model.MedicationRequest.class); + } + + @Test + void it_should_return_stu3_medication_request_given_xml_input() throws ParserConfigurationException, IOException, SAXException { + // When + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_REQUEST_XML, XML, DSTU3); + + // Then + assertThat(resource).isEqualTo(org.hl7.fhir.dstu3.model.MedicationRequest.class); + } + + @Test + void it_should_return_r4_medication_request_given_json_input() throws ParserConfigurationException, IOException, SAXException { + // Given + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_REQUEST_JSON, JSON, R4); + + assertThat(resource).isEqualTo(org.hl7.fhir.r4.model.MedicationRequest.class); + } + + @Test + void it_should_return_r4_medication_request_given_xml_input() throws ParserConfigurationException, IOException, SAXException { + // When + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_REQUEST_XML, XML, R4); + + // Then + assertThat(resource).isEqualTo(org.hl7.fhir.r4.model.MedicationRequest.class); + } + + @Test + void it_should_return_stu_medication_statement_given_json_input() throws ParserConfigurationException, IOException, SAXException { + // Given + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_STATEMENT_JSON, JSON, DSTU3); + + assertThat(resource).isEqualTo(org.hl7.fhir.dstu3.model.MedicationStatement.class); + } + + @Test + void it_should_return_stu3_medication_statement_given_xml_input() throws ParserConfigurationException, IOException, SAXException { + // When + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_STATEMENT_XML, XML, DSTU3); + + // Then + assertThat(resource).isEqualTo(org.hl7.fhir.dstu3.model.MedicationStatement.class); + } + + @Test + void it_should_return_r4_medication_statement_given_json_input() throws ParserConfigurationException, IOException, SAXException { + // Given + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_STATEMENT_JSON, JSON, R4); + + assertThat(resource).isEqualTo(org.hl7.fhir.r4.model.MedicationStatement.class); + } + + @Test + void it_should_return_r4_medication_statement_given_xml_input() throws ParserConfigurationException, IOException, SAXException { + // When + Class resource = ResourceTypeFactory.createResourceType(MEDICATION_STATEMENT_XML, XML, R4); + + // Then + assertThat(resource).isEqualTo(org.hl7.fhir.r4.model.MedicationStatement.class); + } +} From 2041271467b2cbc58a11bfd57cd933e6ff40a60f Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Mon, 20 Dec 2021 17:48:23 +0000 Subject: [PATCH 07/12] AMB-962 wire parser->converter->transformer->parser --- .../converter/service/mapping/Converter.java | 184 +----------------- .../service/mapping/ConverterService.java | 37 ++++ .../converter/service/mapping/FhirParser.java | 5 +- .../service/mapping/Transformer.java | 44 +++++ .../fml/MedicationRequest/STU3_to_R4.fml | 13 ++ .../fml/MedicationRequest/extension.fml | 25 +++ .../mapping/ConverterComponentTest.java | 3 +- .../service/mapping/ConverterServiceTest.java | 72 ++++--- .../service/mapping/ConverterTest.java | 59 ++++++ .../service/mapping/FhirParserTest.java | 38 ++-- .../FML/MedicationRequest_STU3_R4.fml | 13 ++ .../src/test/resources/FML/extension.fml | 25 +++ .../test/resources/R3_MedicationRequest.xml | 96 ++++++++- 13 files changed, 377 insertions(+), 237 deletions(-) create mode 100644 docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java create mode 100644 docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java create mode 100644 docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml create mode 100644 docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/extension.fml create mode 100644 docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterTest.java create mode 100644 docker/Transformation-Engine/src/test/resources/FML/MedicationRequest_STU3_R4.fml create mode 100644 docker/Transformation-Engine/src/test/resources/FML/extension.fml diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java index b600901..8d5d55a 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Converter.java @@ -1,192 +1,24 @@ package nhsd.fhir.converter.service.mapping; -import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; -import ca.uhn.fhir.parser.IParser; -import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40; import org.hl7.fhir.convertors.conv30_40.VersionConvertor_30_40; import org.hl7.fhir.dstu3.model.Resource; import org.hl7.fhir.instance.model.api.IBaseResource; -import org.hl7.fhir.r4.model.MedicationRequest; -import org.hl7.fhir.r4.model.MedicationStatement; -import org.json.JSONObject; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.MediaType; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.io.StringReader; - -@Configuration -class ConverterConfiguration { - @Bean - public FhirContext stu3FhirContext() { - return FhirContext.forDstu3(); - } - - @Bean - public FhirContext r4FhirContext() { - return FhirContext.forR4(); - } - - @Bean - public IParser stu3XmlParser(FhirContext stu3FhirContext) { - return stu3FhirContext.newXmlParser(); - } - - @Bean - public IParser stu3JsonParser(FhirContext stu3FhirContext) { - return stu3FhirContext.newJsonParser(); - } - - @Bean - public IParser r4XmlParser(FhirContext r4FhirContext) { - return r4FhirContext.newXmlParser(); - } - - @Bean - public IParser r4JsonParser(FhirContext r4FhirContext) { - return r4FhirContext.newJsonParser(); - } -} - -@Component -class ResourceTypeFactory { - public Class createResourceType(String fhirResource, MediaType mediaType, FhirVersionEnum fhirVersion) throws ParserConfigurationException, IOException, SAXException { - String resourceType = getResourceType(fhirResource, mediaType); - switch (resourceType) { - case "MedicationRequest": - return FhirVersionEnum.R4.equals(fhirVersion) ? - MedicationRequest.class - : org.hl7.fhir.dstu3.model.MedicationRequest.class; - case "MedicationStatement": - return FhirVersionEnum.R4.equals(fhirVersion) ? - MedicationStatement.class - : org.hl7.fhir.dstu3.model.MedicationStatement.class; - } - throw new IllegalStateException("Resource not supported"); - } - - private String getResourceType(final String fhirSchema, MediaType mediaType) throws ParserConfigurationException, IOException, SAXException { - if ("xml".equals(mediaType.getSubtype())) { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.parse(new InputSource(new StringReader(fhirSchema))); - - return doc.getFirstChild().getNodeName(); - } else { - JSONObject json = new JSONObject(fhirSchema); - - return json.getString("resourceType"); - } - } -} - -@Component -class Transformer { - T transform(IBaseResource resource) { - return null; - } -} @Component public class Converter { - private static final VersionConvertor_30_40 CONVERTER = new VersionConvertor_30_40(new BaseAdvisor_30_40()); + private final VersionConvertor_30_40 converter; - public IBaseResource convert(IBaseResource resource, Class resourceType) { - boolean isR4 = "r4".contains(resourceType.getName()); - - if (isR4) { - return CONVERTER.convertResource((org.hl7.fhir.r4.model.Resource) resource); - } else { - return CONVERTER.convertResource((Resource) resource); - } - } -} - -@Component -class FhirParser { - private final IParser stu3JsonParser; - private final IParser r4JsonParser; - private final IParser stu3XmlParser; - private final IParser r4XmlParser; - - public FhirParser(IParser stu3JsonParser, IParser r4JsonParser, IParser stu3XmlParser, IParser r4XmlParser) { - this.stu3JsonParser = stu3JsonParser; - this.r4JsonParser = r4JsonParser; - this.stu3XmlParser = stu3XmlParser; - this.r4XmlParser = r4XmlParser; - } - - public T parse(String resource, Class resourceType, MediaType mediaType) { - boolean isR4 = resourceType.getName().contains("r4"); - - if (MediaType.APPLICATION_JSON == mediaType) { - if (isR4) { - return r4JsonParser.parseResource(resourceType, resource); - } else { - return stu3JsonParser.parseResource(resourceType, resource); - } - } -// } else if (MediaType.APPLICATION_XML == mediaType) { -// return stu3XmlParser.parseResource(MedicationRequest.class, resource); -// } - throw new IllegalStateException("Invalid Content-Type"); - } -} - -@Component -class FhirEncoder { - private final IParser stu3JsonParser; - private final IParser r4JsonParser; - private final IParser stu3XmlParser; - private final IParser r4XmlParser; - - public FhirEncoder(IParser stu3JsonParser, IParser r4JsonParser, IParser stu3XmlParser, IParser r4XmlParser) { - this.stu3JsonParser = stu3JsonParser; - this.r4JsonParser = r4JsonParser; - this.stu3XmlParser = stu3XmlParser; - this.r4XmlParser = r4XmlParser; - } - - public String encode(T resource, MediaType outMime, FhirVersionEnum outVersion) { - return ""; - } -} - -@Service -class ConverterService { - private final Converter converter; - private final Transformer transformer; - private final FhirParser fhirParser; - private final FhirEncoder fhirEncoder; - private final ResourceTypeFactory resourceTypeFactory; - - public ConverterService(Converter converter, Transformer transformer, FhirParser fhirParser, FhirEncoder fhirEncoder, ResourceTypeFactory resourceTypeFactory) { + public Converter(VersionConvertor_30_40 converter) { this.converter = converter; - this.transformer = transformer; - this.fhirParser = fhirParser; - this.fhirEncoder = fhirEncoder; - this.resourceTypeFactory = resourceTypeFactory; } - public String convert(String resource, MediaType mediaType) throws ParserConfigurationException, IOException, SAXException { - Class resourceType = resourceTypeFactory.createResourceType(resource, mediaType, FhirVersionEnum.DSTU3); - - IBaseResource fhirResource = fhirParser.parse(resource, resourceType, mediaType); - IBaseResource converted = converter.convert(fhirResource, resourceType); - IBaseResource transformed = transformer.transform(converted); - - String convertedStr = fhirEncoder.encode(transformed, MediaType.APPLICATION_JSON, FhirVersionEnum.R4); - - return convertedStr; + public IBaseResource convert(IBaseResource resource, FhirVersionEnum version) { + if (FhirVersionEnum.R4 == version) { + return converter.convertResource((org.hl7.fhir.r4.model.Resource) resource); + } else { + return converter.convertResource((Resource) resource); + } } } diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java new file mode 100644 index 0000000..3948990 --- /dev/null +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java @@ -0,0 +1,37 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.context.FhirVersionEnum; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; + +@Service +public class ConverterService { + + private final Converter converter; + private final Transformer transformer; + private final FhirParser fhirParser; + + public ConverterService(Converter converter, Transformer transformer, FhirParser fhirParser) { + this.converter = converter; + this.transformer = transformer; + this.fhirParser = fhirParser; + } + + public String convert(String resource, MediaType mediaType, FhirVersionEnum fhirVersion) throws ParserConfigurationException, IOException, SAXException { + Class resourceType = ResourceTypeFactory.createResourceType(resource, mediaType, fhirVersion); + + IBaseResource fhirResource = fhirParser.parse(resource, resourceType, mediaType); + IBaseResource converted = converter.convert(fhirResource, fhirVersion); + IBaseResource transformed = transformer.transform(converted); + + FhirVersionEnum outVersion = fhirVersion == FhirVersionEnum.R4 ? FhirVersionEnum.DSTU3 : FhirVersionEnum.R4; + String convertedStr = fhirParser.encode(transformed, outVersion, mediaType); + + return convertedStr; + } +} diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java index 5c4b032..5b2a975 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java @@ -1,5 +1,6 @@ package nhsd.fhir.converter.service.mapping; +import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.parser.IParser; import org.hl7.fhir.instance.model.api.IBaseResource; import org.springframework.http.MediaType; @@ -38,8 +39,8 @@ public T parse(String resource, Class resourceType, throw new IllegalStateException("Invalid Content-Type"); } - public String encode(T resource, Class resourceType, MediaType mediaType) { - boolean isR4 = resourceType.getName().contains("r4"); + public String encode(IBaseResource resource, FhirVersionEnum fhirVersion, MediaType mediaType) { + boolean isR4 = FhirVersionEnum.R4 == fhirVersion; if (MediaType.APPLICATION_JSON == mediaType) { if (isR4) { diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java new file mode 100644 index 0000000..8007111 --- /dev/null +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java @@ -0,0 +1,44 @@ +package nhsd.fhir.converter.service.mapping; + +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.context.IWorkerContext; +import org.hl7.fhir.r4.context.SimpleWorkerContext; +import org.hl7.fhir.r4.model.StructureMap; +import org.hl7.fhir.r4.utils.StructureMapUtilities; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.io.InputStream; + +@Component +public class Transformer { + static private String medicationRequestStu3ToR4Fml; + private final StructureMap structureMap; + private final StructureMapUtilities structureMapUtilities; + + public Transformer() throws IOException { + IWorkerContext worker = new SimpleWorkerContext(); + structureMapUtilities = new StructureMapUtilities(worker); + structureMap = structureMapUtilities.parse(medicationRequestStu3ToR4Fml, "src"); + } + + IBaseResource transform(IBaseResource resource) { + org.hl7.fhir.r4.model.Resource source = (org.hl7.fhir.r4.model.Resource) resource; + org.hl7.fhir.r4.model.Resource target = source.copy(); + +// structureMapUtilities.transform("source", source, structureMap, target); + + return target; + } + + static { +// InputStream is = Transformer.class.getClassLoader().getResourceAsStream("fml/MedicationRequest/STU3_to_R4.fml"); + InputStream is = Transformer.class.getClassLoader().getResourceAsStream("fml/MedicationRequest/extension.fml"); + try { + medicationRequestStu3ToR4Fml = new String(is.readAllBytes()); + } catch (IOException e) { + System.err.println("Can't load fml mapping file"); + } + + } +} diff --git a/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml b/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml new file mode 100644 index 0000000..65d639e --- /dev/null +++ b/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml @@ -0,0 +1,13 @@ +map "http://hl7.org/fhir/StructureMap/DomainResource3to4" = "R3 to R4 Conversions for DomainResource" + +uses "http://hl7.org/fhir/3.0/StructureDefinition/DomainResource" alias DomainResourceR3 as source +uses "http://hl7.org/fhir/StructureDefinition/DomainResource" alias DomainResource as target + +//imports "http://hl7.org/fhir/StructureMap/*3to4" + +group DomainResource(source src : DomainResourceR3, target tgt : DomainResource) extends Resource <> { + src.text -> tgt.text; + src.contained -> tgt.contained; + src.extension -> tgt.extension; + src.modifierExtension -> tgt.modifierExtension; +} diff --git a/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/extension.fml b/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/extension.fml new file mode 100644 index 0000000..d969303 --- /dev/null +++ b/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/extension.fml @@ -0,0 +1,25 @@ +map "http://basic.test/medication-request" = "basic-test-medication-request" +uses "http://hl7.org/fhir/StructureDefinition/MedicationRequest" alias MedicationRequest as source +uses "http://hl7.org/fhir/StructureDefinition/MedicationRequest" alias MedicationRequest as target +uses "http://hl7.org/fhir/StructureDefinition/CodeableConcept" alias CodeableConcept as source +uses "http://hl7.org/fhir/StructureDefinition/CodeableConcept" alias CodeableConcept as target +uses "http://hl7.org/fhir/StructureDefinition/Coding" alias Coding as source +uses "http://hl7.org/fhir/StructureDefinition/Coding" alias Coding as target +group MedicationRequest(source src : MedicationRequest, target tgt : MedicationRequest) { + src.extension as ext where $this.url='https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-PrescriptionType-1' + -> tgt.extension as tgtext, tgtext.url='UPDATED DEFINITION HERE' then { + ext.value : CodeableConcept as vs -> tgtext.value = create('CodeableConcept') as vt then CodeableConceptPrescriptionType(vs, vt); + }; + } +group CodeableConceptPrescriptionType(source src : CodeableConcept, target tgt : CodeableConcept) { + // src.coding -> tgt.coding; the short form is only woking when you have a <> + src.coding -> tgt.coding; + src.text as text -> tgt.text = text; +} +group Coding(source src : Coding, target tgt : Coding) <> { + src.system as system where $this='https://fhir.nhs.uk/STU3/CodeSystem/CareConnect-PrescriptionType-1' -> tgt.system = 'UPDATED CODESYSTEM HERE'; + src.version as version -> tgt.version = version; + src.code as code -> tgt.code = code; + src.display as display -> tgt.display = display; + src.userSelected as userSelected -> tgt.userSelected = userSelected; +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java index 9b39f7c..0fc9516 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterComponentTest.java @@ -1,5 +1,6 @@ package nhsd.fhir.converter.service.mapping; +import ca.uhn.fhir.context.FhirVersionEnum; import nhsd.fhir.converter.service.ConverterTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +24,7 @@ public class ConverterComponentTest { @Test void it_should_convert_json_stu3_medication_request_to_r4() throws ParserConfigurationException, IOException, SAXException { // When - String m = converterService.convert(stu3JsonMedicationRequest, MediaType.APPLICATION_JSON); + String m = converterService.convert(stu3JsonMedicationRequest, MediaType.APPLICATION_JSON, FhirVersionEnum.DSTU3); System.out.println(m); diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java index d6a7a65..ee0e671 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java @@ -1,9 +1,5 @@ package nhsd.fhir.converter.service.mapping; -import ca.uhn.fhir.context.FhirVersionEnum; -import nhsd.fhir.converter.service.ConverterTest; -import org.hl7.fhir.dstu3.model.MedicationRequest; -import org.hl7.fhir.instance.model.api.IBaseResource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -14,13 +10,11 @@ import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; -import java.io.InputStream; +import static ca.uhn.fhir.context.FhirVersionEnum.DSTU3; +import static ca.uhn.fhir.context.FhirVersionEnum.R4; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -33,58 +27,56 @@ class ConverterServiceTest { private Transformer transformer; @Mock private FhirParser fhirParser; - @Mock - private FhirEncoder fhirEncoder; - @Mock - private ResourceTypeFactory resourceTypeFactory; - private static String stu3JsonResource = "some stu3 json resource"; - private static String r4JsonResource = "some r4 json resource"; - private static String stu3XmlResource = "some stu3 xml resource"; + private static final String STU3_JSON_RES = "{\"resourceType\": \"MedicationRequest\"}"; + private static final String STU3_XML_RES = ""; + private static final String R4_JSON_RES = "{\"resourceType\": \"MedicationRequest\"}"; + private static final String R4_XML_RES = ""; + + private static final MediaType JSON = MediaType.APPLICATION_JSON; + private static final MediaType XML = MediaType.APPLICATION_XML; + + private static final org.hl7.fhir.dstu3.model.MedicationRequest A_STU3_RES = new org.hl7.fhir.dstu3.model.MedicationRequest(); + private static final org.hl7.fhir.r4.model.MedicationRequest A_R4_RES = new org.hl7.fhir.r4.model.MedicationRequest(); + + private static final org.hl7.fhir.dstu3.model.MedicationRequest A_TRANSFORMED_STU3_RES = new org.hl7.fhir.dstu3.model.MedicationRequest(); + private static final org.hl7.fhir.r4.model.MedicationRequest A_TRANSFORMED_R4_RES = new org.hl7.fhir.r4.model.MedicationRequest(); - private static final MediaType jsonIn = MediaType.APPLICATION_JSON; - private static final MediaType xmlIn = MediaType.APPLICATION_XML; + private static final org.hl7.fhir.dstu3.model.MedicationRequest A_CONVERTED_STU3_RES = new org.hl7.fhir.dstu3.model.MedicationRequest(); + private static final org.hl7.fhir.r4.model.MedicationRequest A_CONVERTED_R4_RES = new org.hl7.fhir.r4.model.MedicationRequest(); + private static final Class STU3_CLASS = org.hl7.fhir.dstu3.model.MedicationRequest.class; + private static final Class R4_CLASS = org.hl7.fhir.r4.model.MedicationRequest.class; @BeforeEach void setUp() { - converterService = new ConverterService(converter, transformer, fhirParser, fhirEncoder, resourceTypeFactory); + converterService = new ConverterService(converter, transformer, fhirParser); } @Test void it_should_convert_stu3_json_resource() throws ParserConfigurationException, IOException, SAXException { // Given - String expectedConvertedResource = "a converted resource"; - org.hl7.fhir.dstu3.model.MedicationRequest expStu3Resource = new MedicationRequest(); - org.hl7.fhir.r4.model.MedicationRequest expR4Converted = new org.hl7.fhir.r4.model.MedicationRequest(); - org.hl7.fhir.r4.model.MedicationRequest expR4Transformed = new org.hl7.fhir.r4.model.MedicationRequest(); - - Class inferredType = MedicationRequest.class; - - doReturn(inferredType) - .when(resourceTypeFactory) - .createResourceType(eq(stu3JsonResource), eq(MediaType.APPLICATION_JSON), eq(FhirVersionEnum.DSTU3)); - - doReturn(expStu3Resource) + doReturn(A_STU3_RES) .when(fhirParser) - .parse(eq(stu3JsonResource), eq(inferredType), eq(MediaType.APPLICATION_JSON)); + .parse(STU3_JSON_RES, STU3_CLASS, JSON); - doReturn(expR4Converted) + doReturn(A_CONVERTED_R4_RES) .when(converter) - .convert(eq(expStu3Resource), eq(inferredType)); + .convert(A_STU3_RES, DSTU3); - doReturn(expR4Transformed) + doReturn(A_TRANSFORMED_R4_RES) .when(transformer) - .transform(eq(expR4Converted)); + .transform(A_CONVERTED_R4_RES); - when(fhirEncoder.encode(eq(expR4Transformed), eq(MediaType.APPLICATION_JSON), eq(FhirVersionEnum.R4))) - .thenReturn(expectedConvertedResource); + doReturn(R4_JSON_RES) + .when(fhirParser) + .encode(A_TRANSFORMED_R4_RES, R4, JSON); // When - String actualConverted = converterService.convert(stu3JsonResource, jsonIn); + String actualConverted = converterService.convert(STU3_JSON_RES, JSON, DSTU3); // Then - assertThat(actualConverted).isEqualTo(expectedConvertedResource); + assertThat(actualConverted).isEqualTo(R4_JSON_RES); } /* @@ -116,6 +108,7 @@ void it_should_convert_stu3_xml_resource() { } */ +/* static { InputStream is = ConverterTest.class.getClassLoader().getResourceAsStream("GPConnect/MedicationRequest_GPConnect.json"); try { @@ -124,4 +117,5 @@ void it_should_convert_stu3_xml_resource() { fail("Can't open test resource file"); } } +*/ } diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterTest.java new file mode 100644 index 0000000..1083023 --- /dev/null +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterTest.java @@ -0,0 +1,59 @@ +package nhsd.fhir.converter.service.mapping; + +import ca.uhn.fhir.context.FhirVersionEnum; +import org.hl7.fhir.convertors.conv30_40.VersionConvertor_30_40; +import org.hl7.fhir.dstu3.model.MedicationRequest; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.model.Resource; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + + +@RunWith(MockitoJUnitRunner.class) +public class ConverterTest { + @Mock + private VersionConvertor_30_40 fhirConverter; + + private Converter converter; + + private static final IBaseResource STU3_RESOURCE = new MedicationRequest(); + private static final IBaseResource R4_RESOURCE = new org.hl7.fhir.r4.model.MedicationRequest(); + + @Before + public void setUp() throws Exception { + converter = new Converter(fhirConverter); + } + + @Test + public void it_should_convert_stu3_to_r4() { + // Given + when(fhirConverter.convertResource(eq((org.hl7.fhir.dstu3.model.Resource) STU3_RESOURCE))) + .thenReturn((Resource) R4_RESOURCE); + + // When + IBaseResource converted = converter.convert(STU3_RESOURCE, FhirVersionEnum.DSTU3); + + // Then + assertThat((org.hl7.fhir.r4.model.MedicationRequest) converted).isNotNull(); + } + + @Test + public void it_should_convert_r4_to_stu3() { + // Given + when(fhirConverter.convertResource(eq((org.hl7.fhir.r4.model.Resource) R4_RESOURCE))) + .thenReturn((org.hl7.fhir.dstu3.model.Resource) STU3_RESOURCE); + + // When + IBaseResource converted = converter.convert(R4_RESOURCE, FhirVersionEnum.R4); + + // Then + assertThat((org.hl7.fhir.dstu3.model.MedicationRequest) converted).isNotNull(); + } +} diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java index fe8d843..7d56053 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java @@ -8,6 +8,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.MediaType; +import static ca.uhn.fhir.context.FhirVersionEnum.DSTU3; +import static ca.uhn.fhir.context.FhirVersionEnum.R4; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @@ -33,8 +35,8 @@ class FhirParserTest { private static final String R4_JSON_RES = "a r4 json resource"; private static final String R4_XML_RES = "a r4 xml resource"; - private static final org.hl7.fhir.dstu3.model.MedicationRequest STU3_RES = new org.hl7.fhir.dstu3.model.MedicationRequest(); - private static final org.hl7.fhir.r4.model.MedicationRequest R4_RES = new org.hl7.fhir.r4.model.MedicationRequest(); + private static final org.hl7.fhir.dstu3.model.MedicationRequest A_STU3_RES = new org.hl7.fhir.dstu3.model.MedicationRequest(); + private static final org.hl7.fhir.r4.model.MedicationRequest A_R4_RES = new org.hl7.fhir.r4.model.MedicationRequest(); private static final Class STU3_CLASS = org.hl7.fhir.dstu3.model.MedicationRequest.class; private static final Class R4_CLASS = org.hl7.fhir.r4.model.MedicationRequest.class; @@ -47,24 +49,24 @@ void setUp() { void it_should_parse_stu3_json_resource() { // Given when(stu3JsonParser.parseResource(STU3_CLASS, STU3_JSON_RES)) - .thenReturn(STU3_RES); + .thenReturn(A_STU3_RES); // When org.hl7.fhir.dstu3.model.MedicationRequest resource = fhirParser.parse(STU3_JSON_RES, STU3_CLASS, JSON); // Then - assertThat(resource).isEqualTo(STU3_RES); + assertThat(resource).isEqualTo(A_STU3_RES); } @Test void it_should_encode_stu3_json_resource() { // Given - when(stu3JsonParser.encodeResourceToString(STU3_RES)) + when(stu3JsonParser.encodeResourceToString(A_STU3_RES)) .thenReturn(STU3_JSON_RES); // When - String resource = fhirParser.encode(STU3_RES, STU3_CLASS, JSON); + String resource = fhirParser.encode(A_STU3_RES, DSTU3, JSON); // Then assertThat(resource).isEqualTo(STU3_JSON_RES); @@ -74,24 +76,24 @@ void it_should_encode_stu3_json_resource() { void it_should_parse_stu3_xml_resource() { // Given when(stu3XmlParser.parseResource(STU3_CLASS, STU3_XML_RES)) - .thenReturn(STU3_RES); + .thenReturn(A_STU3_RES); // When org.hl7.fhir.dstu3.model.MedicationRequest resource = fhirParser.parse(STU3_XML_RES, STU3_CLASS, XML); // Then - assertThat(resource).isEqualTo(STU3_RES); + assertThat(resource).isEqualTo(A_STU3_RES); } @Test void it_should_encode_stu3_xml_resource() { // Given - when(stu3XmlParser.encodeResourceToString(STU3_RES)) + when(stu3XmlParser.encodeResourceToString(A_STU3_RES)) .thenReturn(STU3_XML_RES); // When - String resource = fhirParser.encode(STU3_RES, STU3_CLASS, XML); + String resource = fhirParser.encode(A_STU3_RES, DSTU3, XML); // Then assertThat(resource).isEqualTo(STU3_XML_RES); @@ -101,24 +103,24 @@ void it_should_encode_stu3_xml_resource() { void it_should_parse_r4_json_resource() { // Given when(r4JsonParser.parseResource(R4_CLASS, R4_JSON_RES)) - .thenReturn(R4_RES); + .thenReturn(A_R4_RES); // When org.hl7.fhir.r4.model.MedicationRequest resource = fhirParser.parse(R4_JSON_RES, R4_CLASS, JSON); // Then - assertThat(resource).isEqualTo(R4_RES); + assertThat(resource).isEqualTo(A_R4_RES); } @Test void it_should_encode_r4_json_resource() { // Given - when(r4JsonParser.encodeResourceToString(R4_RES)) + when(r4JsonParser.encodeResourceToString(A_R4_RES)) .thenReturn(R4_JSON_RES); // When - String resource = fhirParser.encode(R4_RES, R4_CLASS, JSON); + String resource = fhirParser.encode(A_R4_RES, R4, JSON); // Then assertThat(resource).isEqualTo(R4_JSON_RES); @@ -128,24 +130,24 @@ void it_should_encode_r4_json_resource() { void it_should_parse_r4_xml_resource() { // Given when(r4XmlParser.parseResource(R4_CLASS, R4_XML_RES)) - .thenReturn(R4_RES); + .thenReturn(A_R4_RES); // When org.hl7.fhir.r4.model.MedicationRequest resource = fhirParser.parse(R4_XML_RES, R4_CLASS, XML); // Then - assertThat(resource).isEqualTo(R4_RES); + assertThat(resource).isEqualTo(A_R4_RES); } @Test void it_should_encode_r4_xml_resource() { // Given - when(r4XmlParser.encodeResourceToString(R4_RES)) + when(r4XmlParser.encodeResourceToString(A_R4_RES)) .thenReturn(R4_XML_RES); // When - String resource = fhirParser.encode(R4_RES, R4_CLASS, XML); + String resource = fhirParser.encode(A_R4_RES, R4, XML); // Then assertThat(resource).isEqualTo(R4_XML_RES); diff --git a/docker/Transformation-Engine/src/test/resources/FML/MedicationRequest_STU3_R4.fml b/docker/Transformation-Engine/src/test/resources/FML/MedicationRequest_STU3_R4.fml new file mode 100644 index 0000000..65d639e --- /dev/null +++ b/docker/Transformation-Engine/src/test/resources/FML/MedicationRequest_STU3_R4.fml @@ -0,0 +1,13 @@ +map "http://hl7.org/fhir/StructureMap/DomainResource3to4" = "R3 to R4 Conversions for DomainResource" + +uses "http://hl7.org/fhir/3.0/StructureDefinition/DomainResource" alias DomainResourceR3 as source +uses "http://hl7.org/fhir/StructureDefinition/DomainResource" alias DomainResource as target + +//imports "http://hl7.org/fhir/StructureMap/*3to4" + +group DomainResource(source src : DomainResourceR3, target tgt : DomainResource) extends Resource <> { + src.text -> tgt.text; + src.contained -> tgt.contained; + src.extension -> tgt.extension; + src.modifierExtension -> tgt.modifierExtension; +} diff --git a/docker/Transformation-Engine/src/test/resources/FML/extension.fml b/docker/Transformation-Engine/src/test/resources/FML/extension.fml new file mode 100644 index 0000000..d969303 --- /dev/null +++ b/docker/Transformation-Engine/src/test/resources/FML/extension.fml @@ -0,0 +1,25 @@ +map "http://basic.test/medication-request" = "basic-test-medication-request" +uses "http://hl7.org/fhir/StructureDefinition/MedicationRequest" alias MedicationRequest as source +uses "http://hl7.org/fhir/StructureDefinition/MedicationRequest" alias MedicationRequest as target +uses "http://hl7.org/fhir/StructureDefinition/CodeableConcept" alias CodeableConcept as source +uses "http://hl7.org/fhir/StructureDefinition/CodeableConcept" alias CodeableConcept as target +uses "http://hl7.org/fhir/StructureDefinition/Coding" alias Coding as source +uses "http://hl7.org/fhir/StructureDefinition/Coding" alias Coding as target +group MedicationRequest(source src : MedicationRequest, target tgt : MedicationRequest) { + src.extension as ext where $this.url='https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-PrescriptionType-1' + -> tgt.extension as tgtext, tgtext.url='UPDATED DEFINITION HERE' then { + ext.value : CodeableConcept as vs -> tgtext.value = create('CodeableConcept') as vt then CodeableConceptPrescriptionType(vs, vt); + }; + } +group CodeableConceptPrescriptionType(source src : CodeableConcept, target tgt : CodeableConcept) { + // src.coding -> tgt.coding; the short form is only woking when you have a <> + src.coding -> tgt.coding; + src.text as text -> tgt.text = text; +} +group Coding(source src : Coding, target tgt : Coding) <> { + src.system as system where $this='https://fhir.nhs.uk/STU3/CodeSystem/CareConnect-PrescriptionType-1' -> tgt.system = 'UPDATED CODESYSTEM HERE'; + src.version as version -> tgt.version = version; + src.code as code -> tgt.code = code; + src.display as display -> tgt.display = display; + src.userSelected as userSelected -> tgt.userSelected = userSelected; +} diff --git a/docker/Transformation-Engine/src/test/resources/R3_MedicationRequest.xml b/docker/Transformation-Engine/src/test/resources/R3_MedicationRequest.xml index 70f89c4..48ade90 100644 --- a/docker/Transformation-Engine/src/test/resources/R3_MedicationRequest.xml +++ b/docker/Transformation-Engine/src/test/resources/R3_MedicationRequest.xml @@ -1 +1,95 @@ -

Generated Narrative with Details

id: medrx002

identifier: 12345 (OFFICIAL)

status: active

intent: order

medication:prescribed medication

subject:Donald Duck

context:encounter that leads to this prescription

authoredOn: 01/03/2015

Requesters

-AgentOnBehalfOf
*Patrick PumpOrganization/f002

reasonCode: Essential hypertension (disorder)(Details : {SNOMED CT code '59621000' = 'Essential hypertension', given as 'Essential hypertension (disorder)'})

dosageInstruction:

\ No newline at end of file + + + + +
+

+ Generated Narrative with Details +

+

id: medrx002 +

+

identifier: 12345 (OFFICIAL) +

+

status: active +

+

intent: order +

+

medication: + prescribed medication +

+

subject: + Donald Duck +

+

context: + encounter that leads to this prescription +

+

authoredOn: 01/03/2015 +

+

Requesters

+ + + + + + + + + + + +
- + Agent + + OnBehalfOf +
* + Patrick Pump + + Organization/f002 +
+

reasonCode: Essential hypertension (disorder) + (Details : {SNOMED CT code '59621000' = 'Essential hypertension', given as 'Essential hypertension + (disorder)'}) + +

+

dosageInstruction: +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
From 07acbfbef75d90eda9da14e7c3e71a83dd6c58c9 Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Tue, 21 Dec 2021 13:49:16 +0000 Subject: [PATCH 08/12] AMB-962 make encode argument order consistent with other methods --- .../fhir/converter/service/mapping/ConverterService.java | 3 +-- .../nhsd/fhir/converter/service/mapping/FhirParser.java | 2 +- .../fhir/converter/service/mapping/FhirParserTest.java | 8 ++++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java index 3948990..fd7b33a 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/ConverterService.java @@ -30,8 +30,7 @@ public String convert(String resource, MediaType mediaType, FhirVersionEnum fhir IBaseResource transformed = transformer.transform(converted); FhirVersionEnum outVersion = fhirVersion == FhirVersionEnum.R4 ? FhirVersionEnum.DSTU3 : FhirVersionEnum.R4; - String convertedStr = fhirParser.encode(transformed, outVersion, mediaType); - return convertedStr; + return fhirParser.encode(transformed, mediaType, outVersion); } } diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java index 5b2a975..dd74a9c 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/FhirParser.java @@ -39,7 +39,7 @@ public T parse(String resource, Class resourceType, throw new IllegalStateException("Invalid Content-Type"); } - public String encode(IBaseResource resource, FhirVersionEnum fhirVersion, MediaType mediaType) { + public String encode(IBaseResource resource, MediaType mediaType, FhirVersionEnum fhirVersion) { boolean isR4 = FhirVersionEnum.R4 == fhirVersion; if (MediaType.APPLICATION_JSON == mediaType) { diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java index 7d56053..1654125 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/FhirParserTest.java @@ -66,7 +66,7 @@ void it_should_encode_stu3_json_resource() { .thenReturn(STU3_JSON_RES); // When - String resource = fhirParser.encode(A_STU3_RES, DSTU3, JSON); + String resource = fhirParser.encode(A_STU3_RES, JSON, DSTU3); // Then assertThat(resource).isEqualTo(STU3_JSON_RES); @@ -93,7 +93,7 @@ void it_should_encode_stu3_xml_resource() { .thenReturn(STU3_XML_RES); // When - String resource = fhirParser.encode(A_STU3_RES, DSTU3, XML); + String resource = fhirParser.encode(A_STU3_RES, XML, DSTU3); // Then assertThat(resource).isEqualTo(STU3_XML_RES); @@ -120,7 +120,7 @@ void it_should_encode_r4_json_resource() { .thenReturn(R4_JSON_RES); // When - String resource = fhirParser.encode(A_R4_RES, R4, JSON); + String resource = fhirParser.encode(A_R4_RES, JSON, R4); // Then assertThat(resource).isEqualTo(R4_JSON_RES); @@ -147,7 +147,7 @@ void it_should_encode_r4_xml_resource() { .thenReturn(R4_XML_RES); // When - String resource = fhirParser.encode(A_R4_RES, R4, XML); + String resource = fhirParser.encode(A_R4_RES, XML, R4); // Then assertThat(resource).isEqualTo(R4_XML_RES); From 8fba3f89745694b5fa3a54b2880d3aafb9d477ab Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Tue, 21 Dec 2021 13:49:42 +0000 Subject: [PATCH 09/12] AMB-962 add tests to ConverterServiceTest --- .../service/mapping/ConverterServiceTest.java | 116 ++++++++++++------ 1 file changed, 77 insertions(+), 39 deletions(-) diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java index ee0e671..a0ca6e5 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/service/mapping/ConverterServiceTest.java @@ -70,7 +70,7 @@ void it_should_convert_stu3_json_resource() throws ParserConfigurationException, doReturn(R4_JSON_RES) .when(fhirParser) - .encode(A_TRANSFORMED_R4_RES, R4, JSON); + .encode(A_TRANSFORMED_R4_RES, JSON, R4); // When String actualConverted = converterService.convert(STU3_JSON_RES, JSON, DSTU3); @@ -79,43 +79,81 @@ void it_should_convert_stu3_json_resource() throws ParserConfigurationException, assertThat(actualConverted).isEqualTo(R4_JSON_RES); } - /* - - @Test - void it_should_convert_r4_json_resource() { - // Given - org.hl7.fhir.dstu3.model.MedicationRequest expStu3Resource = new org.hl7.fhir.dstu3.model.MedicationRequest(); - when(r4JsonParser.parseResource(any(), eq(r4JsonResource))).thenReturn(expStu3Resource); - - // When - org.hl7.fhir.dstu3.model.MedicationRequest stu3Resource = converterService.convert(r4JsonResource, jsonIn); - - // Then - assertThat(stu3Resource).isEqualTo(expStu3Resource); - } - - @Test - void it_should_convert_stu3_xml_resource() { - // Given - MedicationRequest expR4Resource = new MedicationRequest(); - when(stu3XmlParser.parseResource(any(), eq(stu3XmlResource))).thenReturn(expR4Resource); - - // When - MedicationRequest r4Resource = converterService.convert(stu3XmlResource, xmlIn); - - // Then - assertThat(r4Resource).isEqualTo(expR4Resource); - } - - */ -/* - static { - InputStream is = ConverterTest.class.getClassLoader().getResourceAsStream("GPConnect/MedicationRequest_GPConnect.json"); - try { - stu3JsonResource = new String(is.readAllBytes()); - } catch (IOException e) { - fail("Can't open test resource file"); - } + @Test + void it_should_convert_stu3_xml_resource() throws ParserConfigurationException, IOException, SAXException { + // Given + doReturn(A_STU3_RES) + .when(fhirParser) + .parse(STU3_XML_RES, STU3_CLASS, XML); + + doReturn(A_CONVERTED_R4_RES) + .when(converter) + .convert(A_STU3_RES, DSTU3); + + doReturn(A_TRANSFORMED_R4_RES) + .when(transformer) + .transform(A_CONVERTED_R4_RES); + + doReturn(R4_XML_RES) + .when(fhirParser) + .encode(A_TRANSFORMED_R4_RES, XML, R4); + + // When + String actualConverted = converterService.convert(STU3_XML_RES, XML, DSTU3); + + // Then + assertThat(actualConverted).isEqualTo(R4_XML_RES); + } + + @Test + void it_should_convert_r4_json_resource() throws ParserConfigurationException, IOException, SAXException { + // Given + doReturn(A_R4_RES) + .when(fhirParser) + .parse(R4_JSON_RES, R4_CLASS, JSON); + + doReturn(A_CONVERTED_STU3_RES) + .when(converter) + .convert(A_R4_RES, R4); + + doReturn(A_TRANSFORMED_STU3_RES) + .when(transformer) + .transform(A_CONVERTED_STU3_RES); + + doReturn(STU3_JSON_RES) + .when(fhirParser) + .encode(A_TRANSFORMED_STU3_RES, JSON, DSTU3); + + // When + String actualConverted = converterService.convert(R4_JSON_RES, JSON, R4); + + // Then + assertThat(actualConverted).isEqualTo(STU3_JSON_RES); + } + + @Test + void it_should_convert_r4_xml_resource() throws ParserConfigurationException, IOException, SAXException { + // Given + doReturn(A_R4_RES) + .when(fhirParser) + .parse(R4_XML_RES, R4_CLASS, XML); + + doReturn(A_CONVERTED_STU3_RES) + .when(converter) + .convert(A_R4_RES, R4); + + doReturn(A_TRANSFORMED_STU3_RES) + .when(transformer) + .transform(A_CONVERTED_STU3_RES); + + doReturn(STU3_XML_RES) + .when(fhirParser) + .encode(A_TRANSFORMED_STU3_RES, XML, DSTU3); + + // When + String actualConverted = converterService.convert(R4_XML_RES, XML, R4); + + // Then + assertThat(actualConverted).isEqualTo(STU3_XML_RES); } -*/ } From 66e3ac2a6d20c8189d5d6298869fa4914c4b4968 Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Wed, 22 Dec 2021 13:29:20 +0000 Subject: [PATCH 10/12] AMB-962 revert resource back to it's minimised version and use trim() to ignore last empty line --- .../fhir/converter/controller/ConversionControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/controller/ConversionControllerTest.java b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/controller/ConversionControllerTest.java index d6953e7..2b684ba 100644 --- a/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/controller/ConversionControllerTest.java +++ b/docker/Transformation-Engine/src/test/java/nhsd/fhir/converter/controller/ConversionControllerTest.java @@ -47,7 +47,7 @@ public void callConverterToConvert_R4_to_R3_json_json() throws Exception { //then assertEquals(responseEntity.getStatusCode(), HttpStatus.OK); - assertEquals(responseEntity.getBody(), staticR3Json); + assertEquals(responseEntity.getBody(), staticR3Json.trim()); } @Test From 52b5169f37cd53726e5c0002a51ab92a06537d8b Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Wed, 22 Dec 2021 13:30:23 +0000 Subject: [PATCH 11/12] AMB-962 make Transformer's logic to identity --- .../service/mapping/Transformer.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java index 8007111..c39955a 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java @@ -1,44 +1,14 @@ package nhsd.fhir.converter.service.mapping; import org.hl7.fhir.instance.model.api.IBaseResource; -import org.hl7.fhir.r4.context.IWorkerContext; -import org.hl7.fhir.r4.context.SimpleWorkerContext; -import org.hl7.fhir.r4.model.StructureMap; -import org.hl7.fhir.r4.utils.StructureMapUtilities; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.io.InputStream; - @Component public class Transformer { - static private String medicationRequestStu3ToR4Fml; - private final StructureMap structureMap; - private final StructureMapUtilities structureMapUtilities; - - public Transformer() throws IOException { - IWorkerContext worker = new SimpleWorkerContext(); - structureMapUtilities = new StructureMapUtilities(worker); - structureMap = structureMapUtilities.parse(medicationRequestStu3ToR4Fml, "src"); - } - IBaseResource transform(IBaseResource resource) { org.hl7.fhir.r4.model.Resource source = (org.hl7.fhir.r4.model.Resource) resource; org.hl7.fhir.r4.model.Resource target = source.copy(); -// structureMapUtilities.transform("source", source, structureMap, target); - return target; } - - static { -// InputStream is = Transformer.class.getClassLoader().getResourceAsStream("fml/MedicationRequest/STU3_to_R4.fml"); - InputStream is = Transformer.class.getClassLoader().getResourceAsStream("fml/MedicationRequest/extension.fml"); - try { - medicationRequestStu3ToR4Fml = new String(is.readAllBytes()); - } catch (IOException e) { - System.err.println("Can't load fml mapping file"); - } - - } } From 0b8a5fe20bad83365b7cc03529fb26ee225d004c Mon Sep 17 00:00:00 2001 From: Jalal Hosseini Date: Mon, 10 Jan 2022 14:06:31 +0000 Subject: [PATCH 12/12] AMB-962 add transformer logic --- .../Transformation-Engine/database/h2.mv.db | Bin 0 -> 221184 bytes .../database/h2.trace.db | 1494 +++++++++++++++++ .../service/mapping/Transformer.java | 30 + .../src/main/resources/application.properties | 1 - .../src/main/resources/application.yml | 35 + .../fml/MedicationRequest/STU3_to_R4.fml | 12 +- .../MedicationRequest_GPConnect.json | 1 + 7 files changed, 1566 insertions(+), 7 deletions(-) create mode 100644 docker/Transformation-Engine/database/h2.mv.db create mode 100644 docker/Transformation-Engine/database/h2.trace.db delete mode 100644 docker/Transformation-Engine/src/main/resources/application.properties create mode 100644 docker/Transformation-Engine/src/main/resources/application.yml diff --git a/docker/Transformation-Engine/database/h2.mv.db b/docker/Transformation-Engine/database/h2.mv.db new file mode 100644 index 0000000000000000000000000000000000000000..5a4ca5c0eee1779dc827a5c78a68ef970cec8c2f GIT binary patch literal 221184 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�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 literal 0 HcmV?d00001 diff --git a/docker/Transformation-Engine/database/h2.trace.db b/docker/Transformation-Engine/database/h2.trace.db new file mode 100644 index 0000000..9ba5f2f --- /dev/null +++ b/docker/Transformation-Engine/database/h2.trace.db @@ -0,0 +1,1494 @@ +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: The database is open in exclusive mode; can not open additional connections [90135-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.engine.Session.checkSuspended(Session.java:1369) + at org.h2.engine.Session.transitionToState(Session.java:1361) + at org.h2.engine.Session.waitIfExclusiveModeEnabled(Session.java:1633) + at org.h2.command.Command.executeQuery(Command.java:186) + at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:114) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) + at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) + at org.hibernate.loader.Loader.getResultSet(Loader.java:2303) + at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2056) + at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2018) + at org.hibernate.loader.Loader.scroll(Loader.java:2926) + at org.hibernate.loader.custom.CustomLoader.scroll(CustomLoader.java:383) + at org.hibernate.internal.SessionImpl.scrollCustomQuery(SessionImpl.java:2116) + at org.hibernate.internal.AbstractSharedSessionContract.scroll(AbstractSharedSessionContract.java:1177) + at org.hibernate.query.internal.NativeQueryImpl.doScroll(NativeQueryImpl.java:223) + at org.hibernate.query.internal.AbstractProducedQuery.scroll(AbstractProducedQuery.java:1548) + at org.hibernate.query.internal.AbstractProducedQuery.scroll(AbstractProducedQuery.java:115) + at ca.uhn.fhir.jpa.search.builder.sql.SearchQueryExecutor.fetchNext(SearchQueryExecutor.java:122) + at ca.uhn.fhir.jpa.search.builder.sql.SearchQueryExecutor.hasNext(SearchQueryExecutor.java:87) + at ca.uhn.fhir.jpa.search.builder.SearchBuilder$QueryIterator.fetchNext(SearchBuilder.java:1384) + at ca.uhn.fhir.jpa.search.builder.SearchBuilder$QueryIterator.hasNext(SearchBuilder.java:1517) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl.lambda$executeQuery$4(SearchCoordinatorSvcImpl.java:503) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl.executeQuery(SearchCoordinatorSvcImpl.java:473) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl.registerSearch(SearchCoordinatorSvcImpl.java:332) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl$$FastClassBySpringCGLIB$$b0ac938b.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl$$EnhancerBySpringCGLIB$$2951db5b.registerSearch() + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.search(BaseHapiFhirResourceDao.java:1431) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.search(BaseHapiFhirResourceDao.java:1395) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.search(BaseHapiFhirResourceDao.java:1389) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao$$FastClassBySpringCGLIB$$5578fb67.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoStructureDefinitionR4$$EnhancerBySpringCGLIB$$eea42efe.search() + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.fetchAllStructureDefinitions(JpaPersistedResourceValidationSupport.java:163) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$FastClassBySpringCGLIB$$d5c592c1.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$EnhancerBySpringCGLIB$$97830abd.fetchAllStructureDefinitions() + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.lambda$fetchAllStructureDefinitions$0(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.doFetchStructureDefinitions(ValidationSupportChain.java:200) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.fetchAllStructureDefinitions(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper.fetchAllStructureDefinitions(BaseValidationSupportWrapper.java:51) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$fetchAllStructureDefinitions$1(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$loadFromCache$14(CachingValidationSupport.java:157) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2405) + at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2403) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2386) + at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:108) + at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.loadFromCache(CachingValidationSupport.java:158) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.fetchAllStructureDefinitions(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.allStructures(VersionSpecificWorkerContextWrapper.java:215) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.getStructures(VersionSpecificWorkerContextWrapper.java:231) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:319) + at org.hl7.fhir.r5.conformance.ProfileUtilities.(ProfileUtilities.java:357) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:312) + at org.hl7.fhir.r5.elementmodel.JsonParser.(JsonParser.java:91) + at org.hl7.fhir.r5.elementmodel.Manager.makeParser(Manager.java:105) + at org.hl7.fhir.r5.elementmodel.Manager.parseSingle(Manager.java:95) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.transfrom(StructureMapTransformProvider.java:156) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.manualInputAndOutput(StructureMapTransformProvider.java:147) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at ca.uhn.fhir.rest.server.method.BaseMethodBinding.invokeServerMethod(BaseMethodBinding.java:264) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:332) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:326) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:434) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:307) + at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1152) + at ca.uhn.fhir.jpa.starter.JpaRestfulServer.handleRequest(JpaRestfulServer.java:31) + at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:423) + at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1861) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:834) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcStatement.checkClosed(JdbcStatement.java:1211) + at org.h2.jdbc.JdbcPreparedStatement.checkClosed(JdbcPreparedStatement.java:1738) + at org.h2.jdbc.JdbcStatement.checkClosed(JdbcStatement.java:1185) + at org.h2.jdbc.JdbcStatement.getMaxRows(JdbcStatement.java:430) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.getMaxRows(HikariProxyPreparedStatement.java) + at org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl.close(ResourceRegistryStandardImpl.java:183) + at org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl.release(ResourceRegistryStandardImpl.java:109) + at org.hibernate.loader.Loader.getResultSet(Loader.java:2308) + at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2056) + at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2018) + at org.hibernate.loader.Loader.scroll(Loader.java:2926) + at org.hibernate.loader.custom.CustomLoader.scroll(CustomLoader.java:383) + at org.hibernate.internal.SessionImpl.scrollCustomQuery(SessionImpl.java:2116) + at org.hibernate.internal.AbstractSharedSessionContract.scroll(AbstractSharedSessionContract.java:1177) + at org.hibernate.query.internal.NativeQueryImpl.doScroll(NativeQueryImpl.java:223) + at org.hibernate.query.internal.AbstractProducedQuery.scroll(AbstractProducedQuery.java:1548) + at org.hibernate.query.internal.AbstractProducedQuery.scroll(AbstractProducedQuery.java:115) + at ca.uhn.fhir.jpa.search.builder.sql.SearchQueryExecutor.fetchNext(SearchQueryExecutor.java:122) + at ca.uhn.fhir.jpa.search.builder.sql.SearchQueryExecutor.hasNext(SearchQueryExecutor.java:87) + at ca.uhn.fhir.jpa.search.builder.SearchBuilder$QueryIterator.fetchNext(SearchBuilder.java:1384) + at ca.uhn.fhir.jpa.search.builder.SearchBuilder$QueryIterator.hasNext(SearchBuilder.java:1517) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl.lambda$executeQuery$4(SearchCoordinatorSvcImpl.java:503) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl.executeQuery(SearchCoordinatorSvcImpl.java:473) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl.registerSearch(SearchCoordinatorSvcImpl.java:332) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl$$FastClassBySpringCGLIB$$b0ac938b.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl$$EnhancerBySpringCGLIB$$2951db5b.registerSearch() + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.search(BaseHapiFhirResourceDao.java:1431) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.search(BaseHapiFhirResourceDao.java:1395) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.search(BaseHapiFhirResourceDao.java:1389) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao$$FastClassBySpringCGLIB$$5578fb67.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoStructureDefinitionR4$$EnhancerBySpringCGLIB$$eea42efe.search() + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport.fetchAllStructureDefinitions(JpaPersistedResourceValidationSupport.java:163) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$FastClassBySpringCGLIB$$d5c592c1.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$EnhancerBySpringCGLIB$$97830abd.fetchAllStructureDefinitions() + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.lambda$fetchAllStructureDefinitions$0(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.doFetchStructureDefinitions(ValidationSupportChain.java:200) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.fetchAllStructureDefinitions(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper.fetchAllStructureDefinitions(BaseValidationSupportWrapper.java:51) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$fetchAllStructureDefinitions$1(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$loadFromCache$14(CachingValidationSupport.java:157) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2405) + at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2403) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2386) + at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:108) + at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.loadFromCache(CachingValidationSupport.java:158) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.fetchAllStructureDefinitions(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.allStructures(VersionSpecificWorkerContextWrapper.java:215) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.getStructures(VersionSpecificWorkerContextWrapper.java:231) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:319) + at org.hl7.fhir.r5.conformance.ProfileUtilities.(ProfileUtilities.java:357) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:312) + at org.hl7.fhir.r5.elementmodel.JsonParser.(JsonParser.java:91) + at org.hl7.fhir.r5.elementmodel.Manager.makeParser(Manager.java:105) + at org.hl7.fhir.r5.elementmodel.Manager.parseSingle(Manager.java:95) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.transfrom(StructureMapTransformProvider.java:156) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.manualInputAndOutput(StructureMapTransformProvider.java:147) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at ca.uhn.fhir.rest.server.method.BaseMethodBinding.invokeServerMethod(BaseMethodBinding.java:264) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:332) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:326) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:434) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:307) + at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1152) + at ca.uhn.fhir.jpa.starter.JpaRestfulServer.handleRequest(JpaRestfulServer.java:31) + at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:423) + at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1861) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:834) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosedForWrite(JdbcConnection.java:1500) + at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:556) + at com.zaxxer.hikari.pool.ProxyConnection.rollback(ProxyConnection.java:359) + at com.zaxxer.hikari.pool.HikariProxyConnection.rollback(HikariProxyConnection.java) + at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.rollback(AbstractLogicalConnectionImplementor.java:121) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:304) + at org.hibernate.engine.transaction.internal.TransactionImpl.rollback(TransactionImpl.java:142) + at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:589) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:672) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$EnhancerBySpringCGLIB$$97830abd.fetchAllStructureDefinitions() + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.lambda$fetchAllStructureDefinitions$0(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.doFetchStructureDefinitions(ValidationSupportChain.java:200) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.fetchAllStructureDefinitions(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper.fetchAllStructureDefinitions(BaseValidationSupportWrapper.java:51) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$fetchAllStructureDefinitions$1(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$loadFromCache$14(CachingValidationSupport.java:157) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2405) + at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2403) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2386) + at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:108) + at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.loadFromCache(CachingValidationSupport.java:158) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.fetchAllStructureDefinitions(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.allStructures(VersionSpecificWorkerContextWrapper.java:215) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.getStructures(VersionSpecificWorkerContextWrapper.java:231) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:319) + at org.hl7.fhir.r5.conformance.ProfileUtilities.(ProfileUtilities.java:357) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:312) + at org.hl7.fhir.r5.elementmodel.JsonParser.(JsonParser.java:91) + at org.hl7.fhir.r5.elementmodel.Manager.makeParser(Manager.java:105) + at org.hl7.fhir.r5.elementmodel.Manager.parseSingle(Manager.java:95) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.transfrom(StructureMapTransformProvider.java:156) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.manualInputAndOutput(StructureMapTransformProvider.java:147) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at ca.uhn.fhir.rest.server.method.BaseMethodBinding.invokeServerMethod(BaseMethodBinding.java:264) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:332) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:326) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:434) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:307) + at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1152) + at ca.uhn.fhir.jpa.starter.JpaRestfulServer.handleRequest(JpaRestfulServer.java:31) + at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:423) + at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1861) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:834) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.getWarnings(JdbcConnection.java:689) + at com.zaxxer.hikari.pool.HikariProxyConnection.getWarnings(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:290) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:269) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:213) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1004) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:875) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:672) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$EnhancerBySpringCGLIB$$97830abd.fetchAllStructureDefinitions() + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.lambda$fetchAllStructureDefinitions$0(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.doFetchStructureDefinitions(ValidationSupportChain.java:200) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.fetchAllStructureDefinitions(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper.fetchAllStructureDefinitions(BaseValidationSupportWrapper.java:51) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$fetchAllStructureDefinitions$1(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$loadFromCache$14(CachingValidationSupport.java:157) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2405) + at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2403) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2386) + at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:108) + at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.loadFromCache(CachingValidationSupport.java:158) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.fetchAllStructureDefinitions(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.allStructures(VersionSpecificWorkerContextWrapper.java:215) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.getStructures(VersionSpecificWorkerContextWrapper.java:231) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:319) + at org.hl7.fhir.r5.conformance.ProfileUtilities.(ProfileUtilities.java:357) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:312) + at org.hl7.fhir.r5.elementmodel.JsonParser.(JsonParser.java:91) + at org.hl7.fhir.r5.elementmodel.Manager.makeParser(Manager.java:105) + at org.hl7.fhir.r5.elementmodel.Manager.parseSingle(Manager.java:95) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.transfrom(StructureMapTransformProvider.java:156) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.manualInputAndOutput(StructureMapTransformProvider.java:147) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at ca.uhn.fhir.rest.server.method.BaseMethodBinding.invokeServerMethod(BaseMethodBinding.java:264) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:332) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:326) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:434) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:307) + at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1152) + at ca.uhn.fhir.jpa.starter.JpaRestfulServer.handleRequest(JpaRestfulServer.java:31) + at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:423) + at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1861) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:834) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.clearWarnings(JdbcConnection.java:703) + at com.zaxxer.hikari.pool.HikariProxyConnection.clearWarnings(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:299) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:269) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:213) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1004) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:875) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:672) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$EnhancerBySpringCGLIB$$97830abd.fetchAllStructureDefinitions() + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.lambda$fetchAllStructureDefinitions$0(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.doFetchStructureDefinitions(ValidationSupportChain.java:200) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.fetchAllStructureDefinitions(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper.fetchAllStructureDefinitions(BaseValidationSupportWrapper.java:51) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$fetchAllStructureDefinitions$1(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$loadFromCache$14(CachingValidationSupport.java:157) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2405) + at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2403) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2386) + at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:108) + at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.loadFromCache(CachingValidationSupport.java:158) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.fetchAllStructureDefinitions(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.allStructures(VersionSpecificWorkerContextWrapper.java:215) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.getStructures(VersionSpecificWorkerContextWrapper.java:231) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:319) + at org.hl7.fhir.r5.conformance.ProfileUtilities.(ProfileUtilities.java:357) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:312) + at org.hl7.fhir.r5.elementmodel.JsonParser.(JsonParser.java:91) + at org.hl7.fhir.r5.elementmodel.Manager.makeParser(Manager.java:105) + at org.hl7.fhir.r5.elementmodel.Manager.parseSingle(Manager.java:95) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.transfrom(StructureMapTransformProvider.java:156) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.manualInputAndOutput(StructureMapTransformProvider.java:147) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at ca.uhn.fhir.rest.server.method.BaseMethodBinding.invokeServerMethod(BaseMethodBinding.java:264) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:332) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:326) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:434) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:307) + at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1152) + at ca.uhn.fhir.jpa.starter.JpaRestfulServer.handleRequest(JpaRestfulServer.java:31) + at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:423) + at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1861) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:834) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosedForWrite(JdbcConnection.java:1500) + at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:556) + at com.zaxxer.hikari.pool.ProxyConnection.close(ProxyConnection.java:230) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.closeConnection(DatasourceConnectionProviderImpl.java:127) + at org.hibernate.internal.NonContextualJdbcConnectionAccess.releaseConnection(NonContextualJdbcConnectionAccess.java:49) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:217) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1004) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:875) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:672) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.JpaPersistedResourceValidationSupport$$EnhancerBySpringCGLIB$$97830abd.fetchAllStructureDefinitions() + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.lambda$fetchAllStructureDefinitions$0(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.doFetchStructureDefinitions(ValidationSupportChain.java:200) + at org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain.fetchAllStructureDefinitions(ValidationSupportChain.java:188) + at org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper.fetchAllStructureDefinitions(BaseValidationSupportWrapper.java:51) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$fetchAllStructureDefinitions$1(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.lambda$loadFromCache$14(CachingValidationSupport.java:157) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2405) + at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1908) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2403) + at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2386) + at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:108) + at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.loadFromCache(CachingValidationSupport.java:158) + at org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport.fetchAllStructureDefinitions(CachingValidationSupport.java:84) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.allStructures(VersionSpecificWorkerContextWrapper.java:215) + at org.hl7.fhir.common.hapi.validation.validator.VersionSpecificWorkerContextWrapper.getStructures(VersionSpecificWorkerContextWrapper.java:231) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:319) + at org.hl7.fhir.r5.conformance.ProfileUtilities.(ProfileUtilities.java:357) + at org.hl7.fhir.r5.utils.FHIRPathEngine.(FHIRPathEngine.java:312) + at org.hl7.fhir.r5.elementmodel.JsonParser.(JsonParser.java:91) + at org.hl7.fhir.r5.elementmodel.Manager.makeParser(Manager.java:105) + at org.hl7.fhir.r5.elementmodel.Manager.parseSingle(Manager.java:95) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.transfrom(StructureMapTransformProvider.java:156) + at ch.ahdis.matchbox.mappinglanguage.StructureMapTransformProvider.manualInputAndOutput(StructureMapTransformProvider.java:147) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at ca.uhn.fhir.rest.server.method.BaseMethodBinding.invokeServerMethod(BaseMethodBinding.java:264) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:332) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.doInvokeServer(BaseResourceReturningMethodBinding.java:326) + at ca.uhn.fhir.rest.server.method.BaseResourceReturningMethodBinding.invokeServer(BaseResourceReturningMethodBinding.java:434) + at ca.uhn.fhir.rest.server.method.OperationMethodBinding.invokeServer(OperationMethodBinding.java:307) + at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:1152) + at ca.uhn.fhir.jpa.starter.JpaRestfulServer.handleRequest(JpaRestfulServer.java:31) + at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:423) + at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1861) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:834) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:516) + at com.zaxxer.hikari.pool.HikariProxyConnection.getAutoCommit(HikariProxyConnection.java) + at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.determineInitialAutoCommitMode(AbstractLogicalConnectionImplementor.java:135) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:281) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:246) + at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:83) + at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:164) + at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:421) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.doExecuteCallback(HapiTransactionService.java:149) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:83) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:75) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.searchForIds(BaseHapiFhirResourceDao.java:1508) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao.searchForIds(IFhirResourceDao.java:216) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao$$FastClassBySpringCGLIB$$d50e42b3.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoSubscriptionR4$$EnhancerBySpringCGLIB$$c28db1eb.searchForIds() + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl.getVersionMap(ResourceVersionSvcDaoImpl.java:74) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc.getVersionMap(IResourceVersionSvc.java:40) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc$$FastClassBySpringCGLIB$$6b459960.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl$$EnhancerBySpringCGLIB$$3c670251.getVersionMap() + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshCacheAndNotifyListener(ResourceChangeListenerCacheRefresherImpl.java:133) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.lambda$refreshCacheAndNotifyListenersWithRetry$0(ResourceChangeListenerCache.java:145) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.lambda$runWithRetry$0(Retrier.java:87) + at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287) + at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.runWithRetry(Retrier.java:87) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheAndNotifyListenersWithRetry(ResourceChangeListenerCache.java:148) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheWithRetry(ResourceChangeListenerCache.java:130) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheIfNecessary(ResourceChangeListenerCache.java:111) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshExpiredCachesAndNotifyListeners(ResourceChangeListenerCacheRefresherImpl.java:90) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl$Job.execute(ResourceChangeListenerCacheRefresherImpl.java:80) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.setAutoCommit(JdbcConnection.java:495) + at com.zaxxer.hikari.pool.ProxyConnection.setAutoCommit(ProxyConnection.java:377) + at com.zaxxer.hikari.pool.HikariProxyConnection.setAutoCommit(HikariProxyConnection.java) + at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.begin(AbstractLogicalConnectionImplementor.java:72) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:283) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:246) + at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:83) + at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:164) + at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:421) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.doExecuteCallback(HapiTransactionService.java:149) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:83) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:75) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.searchForIds(BaseHapiFhirResourceDao.java:1508) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao.searchForIds(IFhirResourceDao.java:216) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao$$FastClassBySpringCGLIB$$d50e42b3.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoSubscriptionR4$$EnhancerBySpringCGLIB$$c28db1eb.searchForIds() + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl.getVersionMap(ResourceVersionSvcDaoImpl.java:74) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc.getVersionMap(IResourceVersionSvc.java:40) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc$$FastClassBySpringCGLIB$$6b459960.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl$$EnhancerBySpringCGLIB$$3c670251.getVersionMap() + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshCacheAndNotifyListener(ResourceChangeListenerCacheRefresherImpl.java:133) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.lambda$refreshCacheAndNotifyListenersWithRetry$0(ResourceChangeListenerCache.java:145) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.lambda$runWithRetry$0(Retrier.java:87) + at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287) + at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.runWithRetry(Retrier.java:87) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheAndNotifyListenersWithRetry(ResourceChangeListenerCache.java:148) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheWithRetry(ResourceChangeListenerCache.java:130) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheIfNecessary(ResourceChangeListenerCache.java:111) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshExpiredCachesAndNotifyListeners(ResourceChangeListenerCacheRefresherImpl.java:90) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl$Job.execute(ResourceChangeListenerCacheRefresherImpl.java:80) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.getWarnings(JdbcConnection.java:689) + at com.zaxxer.hikari.pool.HikariProxyConnection.getWarnings(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:290) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:269) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:213) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.closeEntityManagerAfterFailedBegin(JpaTransactionManager.java:514) + at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:466) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.doExecuteCallback(HapiTransactionService.java:149) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:83) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:75) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.searchForIds(BaseHapiFhirResourceDao.java:1508) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao.searchForIds(IFhirResourceDao.java:216) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao$$FastClassBySpringCGLIB$$d50e42b3.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoSubscriptionR4$$EnhancerBySpringCGLIB$$c28db1eb.searchForIds() + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl.getVersionMap(ResourceVersionSvcDaoImpl.java:74) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc.getVersionMap(IResourceVersionSvc.java:40) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc$$FastClassBySpringCGLIB$$6b459960.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl$$EnhancerBySpringCGLIB$$3c670251.getVersionMap() + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshCacheAndNotifyListener(ResourceChangeListenerCacheRefresherImpl.java:133) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.lambda$refreshCacheAndNotifyListenersWithRetry$0(ResourceChangeListenerCache.java:145) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.lambda$runWithRetry$0(Retrier.java:87) + at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287) + at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.runWithRetry(Retrier.java:87) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheAndNotifyListenersWithRetry(ResourceChangeListenerCache.java:148) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheWithRetry(ResourceChangeListenerCache.java:130) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheIfNecessary(ResourceChangeListenerCache.java:111) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshExpiredCachesAndNotifyListeners(ResourceChangeListenerCacheRefresherImpl.java:90) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl$Job.execute(ResourceChangeListenerCacheRefresherImpl.java:80) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.clearWarnings(JdbcConnection.java:703) + at com.zaxxer.hikari.pool.HikariProxyConnection.clearWarnings(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:299) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:269) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:213) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.closeEntityManagerAfterFailedBegin(JpaTransactionManager.java:514) + at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:466) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.doExecuteCallback(HapiTransactionService.java:149) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:83) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:75) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.searchForIds(BaseHapiFhirResourceDao.java:1508) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao.searchForIds(IFhirResourceDao.java:216) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao$$FastClassBySpringCGLIB$$d50e42b3.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoSubscriptionR4$$EnhancerBySpringCGLIB$$c28db1eb.searchForIds() + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl.getVersionMap(ResourceVersionSvcDaoImpl.java:74) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc.getVersionMap(IResourceVersionSvc.java:40) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc$$FastClassBySpringCGLIB$$6b459960.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl$$EnhancerBySpringCGLIB$$3c670251.getVersionMap() + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshCacheAndNotifyListener(ResourceChangeListenerCacheRefresherImpl.java:133) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.lambda$refreshCacheAndNotifyListenersWithRetry$0(ResourceChangeListenerCache.java:145) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.lambda$runWithRetry$0(Retrier.java:87) + at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287) + at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.runWithRetry(Retrier.java:87) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheAndNotifyListenersWithRetry(ResourceChangeListenerCache.java:148) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheWithRetry(ResourceChangeListenerCache.java:130) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheIfNecessary(ResourceChangeListenerCache.java:111) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshExpiredCachesAndNotifyListeners(ResourceChangeListenerCacheRefresherImpl.java:90) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl$Job.execute(ResourceChangeListenerCacheRefresherImpl.java:80) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-05 17:12:07 jdbc[8]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.clearWarnings(JdbcConnection.java:703) + at com.zaxxer.hikari.pool.ProxyConnection.close(ProxyConnection.java:240) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.closeConnection(DatasourceConnectionProviderImpl.java:127) + at org.hibernate.internal.NonContextualJdbcConnectionAccess.releaseConnection(NonContextualJdbcConnectionAccess.java:49) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:217) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.closeEntityManagerAfterFailedBegin(JpaTransactionManager.java:514) + at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:466) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.doExecuteCallback(HapiTransactionService.java:149) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:83) + at ca.uhn.fhir.jpa.dao.tx.HapiTransactionService.execute(HapiTransactionService.java:75) + at ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.searchForIds(BaseHapiFhirResourceDao.java:1508) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao.searchForIds(IFhirResourceDao.java:216) + at ca.uhn.fhir.jpa.api.dao.IFhirResourceDao$$FastClassBySpringCGLIB$$d50e42b3.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.dao.r4.FhirResourceDaoSubscriptionR4$$EnhancerBySpringCGLIB$$c28db1eb.searchForIds() + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl.getVersionMap(ResourceVersionSvcDaoImpl.java:74) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc.getVersionMap(IResourceVersionSvc.java:40) + at ca.uhn.fhir.jpa.cache.IResourceVersionSvc$$FastClassBySpringCGLIB$$6b459960.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) + at ca.uhn.fhir.jpa.cache.ResourceVersionSvcDaoImpl$$EnhancerBySpringCGLIB$$3c670251.getVersionMap() + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshCacheAndNotifyListener(ResourceChangeListenerCacheRefresherImpl.java:133) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.lambda$refreshCacheAndNotifyListenersWithRetry$0(ResourceChangeListenerCache.java:145) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.lambda$runWithRetry$0(Retrier.java:87) + at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287) + at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:164) + at ca.uhn.fhir.jpa.searchparam.retry.Retrier.runWithRetry(Retrier.java:87) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheAndNotifyListenersWithRetry(ResourceChangeListenerCache.java:148) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheWithRetry(ResourceChangeListenerCache.java:130) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCache.refreshCacheIfNecessary(ResourceChangeListenerCache.java:111) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl.refreshExpiredCachesAndNotifyListeners(ResourceChangeListenerCacheRefresherImpl.java:90) + at ca.uhn.fhir.jpa.cache.ResourceChangeListenerCacheRefresherImpl$Job.execute(ResourceChangeListenerCacheRefresherImpl.java:80) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-10 12:23:47 jdbc[4]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:350) + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:308) + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149) + at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176) + at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151) + at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2103) + at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2040) + at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2018) + at org.hibernate.loader.Loader.doQuery(Loader.java:948) + at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) + at org.hibernate.loader.Loader.doList(Loader.java:2849) + at org.hibernate.loader.Loader.doList(Loader.java:2831) + at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2663) + at org.hibernate.loader.Loader.list(Loader.java:2658) + at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506) + at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400) + at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219) + at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414) + at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1625) + at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1593) + at org.hibernate.query.Query.getResultList(Query.java:165) + at org.springframework.data.jpa.repository.query.JpaQueryExecution$SlicedExecution.doExecute(JpaQueryExecution.java:156) + at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88) + at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155) + at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) + at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159) + at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) + at com.sun.proxy.$Proxy172.findWhereCreatedBefore(Unknown Source) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl.lambda$pollForStaleSearchesAndDeleteThem$1(DatabaseSearchCacheSvcImpl.java:185) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl.pollForStaleSearchesAndDeleteThem(DatabaseSearchCacheSvcImpl.java:184) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$FastClassBySpringCGLIB$$f9ac20c0.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$EnhancerBySpringCGLIB$$fcd8751.pollForStaleSearchesAndDeleteThem() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.pollForStaleSearchesAndDeleteThem(StaleSearchDeletingSvcImpl.java:57) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.schedulePollForStaleSearches(StaleSearchDeletingSvcImpl.java:82) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$FastClassBySpringCGLIB$$979cdeaa.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$EnhancerBySpringCGLIB$$dfa8c34f.schedulePollForStaleSearches() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$Job.execute(StaleSearchDeletingSvcImpl.java:74) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-10 12:23:47 jdbc[4]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosedForWrite(JdbcConnection.java:1500) + at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:556) + at com.zaxxer.hikari.pool.ProxyConnection.rollback(ProxyConnection.java:359) + at com.zaxxer.hikari.pool.HikariProxyConnection.rollback(HikariProxyConnection.java) + at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.rollback(AbstractLogicalConnectionImplementor.java:121) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:304) + at org.hibernate.engine.transaction.internal.TransactionImpl.rollback(TransactionImpl.java:142) + at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:589) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl.pollForStaleSearchesAndDeleteThem(DatabaseSearchCacheSvcImpl.java:184) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$FastClassBySpringCGLIB$$f9ac20c0.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$EnhancerBySpringCGLIB$$fcd8751.pollForStaleSearchesAndDeleteThem() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.pollForStaleSearchesAndDeleteThem(StaleSearchDeletingSvcImpl.java:57) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.schedulePollForStaleSearches(StaleSearchDeletingSvcImpl.java:82) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$FastClassBySpringCGLIB$$979cdeaa.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$EnhancerBySpringCGLIB$$dfa8c34f.schedulePollForStaleSearches() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$Job.execute(StaleSearchDeletingSvcImpl.java:74) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-10 12:23:47 jdbc[4]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.getWarnings(JdbcConnection.java:689) + at com.zaxxer.hikari.pool.HikariProxyConnection.getWarnings(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:290) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:269) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:213) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1004) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:875) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl.pollForStaleSearchesAndDeleteThem(DatabaseSearchCacheSvcImpl.java:184) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$FastClassBySpringCGLIB$$f9ac20c0.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$EnhancerBySpringCGLIB$$fcd8751.pollForStaleSearchesAndDeleteThem() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.pollForStaleSearchesAndDeleteThem(StaleSearchDeletingSvcImpl.java:57) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.schedulePollForStaleSearches(StaleSearchDeletingSvcImpl.java:82) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$FastClassBySpringCGLIB$$979cdeaa.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$EnhancerBySpringCGLIB$$dfa8c34f.schedulePollForStaleSearches() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$Job.execute(StaleSearchDeletingSvcImpl.java:74) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-10 12:23:47 jdbc[4]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.clearWarnings(JdbcConnection.java:703) + at com.zaxxer.hikari.pool.HikariProxyConnection.clearWarnings(HikariProxyConnection.java) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:299) + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:269) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:213) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1004) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:875) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl.pollForStaleSearchesAndDeleteThem(DatabaseSearchCacheSvcImpl.java:184) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$FastClassBySpringCGLIB$$f9ac20c0.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$EnhancerBySpringCGLIB$$fcd8751.pollForStaleSearchesAndDeleteThem() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.pollForStaleSearchesAndDeleteThem(StaleSearchDeletingSvcImpl.java:57) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.schedulePollForStaleSearches(StaleSearchDeletingSvcImpl.java:82) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$FastClassBySpringCGLIB$$979cdeaa.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$EnhancerBySpringCGLIB$$dfa8c34f.schedulePollForStaleSearches() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$Job.execute(StaleSearchDeletingSvcImpl.java:74) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-10 12:23:47 jdbc[4]: exception +org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + at org.h2.message.DbException.get(DbException.java:205) + at org.h2.message.DbException.get(DbException.java:181) + at org.h2.message.DbException.get(DbException.java:170) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1514) + at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1490) + at org.h2.jdbc.JdbcConnection.setAutoCommit(JdbcConnection.java:495) + at com.zaxxer.hikari.pool.PoolBase.resetConnectionState(PoolBase.java:206) + at com.zaxxer.hikari.pool.PoolEntry.resetConnectionState(PoolEntry.java:108) + at com.zaxxer.hikari.pool.ProxyConnection.close(ProxyConnection.java:236) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.closeConnection(DatasourceConnectionProviderImpl.java:127) + at org.hibernate.internal.NonContextualJdbcConnectionAccess.releaseConnection(NonContextualJdbcConnectionAccess.java:49) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:217) + at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:259) + at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) + at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:351) + at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:376) + at org.hibernate.internal.SessionImpl.close(SessionImpl.java:361) + at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) + at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1004) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:875) + at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) + at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl.pollForStaleSearchesAndDeleteThem(DatabaseSearchCacheSvcImpl.java:184) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$FastClassBySpringCGLIB$$f9ac20c0.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.cache.DatabaseSearchCacheSvcImpl$$EnhancerBySpringCGLIB$$fcd8751.pollForStaleSearchesAndDeleteThem() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.pollForStaleSearchesAndDeleteThem(StaleSearchDeletingSvcImpl.java:57) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl.schedulePollForStaleSearches(StaleSearchDeletingSvcImpl.java:82) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$FastClassBySpringCGLIB$$979cdeaa.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$$EnhancerBySpringCGLIB$$dfa8c34f.schedulePollForStaleSearches() + at ca.uhn.fhir.jpa.search.StaleSearchDeletingSvcImpl$Job.execute(StaleSearchDeletingSvcImpl.java:74) + at org.quartz.core.JobRunShell.run(JobRunShell.java:202) + at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) +2022-01-10 12:23:47 database: flush +org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.get(DbException.java:194) + at org.h2.message.DbException.convert(DbException.java:347) + at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93) + at org.h2.mvstore.MVStore.handleException(MVStore.java:2877) + at org.h2.mvstore.MVStore.panic(MVStore.java:481) + at org.h2.mvstore.MVStore.(MVStore.java:402) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579) + at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170) + at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103) + at org.h2.engine.Database.getPageStore(Database.java:2659) + at org.h2.engine.Database.open(Database.java:675) + at org.h2.engine.Database.openDatabase(Database.java:307) + at org.h2.engine.Database.(Database.java:301) + at org.h2.engine.Engine.openSession(Engine.java:74) + at org.h2.engine.Engine.openSession(Engine.java:192) + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) + at org.h2.engine.Engine.createSession(Engine.java:166) + at org.h2.engine.Engine.createSession(Engine.java:29) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) + at org.h2.Driver.connect(Driver.java:69) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:112) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:118) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:428) + at com.zaxxer.hikari.pool.HikariPool.access$300(HikariPool.java:70) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:612) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:598) + at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) + at java.base/java.lang.Thread.run(Thread.java:834) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + ... 35 more +Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7] + at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) + at org.h2.mvstore.FileStore.open(FileStore.java:166) + at org.h2.mvstore.MVStore.(MVStore.java:381) + ... 29 more +Caused by: java.nio.channels.OverlappingFileLockException + at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229) + at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123) + at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154) + at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121) + at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + ... 30 more +2022-01-10 12:23:48 database: flush +org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.get(DbException.java:194) + at org.h2.message.DbException.convert(DbException.java:347) + at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93) + at org.h2.mvstore.MVStore.handleException(MVStore.java:2877) + at org.h2.mvstore.MVStore.panic(MVStore.java:481) + at org.h2.mvstore.MVStore.(MVStore.java:402) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579) + at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170) + at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103) + at org.h2.engine.Database.getPageStore(Database.java:2659) + at org.h2.engine.Database.open(Database.java:675) + at org.h2.engine.Database.openDatabase(Database.java:307) + at org.h2.engine.Database.(Database.java:301) + at org.h2.engine.Engine.openSession(Engine.java:74) + at org.h2.engine.Engine.openSession(Engine.java:192) + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) + at org.h2.engine.Engine.createSession(Engine.java:166) + at org.h2.engine.Engine.createSession(Engine.java:29) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) + at org.h2.Driver.connect(Driver.java:69) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:112) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:118) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:428) + at com.zaxxer.hikari.pool.HikariPool.access$300(HikariPool.java:70) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:612) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:598) + at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) + at java.base/java.lang.Thread.run(Thread.java:834) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + ... 35 more +Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7] + at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) + at org.h2.mvstore.FileStore.open(FileStore.java:166) + at org.h2.mvstore.MVStore.(MVStore.java:381) + ... 29 more +Caused by: java.nio.channels.OverlappingFileLockException + at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229) + at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123) + at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154) + at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121) + at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + ... 30 more +2022-01-10 12:23:48 database: flush +org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.get(DbException.java:194) + at org.h2.message.DbException.convert(DbException.java:347) + at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93) + at org.h2.mvstore.MVStore.handleException(MVStore.java:2877) + at org.h2.mvstore.MVStore.panic(MVStore.java:481) + at org.h2.mvstore.MVStore.(MVStore.java:402) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579) + at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170) + at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103) + at org.h2.engine.Database.getPageStore(Database.java:2659) + at org.h2.engine.Database.open(Database.java:675) + at org.h2.engine.Database.openDatabase(Database.java:307) + at org.h2.engine.Database.(Database.java:301) + at org.h2.engine.Engine.openSession(Engine.java:74) + at org.h2.engine.Engine.openSession(Engine.java:192) + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) + at org.h2.engine.Engine.createSession(Engine.java:166) + at org.h2.engine.Engine.createSession(Engine.java:29) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) + at org.h2.Driver.connect(Driver.java:69) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:112) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:118) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:428) + at com.zaxxer.hikari.pool.HikariPool.access$300(HikariPool.java:70) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:612) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:598) + at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) + at java.base/java.lang.Thread.run(Thread.java:834) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + ... 35 more +Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7] + at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) + at org.h2.mvstore.FileStore.open(FileStore.java:166) + at org.h2.mvstore.MVStore.(MVStore.java:381) + ... 29 more +Caused by: java.nio.channels.OverlappingFileLockException + at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229) + at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123) + at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154) + at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121) + at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + ... 30 more +2022-01-10 12:23:49 database: flush +org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.get(DbException.java:194) + at org.h2.message.DbException.convert(DbException.java:347) + at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93) + at org.h2.mvstore.MVStore.handleException(MVStore.java:2877) + at org.h2.mvstore.MVStore.panic(MVStore.java:481) + at org.h2.mvstore.MVStore.(MVStore.java:402) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579) + at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170) + at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103) + at org.h2.engine.Database.getPageStore(Database.java:2659) + at org.h2.engine.Database.open(Database.java:675) + at org.h2.engine.Database.openDatabase(Database.java:307) + at org.h2.engine.Database.(Database.java:301) + at org.h2.engine.Engine.openSession(Engine.java:74) + at org.h2.engine.Engine.openSession(Engine.java:192) + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) + at org.h2.engine.Engine.createSession(Engine.java:166) + at org.h2.engine.Engine.createSession(Engine.java:29) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) + at org.h2.Driver.connect(Driver.java:69) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:112) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:118) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:428) + at com.zaxxer.hikari.pool.HikariPool.access$300(HikariPool.java:70) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:612) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:598) + at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) + at java.base/java.lang.Thread.run(Thread.java:834) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + ... 35 more +Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7] + at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) + at org.h2.mvstore.FileStore.open(FileStore.java:166) + at org.h2.mvstore.MVStore.(MVStore.java:381) + ... 29 more +Caused by: java.nio.channels.OverlappingFileLockException + at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229) + at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123) + at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154) + at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121) + at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + ... 30 more +2022-01-10 12:23:49 database: flush +org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.get(DbException.java:194) + at org.h2.message.DbException.convert(DbException.java:347) + at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93) + at org.h2.mvstore.MVStore.handleException(MVStore.java:2877) + at org.h2.mvstore.MVStore.panic(MVStore.java:481) + at org.h2.mvstore.MVStore.(MVStore.java:402) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579) + at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170) + at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103) + at org.h2.engine.Database.getPageStore(Database.java:2659) + at org.h2.engine.Database.open(Database.java:675) + at org.h2.engine.Database.openDatabase(Database.java:307) + at org.h2.engine.Database.(Database.java:301) + at org.h2.engine.Engine.openSession(Engine.java:74) + at org.h2.engine.Engine.openSession(Engine.java:192) + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) + at org.h2.engine.Engine.createSession(Engine.java:166) + at org.h2.engine.Engine.createSession(Engine.java:29) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) + at org.h2.Driver.connect(Driver.java:69) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:112) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:118) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:428) + at com.zaxxer.hikari.pool.HikariPool.access$300(HikariPool.java:70) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:612) + at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:598) + at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) + at java.base/java.lang.Thread.run(Thread.java:834) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7]" [50000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:505) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) + ... 35 more +Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/seyed.jalal.hosseini/projects/nhsd/matchbox/database/h2.mv.db [1.4.200/7] + at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) + at org.h2.mvstore.FileStore.open(FileStore.java:166) + at org.h2.mvstore.MVStore.(MVStore.java:381) + ... 29 more +Caused by: java.nio.channels.OverlappingFileLockException + at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229) + at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123) + at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154) + at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121) + at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + ... 30 more diff --git a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java index c39955a..6ea0861 100644 --- a/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java +++ b/docker/Transformation-Engine/src/main/java/nhsd/fhir/converter/service/mapping/Transformer.java @@ -1,14 +1,44 @@ package nhsd.fhir.converter.service.mapping; import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.r4.context.IWorkerContext; +import org.hl7.fhir.r4.context.SimpleWorkerContext; +import org.hl7.fhir.r4.model.StructureMap; +import org.hl7.fhir.r4.utils.StructureMapUtilities; import org.springframework.stereotype.Component; +import java.io.IOException; +import java.io.InputStream; + @Component public class Transformer { + static private String medicationRequestStu3ToR4Fml; + private final StructureMap structureMap; + private final StructureMapUtilities structureMapUtilities; + + public Transformer() throws IOException { + IWorkerContext worker = new SimpleWorkerContext(); + structureMapUtilities = new StructureMapUtilities(worker); + structureMap = structureMapUtilities.parse(medicationRequestStu3ToR4Fml, "src"); + } + IBaseResource transform(IBaseResource resource) { org.hl7.fhir.r4.model.Resource source = (org.hl7.fhir.r4.model.Resource) resource; org.hl7.fhir.r4.model.Resource target = source.copy(); + structureMapUtilities.transform("source", source, structureMap, target); + return target; } + + static { +// InputStream is = Transformer.class.getClassLoader().getResourceAsStream("fml/MedicationRequest/STU3_to_R4.fml"); + InputStream is = Transformer.class.getClassLoader().getResourceAsStream("fml/MedicationRequest/extension.fml"); + try { + medicationRequestStu3ToR4Fml = new String(is.readAllBytes()); + } catch (IOException e) { + System.err.println("Can't load fml mapping file"); + } + + } } diff --git a/docker/Transformation-Engine/src/main/resources/application.properties b/docker/Transformation-Engine/src/main/resources/application.properties deleted file mode 100644 index 99802c6..0000000 --- a/docker/Transformation-Engine/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -server.port=9000 \ No newline at end of file diff --git a/docker/Transformation-Engine/src/main/resources/application.yml b/docker/Transformation-Engine/src/main/resources/application.yml new file mode 100644 index 0000000..bf6537e --- /dev/null +++ b/docker/Transformation-Engine/src/main/resources/application.yml @@ -0,0 +1,35 @@ +spring: + datasource: + url: 'jdbc:h2:file:./database/h2' + username: sa + password: null + driverClassName: org.h2.Driver + max-active: 15 + + # database connection pool size + hikari: + maximum-pool-size: 10 + flyway: + check-location: false + baselineOnMigrate: true + jpa: + properties: + hibernate.format_sql: false + hibernate.show_sql: false + # hibernate.dialect: org.hibernate.dialect.h2dialect + # hibernate.hbm2ddl.auto: update + # hibernate.jdbc.batch_size: 20 + # hibernate.cache.use_query_cache: false + # hibernate.cache.use_second_level_cache: false + # hibernate.cache.use_structured_entries: false + # hibernate.cache.use_minimal_puts: false + ### These settings will enable fulltext search with lucene + hibernate.search.enabled: true + # hibernate.search.backend.type: lucene + # hibernate.search.backend.analysis.configurer: ca.uhn.fhir.jpa.search.HapiLuceneAnalysisConfigurer + # hibernate.search.backend.directory.type: local-filesystem + # hibernate.search.backend.directory.root: target/lucenefiles + # hibernate.search.backend.lucene_version: lucene_current + batch: + job: + enabled: false diff --git a/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml b/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml index 65d639e..016df02 100644 --- a/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml +++ b/docker/Transformation-Engine/src/main/resources/fml/MedicationRequest/STU3_to_R4.fml @@ -1,13 +1,13 @@ map "http://hl7.org/fhir/StructureMap/DomainResource3to4" = "R3 to R4 Conversions for DomainResource" uses "http://hl7.org/fhir/3.0/StructureDefinition/DomainResource" alias DomainResourceR3 as source -uses "http://hl7.org/fhir/StructureDefinition/DomainResource" alias DomainResource as target +uses "http://hl7.org/fhir/4.0/StructureDefinition/DomainResource" alias DomainResource as target //imports "http://hl7.org/fhir/StructureMap/*3to4" -group DomainResource(source src : DomainResourceR3, target tgt : DomainResource) extends Resource <> { - src.text -> tgt.text; - src.contained -> tgt.contained; - src.extension -> tgt.extension; - src.modifierExtension -> tgt.modifierExtension; +group DomainResource(source src : DomainResourceR3, target tgt : DomainResource) { + src.status -> tgt.status; + //src.contained -> tgt.contained; + //src.extension -> tgt.extension; + //src.modifierExtension -> tgt.modifierExtension; } diff --git a/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json b/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json index ae3bb0d..32f38c8 100644 --- a/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json +++ b/docker/Transformation-Engine/src/test/resources/GPConnect/MedicationRequest_GPConnect.json @@ -1,6 +1,7 @@ { "resourceType": "MedicationRequest", "id": "20", + "text": "text to test", "meta": { "profile": [ "https://fhir.nhs.uk/STU3/StructureDefinition/CareConnect-GPC-MedicationRequest-1"