diff --git a/pom.xml b/pom.xml index 2d2956e..abc2273 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ de.medizininformatik-initiative mii-process-report - 1.1.3.0-SNAPSHOT + 1.2.0.0-SNAPSHOT UTF-8 @@ -45,7 +45,7 @@ de.medizininformatik-initiative mii-processes-common - 1.0.3.0 + 1.1.0.0-SNAPSHOT org.springframework diff --git a/src/main/java/de/medizininformatik_initiative/process/report/ConstantsReport.java b/src/main/java/de/medizininformatik_initiative/process/report/ConstantsReport.java index 857e272..ab4d3e5 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/ConstantsReport.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/ConstantsReport.java @@ -41,15 +41,15 @@ public interface ConstantsReport String BPMN_EXECUTION_VARIABLE_REPORT_SEARCH_BUNDLE_RESPONSE_REFERENCE = "reportSearchBundleResponseReference"; String BPMN_EXECUTION_VARIABLE_REPORT_RECEIVE_ERROR = "reportReceiveError"; String BPMN_EXECUTION_VARIABLE_REPORT_RECEIVE_ERROR_MESSAGE = "reportReceiveErrorMessage"; + String BPMN_EXECUTION_VARIABLE_IS_DRY_RUN = "isDryRun"; String CODESYSTEM_REPORT = "http://medizininformatik-initiative.de/fhir/CodeSystem/report"; - - String CODESYSTEM_REPORT_VALUE_SEARCH_BUNDLE = "search-bundle-v"; String CODESYSTEM_REPORT_VALUE_SEARCH_BUNDLE_RESPONSE_REFERENCE = "search-bundle-response-reference"; String CODESYSTEM_REPORT_VALUE_REPORT_STATUS = "report-status"; String CODESYSTEM_REPORT_VALUE_TIMER_INTERVAL = "timer-interval"; String CODESYSTEM_REPORT_VALUE_FIRST_EXECUTION = "first-execution"; String CODESYSTEM_REPORT_VALUE_HRP_IDENTIFIER = "hrp-identifier"; + String CODESYSTEM_REPORT_VALUE_DRY_RUN = "dry-run"; String CODESYSTEM_REPORT_STATUS = "http://medizininformatik-initiative.de/fhir/CodeSystem/report-status"; String CODESYSTEM_REPORT_STATUS_VALUE_NOT_ALLOWED = "not-allowed"; @@ -59,8 +59,11 @@ public interface ConstantsReport String CODESYSTEM_REPORT_STATUS_VALUE_RECEIPT_ERROR = "receipt-error"; String CODESYSTEM_REPORT_STATUS_VALUE_RECEIVE_OK = "receive-ok"; String CODESYSTEM_REPORT_STATUS_VALUE_RECEIVE_ERROR = "receive-error"; + String CODESYSTEM_REPORT_STATUS_VALUE_DRY_RUN = "dry-run"; String NAMINGSYSTEM_CDS_REPORT_IDENTIFIER = "http://medizininformatik-initiative.de/sid/cds-report-identifier"; + String NAMINGSYSTEM_SEARCH_BUNDLE_IDENTIFIER = "http://medizininformatik-initiative.de/sid/search-bundle-identifier"; + String NAMINGSYSTEM_SEARCH_BUNDLE_IDENTIFIER_VALUE_PREFIX = "search-bundle-v"; String PROFILE_REPORT_SEARCH_BUNDLE_RESPONSE = "http://medizininformatik-initiative.de/fhir/Bundle/search-bundle-response-report"; String EXTENSION_REPORT_STATUS_ERROR_URL = "http://medizininformatik-initiative.de/fhir/StructureDefinition/extension-report-status-error"; diff --git a/src/main/java/de/medizininformatik_initiative/process/report/ReportProcessPluginDefinition.java b/src/main/java/de/medizininformatik_initiative/process/report/ReportProcessPluginDefinition.java index b36f053..76e5198 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/ReportProcessPluginDefinition.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/ReportProcessPluginDefinition.java @@ -10,7 +10,7 @@ public class ReportProcessPluginDefinition implements ProcessPluginDefinition { - public static final String VERSION = "1.1.3.0"; + public static final String VERSION = "1.2.0.0"; public static final LocalDate RELEASE_DATE = LocalDate.of(2024, 11, 10); @Override @@ -55,6 +55,7 @@ public Map> getFhirResourcesByProcessId() var eReportStatusError = "fhir/StructureDefinition/extension-report-status-error.xml"; var nReportIdent = "fhir/NamingSystem/cds-report-identifier.xml"; + var nSearchBundleIdent = "fhir/NamingSystem/search-bundle-identifier.xml"; var sAutostartStart = "fhir/StructureDefinition/task-report-autostart-start.xml"; var sAutostartStop = "fhir/StructureDefinition/task-report-autostart-stop.xml"; @@ -75,10 +76,10 @@ public Map> getFhirResourcesByProcessId() return Map.of(ConstantsReport.PROCESS_NAME_FULL_REPORT_AUTOSTART, List.of(aAutostart, cReport, sAutostartStart, sAutostartStop, tAutostartStart, tAutostartStop, vReport), ConstantsReport.PROCESS_NAME_FULL_REPORT_RECEIVE, - List.of(aReceive, cReport, cReportStatus, eReportStatusError, nReportIdent, sSearchBundle, - sSearchBundleResponse, sSend, vReport, vReportStatusReceive), + List.of(aReceive, cReport, cReportStatus, eReportStatusError, nReportIdent, nSearchBundleIdent, + sSearchBundle, sSearchBundleResponse, sSend, vReport, vReportStatusReceive), ConstantsReport.PROCESS_NAME_FULL_REPORT_SEND, - List.of(aSend, cReport, cReportStatus, eReportStatusError, nReportIdent, sReceive, sSearchBundle, - sSearchBundleResponse, sSendStart, tSendStart, vReport, vReportStatusSend)); + List.of(aSend, cReport, cReportStatus, eReportStatusError, nReportIdent, nSearchBundleIdent, sReceive, + sSearchBundle, sSearchBundleResponse, sSendStart, tSendStart, vReport, vReportStatusSend)); } } diff --git a/src/main/java/de/medizininformatik_initiative/process/report/service/CreateReport.java b/src/main/java/de/medizininformatik_initiative/process/report/service/CreateReport.java index ac5f025..83a609b 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/service/CreateReport.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/service/CreateReport.java @@ -39,15 +39,17 @@ public class CreateReport extends AbstractServiceDelegate implements Initializin private final String resourceVersion; private final FhirClientFactory fhirClientFactory; + private final boolean fhirAsyncRequestsEnabled; private final DataLogger dataLogger; public CreateReport(ProcessPluginApi api, String resourceVersion, FhirClientFactory fhirClientFactory, - DataLogger dataLogger) + boolean fhirAsyncRequestsEnabled, DataLogger dataLogger) { super(api); this.resourceVersion = resourceVersion; this.fhirClientFactory = fhirClientFactory; + this.fhirAsyncRequestsEnabled = fhirAsyncRequestsEnabled; this.dataLogger = dataLogger; } @@ -67,12 +69,13 @@ protected void doExecute(DelegateExecution execution, Variables variables) Task task = variables.getStartTask(); Bundle searchBundle = variables.getResource(ConstantsReport.BPMN_EXECUTION_VARIABLE_REPORT_SEARCH_BUNDLE); Target target = variables.getTarget(); + boolean isDryRun = variables.getBoolean(ConstantsReport.BPMN_EXECUTION_VARIABLE_IS_DRY_RUN); try { Bundle responseBundle = executeSearchBundle(searchBundle, target.getOrganizationIdentifierValue()); - Bundle reportBundle = transformToReportBundle(searchBundle, responseBundle, target); + Bundle reportBundle = transformToReportBundle(searchBundle, responseBundle, target, isDryRun); dataLogger.logResource("Report Bundle", reportBundle); checkReportBundle(searchBundle, reportBundle, target.getOrganizationIdentifierValue()); @@ -94,8 +97,8 @@ protected void doExecute(DelegateExecution execution, Variables variables) private Bundle executeSearchBundle(Bundle searchBundle, String hrpIdentifier) { logger.info( - "Executing search Bundle from HRP '{}' against FHIR store with base url '{}' - this could take a while...", - hrpIdentifier, fhirClientFactory.getFhirClient().getFhirBaseUrl()); + "Executing search Bundle from HRP '{}' against FHIR store with base URL '{}' - this could take a while...", + hrpIdentifier, fhirClientFactory.getFhirBaseUrl()); Bundle responseBundle = new Bundle(); responseBundle.setType(Bundle.BundleType.BATCHRESPONSE); @@ -115,9 +118,10 @@ private Bundle.BundleEntryComponent executeRequest(String url) try { - logger.debug("Executing report search request '{}'", url); + logger.debug("Executing report search request '{}' with {}", url, + fhirAsyncRequestsEnabled ? "asnyc request pattern" : "normal request pattern"); + Resource result = doExecuteRequest(url); - Resource result = fhirClientFactory.getFhirClient().search(url); entry.setResource(result); entry.setResponse(new Bundle.BundleEntryResponseComponent().setStatus(RESPONSE_OK)); } @@ -137,7 +141,15 @@ private Bundle.BundleEntryComponent executeRequest(String url) return entry; } - private Bundle transformToReportBundle(Bundle searchBundle, Bundle responseBundle, Target target) + private Resource doExecuteRequest(String url) + { + if (fhirAsyncRequestsEnabled) + return fhirClientFactory.getAsyncFhirClient().search(url); + else + return fhirClientFactory.getStandardFhirClient().search(url); + } + + private Bundle transformToReportBundle(Bundle searchBundle, Bundle responseBundle, Target target, boolean isDryRun) { Bundle report = new Bundle(); report.setMeta(responseBundle.getMeta()); @@ -150,7 +162,8 @@ private Bundle transformToReportBundle(Bundle searchBundle, Bundle responseBundl .orElseThrow(() -> new RuntimeException("LocalOrganizationIdentifierValue empty")))); api.getReadAccessHelper().addLocal(report); - api.getReadAccessHelper().addOrganization(report, target.getOrganizationIdentifierValue()); + if (!isDryRun) + api.getReadAccessHelper().addOrganization(report, target.getOrganizationIdentifierValue()); for (int i = 0; i < searchBundle.getEntry().size(); i++) { diff --git a/src/main/java/de/medizininformatik_initiative/process/report/service/DownloadSearchBundle.java b/src/main/java/de/medizininformatik_initiative/process/report/service/DownloadSearchBundle.java index 28ac968..991974d 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/service/DownloadSearchBundle.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/service/DownloadSearchBundle.java @@ -57,8 +57,8 @@ protected void doExecute(DelegateExecution execution, Variables variables) { Task task = variables.getStartTask(); Target target = variables.getTarget(); - String searchBundleIdentifier = ConstantsReport.CODESYSTEM_REPORT + "|" - + ConstantsReport.CODESYSTEM_REPORT_VALUE_SEARCH_BUNDLE + processVersion; + String searchBundleIdentifier = ConstantsReport.NAMINGSYSTEM_SEARCH_BUNDLE_IDENTIFIER + "|" + + ConstantsReport.NAMINGSYSTEM_SEARCH_BUNDLE_IDENTIFIER_VALUE_PREFIX + processVersion; logger.info("Downloading search Bundle '{}' from HRP '{}' for Task with id '{}'", searchBundleIdentifier, target.getOrganizationIdentifierValue(), task.getId()); diff --git a/src/main/java/de/medizininformatik_initiative/process/report/service/LogDryRun.java b/src/main/java/de/medizininformatik_initiative/process/report/service/LogDryRun.java new file mode 100644 index 0000000..76700ec --- /dev/null +++ b/src/main/java/de/medizininformatik_initiative/process/report/service/LogDryRun.java @@ -0,0 +1,69 @@ +package de.medizininformatik_initiative.process.report.service; + +import java.util.Objects; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.hl7.fhir.r4.model.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; + +import de.medizininformatik_initiative.process.report.ConstantsReport; +import de.medizininformatik_initiative.process.report.util.ReportStatusGenerator; +import dev.dsf.bpe.v1.ProcessPluginApi; +import dev.dsf.bpe.v1.activity.AbstractServiceDelegate; +import dev.dsf.bpe.v1.variables.Variables; + +public class LogDryRun extends AbstractServiceDelegate implements InitializingBean +{ + private static final Logger logger = LoggerFactory.getLogger(LogDryRun.class); + + private final ReportStatusGenerator statusGenerator; + + public LogDryRun(ProcessPluginApi api, ReportStatusGenerator statusGenerator) + { + super(api); + this.statusGenerator = statusGenerator; + } + + @Override + public void afterPropertiesSet() throws Exception + { + super.afterPropertiesSet(); + Objects.requireNonNull(statusGenerator, "statusGenerator"); + } + + @Override + protected void doExecute(DelegateExecution delegateExecution, Variables variables) + { + String recipient = variables.getTarget().getOrganizationIdentifierValue(); + String reportLocation = variables + .getString(ConstantsReport.BPMN_EXECUTION_VARIABLE_REPORT_SEARCH_BUNDLE_RESPONSE_REFERENCE); + + logger.info("Report dry-run successful for HRP '{}' at '{}' and task with id '{}'", recipient, reportLocation, + variables.getStartTask().getId()); + sendSuccessfulMail(recipient, reportLocation); + + addOutputToStartTask(variables); + } + + private void sendSuccessfulMail(String recipient, String reportLocation) + { + String subject = "New successful dry-run report in process '" + ConstantsReport.PROCESS_NAME_FULL_REPORT_SEND + + "'"; + String message = "A new report has been successfully created as dry-run for HRP '" + recipient + + "' in process '" + ConstantsReport.PROCESS_NAME_FULL_REPORT_SEND + + "' and can be accessed using the following link:\n" + "- " + reportLocation; + + api.getMailService().send(subject, message); + } + + private void addOutputToStartTask(Variables variables) + { + Task task = variables.getStartTask(); + task.addOutput( + statusGenerator.createReportStatusOutput(ConstantsReport.CODESYSTEM_REPORT_STATUS_VALUE_DRY_RUN)); + + variables.updateTask(task); + } +} diff --git a/src/main/java/de/medizininformatik_initiative/process/report/service/SelectTargetHrp.java b/src/main/java/de/medizininformatik_initiative/process/report/service/SelectTargetHrp.java index c5d3ef8..9cc40dd 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/service/SelectTargetHrp.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/service/SelectTargetHrp.java @@ -5,6 +5,7 @@ import java.util.function.Supplier; import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.hl7.fhir.r4.model.BooleanType; import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Endpoint; import org.hl7.fhir.r4.model.Identifier; @@ -56,6 +57,12 @@ protected void doExecute(DelegateExecution execution, Variables variables) Target target = variables.createTarget(hrpIdentifier, endpointIdentifier, endpoint.getAddress()); variables.setTarget(target); + + boolean isDryRun = isDryRun(variables); + if (isDryRun) + logger.info("Creating new report as dry-run for HRP '{}'", hrpIdentifier); + + variables.setBoolean(ConstantsReport.BPMN_EXECUTION_VARIABLE_IS_DRY_RUN, isDryRun); } private Optional extractHrpIdentifierFromTask(Task task) @@ -136,4 +143,13 @@ private String extractEndpointIdentifier(Endpoint endpoint) .orElseThrow(() -> new RuntimeException("Endpoint with id '" + endpoint.getId() + "' is missing identifier with system '" + NamingSystems.EndpointIdentifier.SID + "'")); } + + private boolean isDryRun(Variables variables) + { + return api.getTaskHelper() + .getFirstInputParameterValue(variables.getStartTask(), ConstantsReport.CODESYSTEM_REPORT, + ConstantsReport.CODESYSTEM_REPORT_VALUE_DRY_RUN, BooleanType.class) + .map(BooleanType::booleanValue).orElse(false); + } + } diff --git a/src/main/java/de/medizininformatik_initiative/process/report/spring/config/FhirClientConfig.java b/src/main/java/de/medizininformatik_initiative/process/report/spring/config/FhirClientConfig.java index 2d9d03f..8e2b2d4 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/spring/config/FhirClientConfig.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/spring/config/FhirClientConfig.java @@ -152,6 +152,11 @@ public class FhirClientConfig @Value("${de.medizininformatik.initiative.report.dic.fhir.dataLoggingEnabled:false}") private boolean fhirDataLoggingEnabled; + @ProcessDocumentation(processNames = { + "medizininformatik-initiativede_reportSend" }, description = "Initial Result polling interval in milliseconds for asynchronous request pattern when executing search bundle requests, the interval will be increased tenfold after every check if a result is not ready") + @Value("${de.medizininformatik.initiative.report.dic.fhir.server.async.polling.interval:100}") + private int fhirAsyncInitialPollingIntervalMilliseconds; + @Value("${dev.dsf.bpe.fhir.server.organization.identifier.value}") private String localIdentifierValue; @@ -175,7 +180,8 @@ public FhirClientFactory fhirClientFactory() return new FhirClientFactory(trustStorePath, certificatePath, privateKeyPath, fhirStorePrivateKeyPassword, fhirStoreConnectTimeout, fhirStoreSocketTimeout, fhirStoreConnectionRequestTimeout, fhirStoreBaseUrl, fhirStoreUsername, fhirStorePassword, fhirStoreBearerToken, tokenProvider(), proxyUrl, proxyUsername, - proxyPassword, fhirStoreHapiClientVerbose, fhirContext, localIdentifierValue, dataLogger()); + proxyPassword, fhirStoreHapiClientVerbose, fhirAsyncInitialPollingIntervalMilliseconds, fhirContext, + localIdentifierValue, dataLogger()); } public TokenProvider tokenProvider() diff --git a/src/main/java/de/medizininformatik_initiative/process/report/spring/config/ReportConfig.java b/src/main/java/de/medizininformatik_initiative/process/report/spring/config/ReportConfig.java index ce4e997..b0973ca 100644 --- a/src/main/java/de/medizininformatik_initiative/process/report/spring/config/ReportConfig.java +++ b/src/main/java/de/medizininformatik_initiative/process/report/spring/config/ReportConfig.java @@ -18,6 +18,7 @@ import de.medizininformatik_initiative.process.report.service.DownloadSearchBundle; import de.medizininformatik_initiative.process.report.service.HandleError; import de.medizininformatik_initiative.process.report.service.InsertReport; +import de.medizininformatik_initiative.process.report.service.LogDryRun; import de.medizininformatik_initiative.process.report.service.SelectTargetDic; import de.medizininformatik_initiative.process.report.service.SelectTargetHrp; import de.medizininformatik_initiative.process.report.service.SetTimer; @@ -42,6 +43,11 @@ public class ReportConfig @Value("${de.medizininformatik.initiative.report.dic.hrp.identifier:#{null}}") private String hrpIdentifier; + @ProcessDocumentation(processNames = { + "medizininformatik-initiativede_reportSend" }, description = "To enable asynchronous request pattern when executing search bundle requests set to `true`") + @Value("${de.medizininformatik.initiative.report.dic.fhir.server.async.enabled:false}") + private boolean fhirAsyncEnabled; + // all Processes @Bean @@ -110,10 +116,17 @@ public SearchQueryCheckService searchQueryCheckService() public CreateReport createReport() { String resourceVersion = new ReportProcessPluginDefinition().getResourceVersion(); - return new CreateReport(api, resourceVersion, fhirClientConfig.fhirClientFactory(), + return new CreateReport(api, resourceVersion, fhirClientConfig.fhirClientFactory(), fhirAsyncEnabled, fhirClientConfig.dataLogger()); } + @Bean + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public LogDryRun logDryRun() + { + return new LogDryRun(api, reportStatusGenerator()); + } + @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public SendReport sendReport() diff --git a/src/main/resources/bpe/report-send.bpmn b/src/main/resources/bpe/report-send.bpmn index c52a67b..234d299 100644 --- a/src/main/resources/bpe/report-send.bpmn +++ b/src/main/resources/bpe/report-send.bpmn @@ -1,5 +1,5 @@ - + Flow_0jtrquu @@ -17,14 +17,14 @@ Flow_0lez18n Flow_0d1hhpd - + Flow_1bwmt5h Flow_0gkokuw - Flow_0gkokuw + Flow_0l1jgoh Flow_0hq9yqb @@ -80,113 +80,154 @@ + + Flow_0gkokuw + Flow_0l1jgoh + Flow_0ix00o6 + + + ${!isDryRun} + + + Flow_191va5p + + + ${isDryRun} + + + + Flow_0ix00o6 + Flow_191va5p + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/fhir/CodeSystem/report-status.xml b/src/main/resources/fhir/CodeSystem/report-status.xml index aa76fe2..5d9000a 100644 --- a/src/main/resources/fhir/CodeSystem/report-status.xml +++ b/src/main/resources/fhir/CodeSystem/report-status.xml @@ -56,4 +56,9 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/fhir/CodeSystem/report.xml b/src/main/resources/fhir/CodeSystem/report.xml index c4942ff..507dad3 100644 --- a/src/main/resources/fhir/CodeSystem/report.xml +++ b/src/main/resources/fhir/CodeSystem/report.xml @@ -26,11 +26,6 @@ - - - - - @@ -51,4 +46,9 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/fhir/NamingSystem/search-bundle-identifier.xml b/src/main/resources/fhir/NamingSystem/search-bundle-identifier.xml new file mode 100644 index 0000000..b216b35 --- /dev/null +++ b/src/main/resources/fhir/NamingSystem/search-bundle-identifier.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/fhir/StructureDefinition/search-bundle-report.xml b/src/main/resources/fhir/StructureDefinition/search-bundle-report.xml index f9bf423..265b76b 100644 --- a/src/main/resources/fhir/StructureDefinition/search-bundle-report.xml +++ b/src/main/resources/fhir/StructureDefinition/search-bundle-report.xml @@ -28,7 +28,7 @@ - + diff --git a/src/main/resources/fhir/StructureDefinition/task-report-send-start.xml b/src/main/resources/fhir/StructureDefinition/task-report-send-start.xml index ef2710b..3270eb0 100644 --- a/src/main/resources/fhir/StructureDefinition/task-report-send-start.xml +++ b/src/main/resources/fhir/StructureDefinition/task-report-send-start.xml @@ -28,7 +28,7 @@ - + @@ -48,6 +48,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/fhir/Task/task-report-send-start.xml b/src/main/resources/fhir/Task/task-report-send-start.xml index a5347a3..8ef1957 100644 --- a/src/main/resources/fhir/Task/task-report-send-start.xml +++ b/src/main/resources/fhir/Task/task-report-send-start.xml @@ -50,4 +50,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/fhir/ValueSet/report-status-send.xml b/src/main/resources/fhir/ValueSet/report-status-send.xml index 46252db..e3dfdae 100644 --- a/src/main/resources/fhir/ValueSet/report-status-send.xml +++ b/src/main/resources/fhir/ValueSet/report-status-send.xml @@ -42,6 +42,10 @@ + + + + \ No newline at end of file diff --git a/src/test/java/de/medizininformatik_initiative/process/report/bpe/ReportProcessPluginDefinitionTest.java b/src/test/java/de/medizininformatik_initiative/process/report/bpe/ReportProcessPluginDefinitionTest.java index eebf4ed..6c9f60f 100644 --- a/src/test/java/de/medizininformatik_initiative/process/report/bpe/ReportProcessPluginDefinitionTest.java +++ b/src/test/java/de/medizininformatik_initiative/process/report/bpe/ReportProcessPluginDefinitionTest.java @@ -26,11 +26,11 @@ public void testResourceLoading() var reportReceive = resourcesByProcessId.get(ConstantsReport.PROCESS_NAME_FULL_REPORT_RECEIVE); assertNotNull(reportReceive); - assertEquals(10, reportReceive.stream().filter(this::exists).count()); + assertEquals(11, reportReceive.stream().filter(this::exists).count()); var reportSend = resourcesByProcessId.get(ConstantsReport.PROCESS_NAME_FULL_REPORT_SEND); assertNotNull(reportSend); - assertEquals(12, reportSend.stream().filter(this::exists).count()); + assertEquals(13, reportSend.stream().filter(this::exists).count()); } private boolean exists(String file) diff --git a/src/test/java/de/medizininformatik_initiative/process/report/bpe/SearchBundleCheckServiceTest.java b/src/test/java/de/medizininformatik_initiative/process/report/bpe/SearchBundleCheckServiceTest.java index f0db77b..2b8ae1f 100644 --- a/src/test/java/de/medizininformatik_initiative/process/report/bpe/SearchBundleCheckServiceTest.java +++ b/src/test/java/de/medizininformatik_initiative/process/report/bpe/SearchBundleCheckServiceTest.java @@ -16,7 +16,13 @@ public class SearchBundleCheckServiceTest @Test public void testValid() { - testValid("/fhir/Bundle/search-bundle.xml"); + testValid("/fhir/Bundle/search-bundle-valid.xml"); + } + + @Test + public void testValidEncounterType() + { + testValid("/fhir/Bundle/search-bundle-valid-encounter-type.xml"); } @Test @@ -98,33 +104,21 @@ public void testInvalidDoubleDateValue() } @Test - public void testValidV1_1() - { - testValid("/fhir/Bundle/search-bundle-v1.1.xml"); - } - - @Test - public void testValidV1_1EncounterType() - { - testValid("/fhir/Bundle/search-bundle-v1.1-valid-encounter-type.xml"); - } - - @Test - public void testInvalidV1_1SingleCode() + public void testInvalidSingleCode() { - testInvalid("/fhir/Bundle/search-bundle-v1.1-invalid-code-single.xml", "not limited to system"); + testInvalid("/fhir/Bundle/search-bundle-invalid-code-single.xml", "not limited to system"); } @Test - public void testInvalidV1_1DoubleCode() + public void testInvalidDoubleCode() { - testInvalid("/fhir/Bundle/search-bundle-v1.1-invalid-code-double.xml", "not limited to system"); + testInvalid("/fhir/Bundle/search-bundle-invalid-code-double.xml", "not limited to system"); } @Test - public void testInvalidV1_1CodeIngredient() + public void testInvalidCodeIngredient() { - testInvalid("/fhir/Bundle/search-bundle-v1.1-invalid-code-ingredient.xml", "not limited to system"); + testInvalid("/fhir/Bundle/search-bundle-invalid-code-ingredient.xml", "not limited to system"); } private void testValid(String pathToBundle) diff --git a/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/SearchBundleProfileTest.java b/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/SearchBundleProfileTest.java new file mode 100644 index 0000000..78ff3f0 --- /dev/null +++ b/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/SearchBundleProfileTest.java @@ -0,0 +1,71 @@ +package de.medizininformatik_initiative.process.report.fhir.profile; + +import static org.junit.Assert.assertEquals; + +import java.io.InputStream; +import java.util.List; + +import org.hl7.fhir.r4.model.Bundle; +import org.junit.ClassRule; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.validation.ResultSeverityEnum; +import ca.uhn.fhir.validation.ValidationResult; +import de.medizininformatik_initiative.process.report.ReportProcessPluginDefinition; +import dev.dsf.fhir.validation.ResourceValidator; +import dev.dsf.fhir.validation.ResourceValidatorImpl; +import dev.dsf.fhir.validation.ValidationSupportRule; + +public class SearchBundleProfileTest +{ + private static final Logger logger = LoggerFactory.getLogger(TaskProfileTest.class); + private static final ReportProcessPluginDefinition def = new ReportProcessPluginDefinition(); + + @ClassRule + public static final ValidationSupportRule validationRule = new ValidationSupportRule(def.getResourceVersion(), + def.getResourceReleaseDate(), List.of("search-bundle-report.xml", "search-bundle-response-report.xml"), + List.of("report.xml", "report-status.xml"), + List.of("report.xml", "report-status-receive.xml", "report-status-send.xml")); + + private final ResourceValidator resourceValidator = new ResourceValidatorImpl(validationRule.getFhirContext(), + validationRule.getValidationSupport()); + + @Test + public void testSearchBundleProfileValid() + { + Bundle bundle = readBundle("/fhir/Bundle/search-bundle-valid.xml"); + + ValidationResult result = resourceValidator.validate(bundle); + ValidationSupportRule.logValidationMessages(logger, result); + + assertEquals(0, result.getMessages().stream().filter(m -> ResultSeverityEnum.ERROR.equals(m.getSeverity()) + || ResultSeverityEnum.FATAL.equals(m.getSeverity())).count()); + } + + @Test + public void testSearchBundleResponseProfileValid() + { + Bundle bundle = readBundle("/fhir/Bundle/search-bundle-response-valid.xml"); + + ValidationResult result = resourceValidator.validate(bundle); + ValidationSupportRule.logValidationMessages(logger, result); + + assertEquals(0, result.getMessages().stream().filter(m -> ResultSeverityEnum.ERROR.equals(m.getSeverity()) + || ResultSeverityEnum.FATAL.equals(m.getSeverity())).count()); + } + + private Bundle readBundle(String path) + { + try (InputStream in = getClass().getResourceAsStream(path)) + { + return FhirContext.forR4().newXmlParser().parseResource(Bundle.class, in); + } + catch (Exception exception) + { + throw new RuntimeException("Reading bundle from path '" + path + "' failed", exception); + } + } +} diff --git a/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/TaskProfileTest.java b/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/TaskProfileTest.java index 6777269..bed327f 100644 --- a/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/TaskProfileTest.java +++ b/src/test/java/de/medizininformatik_initiative/process/report/fhir/profile/TaskProfileTest.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.UUID; +import org.hl7.fhir.r4.model.BooleanType; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ResourceType; import org.hl7.fhir.r4.model.StringType; @@ -171,6 +172,22 @@ public void testTaskSendStartProcessProfileValid() || ResultSeverityEnum.FATAL.equals(m.getSeverity())).count()); } + @Test + public void testTaskSendStartProcessProfileValidAsDryRun() + { + Task task = createValidTaskSendStartProcess(); + task.addInput().setValue(new BooleanType(true)).getType().addCoding() + .setSystem(ConstantsReport.CODESYSTEM_REPORT).setCode(ConstantsReport.CODESYSTEM_REPORT_VALUE_DRY_RUN); + task.addOutput(new ReportStatusGenerator() + .createReportStatusOutput(ConstantsReport.CODESYSTEM_REPORT_STATUS_VALUE_DRY_RUN)); + + ValidationResult result = resourceValidator.validate(task); + ValidationSupportRule.logValidationMessages(logger, result); + + assertEquals(0, result.getMessages().stream().filter(m -> ResultSeverityEnum.ERROR.equals(m.getSeverity()) + || ResultSeverityEnum.FATAL.equals(m.getSeverity())).count()); + } + @Test public void testTaskSendStartProcessProfileValidWithHrpIdentifier() { diff --git a/src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-double.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-code-double.xml similarity index 91% rename from src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-double.xml rename to src/test/resources/fhir/Bundle/search-bundle-invalid-code-double.xml index 2fa87a0..59749d5 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-double.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-code-double.xml @@ -9,7 +9,7 @@ - + diff --git a/src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-ingredient.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-code-ingredient.xml similarity index 91% rename from src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-ingredient.xml rename to src/test/resources/fhir/Bundle/search-bundle-invalid-code-ingredient.xml index b397030..577d939 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-ingredient.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-code-ingredient.xml @@ -9,7 +9,7 @@ - + diff --git a/src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-single.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-code-single.xml similarity index 91% rename from src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-single.xml rename to src/test/resources/fhir/Bundle/search-bundle-invalid-code-single.xml index a60fc43..f325ac5 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-v1.1-invalid-code-single.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-code-single.xml @@ -9,7 +9,7 @@ - + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-date-filter.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-date-filter.xml index a807cf7..9536ada 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-date-filter.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-date-filter.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-double.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-double.xml index a11867d..ebeed75 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-double.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-double.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-single.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-single.xml index 048bb51..4836873 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-single.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-date-value-single.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-param.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-param.xml index 2a5544d..5fd8014 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-param.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-param.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-request-method.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-request-method.xml index 34aef0c..12cf4bf 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-request-method.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-request-method.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id-double.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id-double.xml index fe17040..0d1f308 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id-double.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id-double.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id.xml index 785249c..e8766ae 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-resource-id.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-resource.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-resource.xml index ad33050..dc31662 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-resource.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-resource.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-double.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-double.xml index 33ec49b..8d43073 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-double.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-double.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-allowed.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-allowed.xml index df0cdc9..67781e3 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-allowed.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-allowed.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-exists.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-exists.xml index b4385c6..6f8d513 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-exists.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-not-exists.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded-full.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded-full.xml index 1605b03..ea73294 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded-full.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded-full.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded.xml b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded.xml index 74e6908..98b8fe1 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-invalid-summary-url-encoded.xml @@ -10,8 +10,8 @@ - - + + diff --git a/src/test/resources/fhir/Bundle/search-bundle-response.xml b/src/test/resources/fhir/Bundle/search-bundle-response-valid.xml similarity index 99% rename from src/test/resources/fhir/Bundle/search-bundle-response.xml rename to src/test/resources/fhir/Bundle/search-bundle-response-valid.xml index 6c0413b..31ac6ca 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-response.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-response-valid.xml @@ -2,7 +2,7 @@ - + diff --git a/src/test/resources/fhir/Bundle/search-bundle-v1.1.xml b/src/test/resources/fhir/Bundle/search-bundle-v1.1.xml index adf8b27..94cd1e2 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-v1.1.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-v1.1.xml @@ -9,7 +9,7 @@ - + diff --git a/src/test/resources/fhir/Bundle/search-bundle-v1.2.xml b/src/test/resources/fhir/Bundle/search-bundle-v1.2.xml new file mode 100644 index 0000000..4d53649 --- /dev/null +++ b/src/test/resources/fhir/Bundle/search-bundle-v1.2.xml @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/fhir/Bundle/search-bundle-v1.1-valid-encounter-type.xml b/src/test/resources/fhir/Bundle/search-bundle-valid-encounter-type.xml similarity index 94% rename from src/test/resources/fhir/Bundle/search-bundle-v1.1-valid-encounter-type.xml rename to src/test/resources/fhir/Bundle/search-bundle-valid-encounter-type.xml index 55f166f..2295f0a 100644 --- a/src/test/resources/fhir/Bundle/search-bundle-v1.1-valid-encounter-type.xml +++ b/src/test/resources/fhir/Bundle/search-bundle-valid-encounter-type.xml @@ -9,7 +9,7 @@ - + diff --git a/src/test/resources/fhir/Bundle/search-bundle-valid.xml b/src/test/resources/fhir/Bundle/search-bundle-valid.xml new file mode 100644 index 0000000..7a02a7a --- /dev/null +++ b/src/test/resources/fhir/Bundle/search-bundle-valid.xml @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/fhir/Bundle/search-bundle.xml b/src/test/resources/fhir/Bundle/search-bundle.xml deleted file mode 100644 index b2b6cc0..0000000 --- a/src/test/resources/fhir/Bundle/search-bundle.xml +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file