diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index b08c04a215e7be06379dd12983c1f1c0e71dbac7..22cf8f945c4947081dc8372f44db727130cd65f3 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -19,6 +19,11 @@ </exclusion> </exclusions> </dependency> + <!-- own projects --> + <dependency> + <groupId>de.itvsh.kop.eingangsadapter</groupId> + <artifactId>common</artifactId> + </dependency> <!--mapstruct--> <dependency> <groupId>org.mapstruct</groupId> diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java index 8e5826cd41fd6948313ba03e88b435fef5bb01e1..841a0832b167c5b2d0f14f911884160d76c06465 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java @@ -1,7 +1,11 @@ package de.ozgcloud.eingang.xta; -public record XtaMessage( - XtaMessageMetaData metaData, - XtaFile messageFile) { +import lombok.Builder; +import lombok.Getter; +@Builder +@Getter +public class XtaMessage { + private XtaMessageMetaData metaData; + private XtaFile messageFile; } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..d8852bd692a2e14d8e190e063d2e1164e168cb28 --- /dev/null +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java @@ -0,0 +1,61 @@ +package de.ozgcloud.eingang.xta; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException; +import de.itvsh.kop.eingangsadapter.common.formdata.DeleteOnCloseInputStream; +import de.itvsh.kop.eingangsadapter.common.formdata.FormData; +import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader; +import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; + +@Mapper +interface XtaMessageMapper { + + @Mapping(target = "antragsteller", ignore = true) + @Mapping(target = "attachment", ignore = true) + @Mapping(target = "attachments", ignore = true) + @Mapping(target = "formData", ignore = true) + @Mapping(target = "id", ignore = true) + @Mapping(target = "numberOfAttachments", ignore = true) + @Mapping(target = "numberOfRepresentations", ignore = true) + @Mapping(target = "representation", source = "messageFile") + @Mapping(target = "representations", ignore = true) + @Mapping(target = "zustaendigeStelle", ignore = true) + @Mapping(target = "header", source = "metaData") + FormData toFormData(XtaMessage message); + + @Mapping(target = "formEngineName", ignore = true) + @Mapping(target = "formId", source = "messageType") + @Mapping(target = "requestId", ignore = true) + @Mapping(target = "serviceKonto", ignore = true) + @Mapping(target = "createdAt", source = "origin") + @Mapping(target = "sender", constant = "XTA") + @Mapping(target = "formName", source = "messageType") + FormHeader formHeaderFromMetaData(XtaMessageMetaData metaData); + + default IncomingFile toIncomingFile(XtaFile messageFile) { + if (Objects.nonNull(messageFile)) { + return IncomingFile.builder() + .name(messageFile.name()) + .contentType("application/zip") + .contentStream(openFile(messageFile.file())) + .size(messageFile.file().length()) + .build(); + } + return null; + } + + default InputStream openFile(File file) { + try { + return new DeleteOnCloseInputStream(file); + } catch (IOException e) { + throw new TechnicalException("Error opening xta message file."); + } + } +} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java index dc0ea52a00730a7df48210f5976c621d395158e3..66d4ed8d011521b3895e738a3eaf7d91b35af8fa 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java @@ -3,15 +3,18 @@ package de.ozgcloud.eingang.xta; import java.time.ZonedDateTime; import lombok.Builder; +import lombok.Getter; @Builder -record XtaMessageMetaData( - // MsgIdentification.MessageId - XtaMessageId messageId, - // DeliveryAttributes.origin - ZonedDateTime origin, - // DeliveryAttributes.delivery - ZonedDateTime delivery, - // Qualifier.MessageType.code - String messageType) { +@Getter +class XtaMessageMetaData { + // MsgIdentification.MessageId + private XtaMessageId messageId; + // DeliveryAttributes.origin + private ZonedDateTime origin; + // DeliveryAttributes.delivery + private ZonedDateTime delivery; + // Qualifier.MessageType.code + private String messageType; + } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java index 24a339f5c34b8020f578cb1dec23fe9b9516ff85..3dbe79d557a8015e84fdbd1b0f6b351c9ff60f36 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java @@ -6,6 +6,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import lombok.extern.log4j.Log4j2; @Service @@ -16,19 +17,29 @@ class XtaService { @Autowired private XtaRemoteService remoteService; + @Autowired + private XtaMessageMapper mapper; + + public Stream<FormData> getMessagesAsFormData() { + return getMessagesMetaData().map(XtaMessageMetaData::getMessageId).map(this::getFormData); + } - Stream<XtaMessageMetaData> getMessages() { + public Stream<XtaMessageMetaData> getMessagesMetaData() { return remoteService.getMessagesMetadata().filter(this::filterByMessageType); } // filter criteria for dFoerdermittelantrag // https://jira.mgm-tp.com/jira/browse/OZG-3659 private boolean filterByMessageType(XtaMessageMetaData metaData) { - if (StringUtils.equals(metaData.messageType(), DFOERDERMITTELANTRAG_MESSAGE_TYPE)) { + if (StringUtils.equals(metaData.getMessageType(), DFOERDERMITTELANTRAG_MESSAGE_TYPE)) { return true; } - LOG.warn("Ignoring XTA-Message of type '{}'.", metaData.messageType()); + LOG.warn("Ignoring XTA-Message of type '{}'.", metaData.getMessageType()); return false; } + + public FormData getFormData(XtaMessageId messageId) { + return mapper.toFormData(remoteService.getMessage(messageId)); + } } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..479cbcc9d27ac3e2f9ce0588497bf4fd4016d19e --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java @@ -0,0 +1,25 @@ +package de.ozgcloud.eingang.xta; + +import de.itvsh.kop.eingangsadapter.common.formdata.FormData; +import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader; + +class FormDataTestFactory { + + static FormData create() { + return createBuilder().build(); + } + + static FormData.FormDataBuilder createBuilder() { + return FormData.builder() + .header(createHeader()); + } + + static FormHeader createHeader() { + return FormHeader.builder() + .sender("XTA") + .formName(XtaMessageMetaDataTestFactory.MESSAGE_TYPE) + .formId(XtaMessageMetaDataTestFactory.MESSAGE_TYPE) + .createdAt(XtaMessageMetaDataTestFactory.ORIGIN) + .build(); + } +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java index ea06ee32d6c35b935a38a5acb3c0b5a49038d8e8..f6faf22af1a6eeebbce3696acb9f3a39e29e073c 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java @@ -1,6 +1,6 @@ package de.ozgcloud.eingang.xta; -import static de.ozgcloud.eingang.xta.XtaMessageMetaDataTestFactory.*; +import static de.ozgcloud.eingang.xta.XtaMessageTestFactory.*; import org.w3._2005._08.addressing.AttributedURIType; diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaFileTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaFileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7d0827fdbd59695d8d22db9dd040aa49a40b62cb --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaFileTestFactory.java @@ -0,0 +1,32 @@ +package de.ozgcloud.eingang.xta; + +import java.io.File; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.FileUtils; + +import lombok.SneakyThrows; + +class XtaFileTestFactory { + + static final String NAME = "Test_File"; + static final String CONTENT = "slkafj3jifsdasx"; + + static XtaFile create() { + return createBuilder().build(); + } + + static XtaFile.XtaFileBuilder createBuilder() { + return XtaFile.builder().name(NAME).file(createFile()); + } + + @SneakyThrows + private static File createFile() { + File tFile = File.createTempFile("test", "txt"); + tFile.deleteOnExit(); + + FileUtils.write(tFile, CONTENT, StandardCharsets.UTF_8); + + return tFile; + } +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0fb7ddb9059ce2b7f209d8af1b78f466ae772f3b --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java @@ -0,0 +1,84 @@ +package de.ozgcloud.eingang.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Spy; + +class XtaMessageMapperTest { + + @Spy + @InjectMocks + private XtaMessageMapper mapper = Mappers.getMapper(XtaMessageMapper.class); + + @Nested + class TestToFormData { + + @Test + void shouldMapAllToForm() { + var formData = mapper.toFormData(XtaMessageTestFactory.create()); + + assertThat(formData).usingRecursiveComparison().ignoringFields("id", "representations") + .isEqualTo(FormDataTestFactory.create()); + } + + @Test + void shouldHaveMessageFileAsRepresentation() { + var formData = mapper.toFormData(XtaMessageTestFactory.create()); + + assertThat(formData.getRepresentations()).hasSize(1); + } + + @Test + void shouldCallToIncomingFile() { + XtaMessage message = XtaMessageTestFactory.create(); + + mapper.toFormData(message); + + verify(mapper).toIncomingFile(message.getMessageFile()); + } + + @Nested + class ToIncomingFile { + @Test + void shouldHaveMessageFile() { + var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); + + assertThat(inFile.getContentStream()).isNotNull(); + } + + @Test + void shouldHaveFileName() { + var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); + + assertThat(inFile.getName()).isEqualTo(XtaFileTestFactory.NAME); + } + + @Test + void shouldHaveZipContentType() { + var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); + + assertThat(inFile.getContentType()).isEqualTo("application/zip"); + } + + @Test + void shouldHaveSize() { + var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); + + assertThat(inFile.getSize()).isEqualTo(XtaFileTestFactory.CONTENT.length()); + } + + @Test + void shouldHandleMissingMessageFile() { + var fileGroup = mapper.toIncomingFile(null); + + assertThat(fileGroup).isNull(); + } + } + + } +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java index be97ede08ef374bd5e246e42db133d6b45f2849e..d112294af7ba77c619baf1b9574a648ac1930b1f 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java @@ -1,10 +1,13 @@ package de.ozgcloud.eingang.xta; -import java.util.UUID; +import static de.ozgcloud.eingang.xta.XtaMessageTestFactory.*; + +import java.time.ZonedDateTime; class XtaMessageMetaDataTestFactory { - static final XtaMessageId MESSAGE_ID = XtaMessageId.from(UUID.randomUUID().toString()); + static final String MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201"; + static final ZonedDateTime ORIGIN = ZonedDateTime.parse("2022-10-29T15:45:52.4942149+02:00"); static XtaMessageMetaData create() { return createBuilder().build(); @@ -12,6 +15,8 @@ class XtaMessageMetaDataTestFactory { static XtaMessageMetaData.XtaMessageMetaDataBuilder createBuilder() { return XtaMessageMetaData.builder() - .messageId(MESSAGE_ID); + .messageId(MESSAGE_ID) + .messageType(MESSAGE_TYPE) + .origin(ORIGIN); } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..c8cdfc6d82929c2cee856b9ef84c10c7028559e6 --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java @@ -0,0 +1,19 @@ +package de.ozgcloud.eingang.xta; + +import java.util.UUID; + +class XtaMessageTestFactory { + + static final XtaMessageId MESSAGE_ID = XtaMessageId.from(UUID.randomUUID().toString()); + + static XtaMessage create() { + return createBuilder().build(); + } + + static XtaMessage.XtaMessageBuilder createBuilder() { + return XtaMessage.builder() + .metaData(XtaMessageMetaDataTestFactory.create()) + .messageFile(XtaFileTestFactory.create()); + + } +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java index c6731a84dd86f1865ada6234a5a2c47697c7c656..8caa542fe5d6ccf2e12cea8d1c3e627765750931 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java @@ -2,6 +2,7 @@ package de.ozgcloud.eingang.xta; import static de.ozgcloud.eingang.xta.XtaService.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.stream.Stream; @@ -11,14 +12,44 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; class XtaServiceTest { + @Spy @InjectMocks private XtaService service; @Mock private XtaRemoteService remoteService; + @Mock + private XtaMessageMapper mapper; + + @Nested + class TestGetMessagesAsFormData { + + @BeforeEach + void init() { + when(service.getMessagesMetaData()).thenReturn(Stream.of(XtaMessageMetaDataTestFactory.create())); + } + + @Test + void shouldCallGetFormData() { + service.getMessagesAsFormData().toList(); + + verify(service).getFormData(XtaMessageTestFactory.MESSAGE_ID); + } + + @Test + void shouldReturnFormData() { + var formData = FormDataTestFactory.create(); + when(service.getFormData(any())).thenReturn(formData); + + var result = service.getMessagesAsFormData(); + + assertThat(result).hasSize(1).contains(formData); + } + } @Nested class TestGetMessages { @@ -32,14 +63,14 @@ class XtaServiceTest { @Test void shouldCallRemoteService() { - service.getMessages(); + service.getMessagesMetaData(); verify(remoteService).getMessagesMetadata(); } @Test void shouldReturnMetaData() { - var result = service.getMessages(); + var result = service.getMessagesMetaData(); assertThat(result).hasSize(1).contains(metaData); } @@ -48,10 +79,45 @@ class XtaServiceTest { void shouldOnlyReturnMatchingMessageCode() { when(remoteService.getMessagesMetadata()).thenReturn(Stream.of(XtaMessageMetaDataTestFactory.createBuilder().messageType("other").build())); - var result = service.getMessages(); + var result = service.getMessagesMetaData(); assertThat(result).isEmpty(); } } + @Nested + class TestFetFormData { + + private XtaMessage message = XtaMessageTestFactory.create(); + + @BeforeEach + void init() { + when(remoteService.getMessage(any())).thenReturn(message); + } + + @Test + void shouldCallRemoteService() { + service.getFormData(XtaMessageTestFactory.MESSAGE_ID); + + verify(remoteService).getMessage(XtaMessageTestFactory.MESSAGE_ID); + } + + @Test + void shouldCallMapper() { + service.getFormData(XtaMessageTestFactory.MESSAGE_ID); + + verify(mapper).toFormData(message); + } + + @Test + void shouldReturnMappedResult() { + var mapped = FormDataTestFactory.create(); + when(mapper.toFormData(any())).thenReturn(mapped); + + var result = service.getFormData(XtaMessageTestFactory.MESSAGE_ID); + + assertThat(result).isSameAs(mapped); + } + } + }