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/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)); + } + } }