diff --git a/common/pom.xml b/common/pom.xml index fcd679a43f6f3f22d5469f1d2ee94955056d14a7..665d5c50dd4658fb69110588bc17c56581cea0c7 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -31,7 +31,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> <artifactId>common</artifactId> diff --git a/formcycle-adapter/formcycle-adapter-impl/pom.xml b/formcycle-adapter/formcycle-adapter-impl/pom.xml index 7e68ae9cccba4b10f15ff830ecdd33dcb930dafc..3780ceaf98ab22897aca467c2ad90c48ca558eb1 100644 --- a/formcycle-adapter/formcycle-adapter-impl/pom.xml +++ b/formcycle-adapter/formcycle-adapter-impl/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>formcycle-adapter</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>formcycle-adapter-impl</artifactId> diff --git a/formcycle-adapter/formcycle-adapter-interface/pom.xml b/formcycle-adapter/formcycle-adapter-interface/pom.xml index 36ade3e01d8e457467ed1fc68958f57cd540d749..b321e925d70826fdf74b323818b84fd7a19302f5 100644 --- a/formcycle-adapter/formcycle-adapter-interface/pom.xml +++ b/formcycle-adapter/formcycle-adapter-interface/pom.xml @@ -29,14 +29,14 @@ <parent> <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-dependencies</artifactId> - <version>2.0.0</version> + <version>2.0.1</version> <relativePath /> </parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>formcycle-adapter-interface</artifactId> <name>EM - Formcycle Adapter - Interface</name> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <properties> <pluto.version>1.8.0</pluto.version> diff --git a/formcycle-adapter/pom.xml b/formcycle-adapter/pom.xml index 20c2643269b99ffa21a29282f5a44b43cfea399b..ceb0c3d5e13c4e56e245ec00d2fce15c86024da7 100644 --- a/formcycle-adapter/pom.xml +++ b/formcycle-adapter/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>formcycle-adapter</artifactId> diff --git a/formsolutions-adapter/pom.xml b/formsolutions-adapter/pom.xml index 0894bf1973998a6f31cf849e59d4cb829a3e91ef..11a4d73879284fda10d3fcbae76926877d265e91 100644 --- a/formsolutions-adapter/pom.xml +++ b/formsolutions-adapter/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/forwarder/pom.xml b/forwarder/pom.xml index 8ef2b70a80f7a64ab7374b2245b6a40381d8d629..e631f9c970c1aa365e62189064e01f0a670fa581 100644 --- a/forwarder/pom.xml +++ b/forwarder/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/intelliform-adapter/pom.xml b/intelliform-adapter/pom.xml index d2383ae7f96077917d675c4c7c9657679d5e93d4..426682ce68e8a0ec7ced288b4cb771dec12206cd 100644 --- a/intelliform-adapter/pom.xml +++ b/intelliform-adapter/pom.xml @@ -31,7 +31,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/pom.xml b/pom.xml index 36eeeebe778b7a205951b6913f0718d576b817f3..ae919a04222950f58e03385bad81afc240503722 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Eingangs Adapter - Parent</name> diff --git a/router/pom.xml b/router/pom.xml index 56f4c87c8311fdc621af1bc12a5604d67e19a5d0..f4e6162de6de7f34ed630e16309da922dce68225 100644 --- a/router/pom.xml +++ b/router/pom.xml @@ -29,7 +29,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> diff --git a/semantik-adapter/pom.xml b/semantik-adapter/pom.xml index 6867cda78180244cd25831eaf31f8060c7d9d5c0..44207744d7f39da4285c4a16d3a4dfa72300a4c6 100644 --- a/semantik-adapter/pom.xml +++ b/semantik-adapter/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>semantik-adapter</artifactId> diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReaderTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReaderTest.java index 2046f2a6d84f15f0d42543c393a4cba9029c9d42..be45d442c36bc85aec0ca7856256842052216719 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReaderTest.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReaderTest.java @@ -153,20 +153,20 @@ class ZipAttachmentReaderTest { } @Test - @DisplayName("should delete all temporary files after their associated input streams have been closed") + @DisplayName("should delete all temporary files after last reading of inputstream") @SneakyThrows - void shouldDeleteContentFiles() { + void shouldDeleteContentFilesOnFinalRead() { cleanupTempFiles(); var contentEntries = new ZipAttachmentReader().readContent(loadZip(ZIP_2_FILE_NAME)); - contentEntries.forEach(this::closeInputStream); + contentEntries.forEach(this::closeInputStreamFinalRead); assertTrue(noFilesWithSuffixInTempDirectory()); } @SneakyThrows - private void closeInputStream(IncomingFile entry) { - entry.getContentStream().close(); + private void closeInputStreamFinalRead(IncomingFile entry) { + entry.getContentStreamForFinalRead().close(); } @Test diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index 92a32690e074bea447df9fcbf3858066d51889ff..c0399018687cba257d8a8fc3dcef1c658a542235 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>parent</artifactId> - <version>1.9.0-SNAPSHOT</version> + <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>xta-adapter</artifactId> <name>Eingangs Adapter - XTA</name> diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java index 29edd779ccf4fed652aadc54689e9e5aa1886428..2f31999ff99e8d9e997a8e57b6ee2b6260855beb 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java @@ -79,4 +79,6 @@ class Actions { private URI statusList; @NotNull private URI fetchRequest; + @NotNull + private URI closeRequest; } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java index c963bfb5b858bee42c4a447550471f9756463119..5f229669d2887a0fe07017edad94c29fd9eb9613 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java @@ -19,13 +19,17 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.stereotype.Service; +import org.springframework.ws.soap.SoapFaultDetailElement; import org.springframework.ws.soap.addressing.client.ActionCallback; import org.springframework.ws.soap.addressing.version.Addressing10; +import org.springframework.ws.soap.client.SoapFaultClientException; import org.w3._2005._08.addressing.AttributedURIType; import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException; import de.xoev.transport.xta._211.ContentType; +import de.xoev.transport.xta._211.ExceptionType; import de.xoev.transport.xta._211.GenericContentContainer; +import eu.osci.ws._2008._05.transport.MsgBoxCloseRequestType; import eu.osci.ws._2008._05.transport.MsgBoxFetchRequest; import eu.osci.ws._2008._05.transport.MsgBoxStatusListRequestType; import eu.osci.ws._2008._05.transport.MsgSelector; @@ -38,6 +42,9 @@ import lombok.extern.log4j.Log4j2; @Service class XtaRemoteService { + private static final String ERROR_ON_CLOSE_LOG_TEMPLATE = "Error result on close request.\nReason: %s"; + private static final String DETAIL_LOG_TEMPLATE = "Code: %s, Message: %s"; + @Autowired @Valid private XtaProperties properties; @@ -143,8 +150,48 @@ class XtaRemoteService { } public void close(@NonNull XtaMessageId messageId) { - // TODO Auto-generated method stub - LOG.warn("close not jet implemented"); + var callback = new ActionCallback(properties.getActions().getCloseRequest(), new Addressing10(), getTargetUri()); + var template = webServiceTemplateBuilder.setMarshaller(osciMarshaller).setUnmarshaller(xoevMarshaller).build(); + + try { + template.marshalSendAndReceive(buildCloseRequest(messageId.toString()), callback); + } catch (SoapFaultClientException e) { + logErrorOnClose(e); + } + } + + private JAXBElement<MsgBoxCloseRequestType> buildCloseRequest(String msgId) { + MsgBoxCloseRequestType request = new MsgBoxCloseRequestType(); + var lastMsgReceived = request.getLastMsgReceived(); + + AttributedURIType attribute = new AttributedURIType(); + attribute.setValue(msgId); + lastMsgReceived.add(attribute); + + return new ObjectFactory().createMsgBoxCloseRequest(request); + } + + private void logErrorOnClose(SoapFaultClientException e) { + try { + var fault = e.getSoapFault(); + StringBuilder logBuilder = new StringBuilder(ERROR_ON_CLOSE_LOG_TEMPLATE.formatted(e.getSoapFault().getFaultStringOrReason())); + + var entries = fault.getFaultDetail().getDetailEntries(); + entries.forEachRemaining(entry -> logBuilder.append("\n").append(formatFaultEntry(entry))); + + LOG.error(logBuilder.toString(), e); + } catch (Exception e1) { + LOG.error("Error on loggging close error", e1); + LOG.error("origin error was", e); + } + } + + private String formatFaultEntry(SoapFaultDetailElement soapfaultdetailelement1) { + @SuppressWarnings("unchecked") + ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue(); + + return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName().toString()); + } } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java index 6b8ea3cc66bacd40ab00a0ddf0f8cc3cb11efbf8..98e7828da496503b553f25b25ed76b0dcbaa93ea 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java @@ -2,6 +2,7 @@ package de.ozgcloud.eingang.xta; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Profile; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; @@ -10,6 +11,7 @@ import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; +@Profile("!itcase") @Log4j2 @Component class XtaRunner implements ApplicationListener<ContextRefreshedEvent> { diff --git a/xta-adapter/src/main/resources/application.yml b/xta-adapter/src/main/resources/application.yml index c126ac5f2b6f05752e5fe8f816584dff03899e84..a82f3ed43e00eb1fd5721d5fed4128ee74ac6c34 100644 --- a/xta-adapter/src/main/resources/application.yml +++ b/xta-adapter/src/main/resources/application.yml @@ -14,3 +14,4 @@ ozgcloud: actions: status-list: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest" fetch-request: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest" + close-request: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest" diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java index f67c13848f8b8082adab70896514ca9bf37aa9ab..c869365781ca7bc1f0cad31b58f149e421511f8b 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java @@ -14,6 +14,7 @@ import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; import org.springframework.test.context.ActiveProfiles; import de.itvsh.kop.common.test.TestUtils; @@ -24,7 +25,7 @@ import de.itvsh.kop.eingangsadapter.common.formdata.ServiceKonto.PostfachAddress import de.itvsh.kop.eingangsadapter.common.formdata.StringBasedIdentifier; import de.itvsh.kop.eingangsadapter.router.VorgangRemoteService; -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = { Application.class, ActivateXTARunnerConfig.class }) @ActiveProfiles({ "local", "itcase" }) class XtaITCase { @@ -99,4 +100,12 @@ class XtaITCase { return formDataCaptor.getValue(); } + } + +class ActivateXTARunnerConfig { + @Bean + XtaRunner xtaRunner() { + return new XtaRunner(); + } +} \ No newline at end of file diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java index c8cdfc6d82929c2cee856b9ef84c10c7028559e6..57f96b389e8e711b6029b06e572706126d7ac010 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java @@ -1,10 +1,8 @@ package de.ozgcloud.eingang.xta; -import java.util.UUID; - class XtaMessageTestFactory { - static final XtaMessageId MESSAGE_ID = XtaMessageId.from(UUID.randomUUID().toString()); + static final XtaMessageId MESSAGE_ID = XtaMessageId.from("urn:de:xta:messageid:dataport_xta_210:81e40808-91c6-4765-aaf4-1aa62fec8be9"); static XtaMessage create() { return createBuilder().build(); diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java index c2627d67b01b7f3b726526b8747278f32d5097b9..0e9a787753cb1e93ee5449dec9473524cd19638e 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java @@ -61,4 +61,11 @@ class XtaRemoteServiceITCase { } } + @Nested + class TestClose { + @Test + void shouldThrowNoException() { + assertThatNoException().isThrownBy(() -> remoteService.close(XtaMessageTestFactory.MESSAGE_ID)); + } + } }