diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java index 34a807f7001122a0561f319e767c06b08904f25b..1ef661f3e778725c4a5afd95b69c7d67457ce2e8 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java @@ -57,9 +57,6 @@ class XtaIncomingFilesMapper { } IncomingFile toIncomingFile(XtaFile messageFile) { - if (!messageFile.contentType().equals(ZIP_CONTENT_TYPE)) { - LOG.warn("Expected XTA messageFile to be of content type " + ZIP_CONTENT_TYPE + ". Instead was " + messageFile.contentType()); - } return IncomingFile.builder() .name(messageFile.name()) .contentType(messageFile.contentType()) 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 3f90f369ed2a11143b59cd8899ef26a67f2d379a..bb048d1c60c284da67062008acfdb6d5b1972281 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 @@ -12,4 +12,6 @@ public class XtaMessage { private XtaMessageMetaData metaData; @Singular private Collection<XtaFile> messageFiles; + @Singular + private Collection<XtaFile> attachments; } 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 4f59251706db33e1fe5d24ce333fb7f3a255a5a3..c1d3ecfb782a7e0f42f2feab9cadb78b621ff15c 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 @@ -182,18 +182,28 @@ class XtaRemoteService { } public XtaMessage getMessage(XtaMessageId messageId) { + var contentContainer = loadContentContainer(messageId.toString()); + return XtaMessage.builder() .metaData(null) - .messageFiles(Collections.singleton(getMessage(messageId.toString()))) + .messageFiles(Collections.singleton(getMessage(contentContainer))) + .attachments(getAttachments(contentContainer).toList()) .build(); } - XtaFile getMessage(String messageId) { + GenericContentContainer loadContentContainer(String messageId) { var callback = new ActionCallback(properties.getActions().getFetchRequest(), new Addressing10(), getTargetUri()); var template = webServiceTemplateBuilder.setMarshaller(osciMarshaller).setUnmarshaller(xoevMarshaller).build(); - var result = (GenericContentContainer) template.marshalSendAndReceive(buildFetchRequest(messageId), callback); - return toXtaFile(result.getContentContainer().getMessage()); + return (GenericContentContainer) template.marshalSendAndReceive(buildFetchRequest(messageId), callback); + } + + XtaFile getMessage(GenericContentContainer container) { + return toXtaFile(container.getContentContainer().getMessage()); + } + + Stream<XtaFile> getAttachments(GenericContentContainer container) { + return container.getContentContainer().getAttachment().stream().map(this::toXtaFile); } private XtaFile toXtaFile(ContentType type) { 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 ceed7a9c13bbc8a8d9a5817dbf762d2c2c4c33e0..cc384b4c48a83c2c3493e06489394ff19f08f1cf 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 @@ -11,7 +11,7 @@ import de.ozgcloud.eingang.semantik.SemantikAdapter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; -@Profile({"!itcase", "fim"}) +@Profile({ "!itcase" }) @Log4j2 @Component class XtaRunner implements ApplicationListener<ContextRefreshedEvent> { 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 4fccd8d8a8cf29f762e97b775aeae9a72c66bb76..60bef9e3483f044ad27aa524852fafa0abd1c8c4 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 @@ -1,12 +1,14 @@ package de.ozgcloud.eingang.xta; -import static java.util.Collections.emptyList; +import static java.util.Collections.*; +import java.util.Collection; import java.util.List; import java.util.Spliterators; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -14,6 +16,7 @@ import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.IncomingFile; +import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; import lombok.NonNull; @@ -56,14 +59,9 @@ class XtaService { } boolean isSupportedMessageType(XtaMessageMetaData metaData) { - if (StringUtils.equals(metaData.getMessageType(), XDOMEA_0201_MESSAGE_TYPE)) { + if (isXDomeaMessageType(metaData.getMessageType()) || isFimMessageType(metaData.getMessageType())) { return true; } - - if (StringUtils.startsWith(metaData.getMessageType(), FIM_MESSAGE_TYPE_PREFIX)) { - return true; - } - LOG.warn("Ignoring XTA-Message of type '{}'.", metaData.getMessageType()); return false; } @@ -72,20 +70,44 @@ class XtaService { var msg = remoteService.getMessage(metaData.getMessageId()); var incomingFiles = xtaIncomingFilesMapper.toIncomingFiles(msg.getMessageFiles()); - return mapper.toFormData(getRepresentationsAttachmentsPair(metaData, incomingFiles), metaData, vorgangNummerSupplier); + var formData = mapper.toFormData(getRepresentationsAttachmentsPair(metaData, incomingFiles), metaData, vorgangNummerSupplier); + return addAttachments(msg, formData); + } + + FormData addAttachments(XtaMessage msg, FormData inFormData) { + var attachments = buildAttachmentsInFiles(msg.getAttachments()); + if (CollectionUtils.isNotEmpty(attachments)) { + return inFormData.toBuilder() + .attachment(IncomingFileGroup.builder().name("sonstige").files(attachments).build()) + .numberOfAttachments(attachments.size()) + .build(); + } + return inFormData; + } + + private List<IncomingFile> buildAttachmentsInFiles(Collection<XtaFile> attachmentFiles) { + return attachmentFiles.stream().map(xtaIncomingFilesMapper::toIncomingFile).toList(); } RepresentationsAttachmentsPair getRepresentationsAttachmentsPair(XtaMessageMetaData metaData, List<IncomingFile> incomingFiles) { - if (StringUtils.equals(metaData.getMessageType(), XDOMEA_0201_MESSAGE_TYPE)) { + if (isXDomeaMessageType(metaData.getMessageType())) { return xdomeaMessageDataMapper.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFiles); } - if (StringUtils.startsWith(metaData.getMessageType(), FIM_MESSAGE_TYPE_PREFIX)) { + if (isFimMessageType(metaData.getMessageType())) { return mapIncomingFilesToRepresentations(incomingFiles); } throw new TechnicalException("Unexpected XTA message type: %s".formatted(metaData.getMessageType())); } + private boolean isXDomeaMessageType(String messageType) { + return StringUtils.equals(messageType, XDOMEA_0201_MESSAGE_TYPE); + } + + private boolean isFimMessageType(String messageType) { + return StringUtils.startsWith(messageType, FIM_MESSAGE_TYPE_PREFIX); + } + RepresentationsAttachmentsPair mapIncomingFilesToRepresentations(List<IncomingFile> incomingFiles) { return RepresentationsAttachmentsPair.builder() .representations(incomingFiles) 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 57f96b389e8e711b6029b06e572706126d7ac010..6c8597cc38fd795a311ad8d3a70e64a5c24c6347 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 @@ -4,6 +4,8 @@ class XtaMessageTestFactory { static final XtaMessageId MESSAGE_ID = XtaMessageId.from("urn:de:xta:messageid:dataport_xta_210:81e40808-91c6-4765-aaf4-1aa62fec8be9"); + static final XtaFile attachment = XtaFileTestFactory.create(); + static XtaMessage create() { return createBuilder().build(); } @@ -11,7 +13,7 @@ class XtaMessageTestFactory { static XtaMessage.XtaMessageBuilder createBuilder() { return XtaMessage.builder() .metaData(XtaMessageMetaDataTestFactory.create()) - .messageFile(XtaFileTestFactory.create()); - + .messageFile(XtaFileTestFactory.create()) + .attachment(attachment); } } 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 cc85f76f2d5cff5cf9556a7613493647f05f740b..fbf36381b8862d5c0bbd5908ec16e0dd5d927b03 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 @@ -2,6 +2,8 @@ package de.ozgcloud.eingang.xta; import static org.assertj.core.api.Assertions.*; +import jakarta.validation.Valid; + import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -10,7 +12,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import de.ozgcloud.eingang.Application; -import jakarta.validation.Valid; @Disabled("real live test - do only activate for manual testing") @ActiveProfiles({ "itcase", "local" }) @@ -54,7 +55,7 @@ class XtaRemoteServiceITCase { class TestGetMessage { @Test void shouldSendRequest() { - var result = remoteService.getMessage("urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a"); + var result = remoteService.loadContentContainer("urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a"); assertThat(result).isNotNull(); } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java index a1c37d0b970039056a996ab875c6476a60abd4c5..3077811a1651d869a91028b8cb030e7052306b17 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java @@ -4,14 +4,19 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.stream.Stream; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.Spy; import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; +import de.xoev.transport.xta._211.GenericContentContainer; + class XtaRemoteServiceTest { @Spy @@ -93,17 +98,35 @@ class XtaRemoteServiceTest { class TestGetMessage { private XtaFile file = XtaFileTestFactory.create(); + @Mock + private GenericContentContainer contentContainerMock; @BeforeEach void init() { - doReturn(file).when(service).getMessage(anyString()); + doReturn(file).when(service).getMessage(Mockito.<GenericContentContainer>any()); + doReturn(contentContainerMock).when(service).loadContentContainer(anyString()); + doReturn(Stream.of(file)).when(service).getAttachments(any()); + } + + @Test + void shouldCallLoadContentContainer() { + service.getMessage(XtaMessageTestFactory.MESSAGE_ID); + + verify(service).loadContentContainer(XtaMessageTestFactory.MESSAGE_ID.toString()); } @Test void shouldCallGetMessage() { service.getMessage(XtaMessageTestFactory.MESSAGE_ID); - verify(service).getMessage(XtaMessageTestFactory.MESSAGE_ID.toString()); + verify(service).getMessage(contentContainerMock); + } + + @Test + void sohludCallGetAttachments() { + service.getMessage(XtaMessageTestFactory.MESSAGE_ID); + + verify(service).getAttachments(contentContainerMock); } @Test 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 8e4c34115cc54be243a8ebed26fa148dc4c5b60f..45fc00b5cf3343121a5fb7bfaedb5193814383fb 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 @@ -135,9 +135,10 @@ class XtaServiceTest { @Mock private FormData formData; - private XtaMessage message; - private XtaMessageMetaData messageMetaData; + private XtaMessage message = XtaMessageTestFactory.create(); + private XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); private RepresentationsAttachmentsPair classification; + private FormData mappedFormData = FormDataTestFactory.create(); @Captor private ArgumentCaptor<XtaMessageMetaData> messageMetaDataCaptor; @@ -147,15 +148,16 @@ class XtaServiceTest { @BeforeEach void init() { - message = XtaMessageTestFactory.create(); - when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); - var incomingFiles = List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create()); - - messageMetaData = XtaMessageMetaDataTestFactory.create(); classification = RepresentationsAttachmentsPairTestFactory.create(); - doReturn(classification).when(service).getRepresentationsAttachmentsPair(messageMetaData, incomingFiles); + var incomingFiles = List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create()); when(incomingFilesMapper.toIncomingFiles(message.getMessageFiles())).thenReturn(incomingFiles); - when(mapper.toFormData(classification, messageMetaData, vorgangNummerSupplier)).thenReturn(formData); + doReturn(classification).when(service).getRepresentationsAttachmentsPair(messageMetaData, incomingFiles); + } + + @BeforeEach + void mockMessageMapping() { + when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); + when(mapper.toFormData(any(), any(), any())).thenReturn(mappedFormData); } @Test @@ -181,11 +183,42 @@ class XtaServiceTest { assertThat(classificationCaptor.getValue()).isEqualTo(classification); } + @Test + void shouldCallAddAttachments() { + service.getFormData(messageMetaData); + + verify(service).addAttachments(message, mappedFormData); + } + @Test void shouldReturnMappedResult() { + doReturn(mappedFormData).when(service).addAttachments(any(), any()); + var result = service.getFormData(messageMetaData); - assertThat(result).isEqualTo(formData); + assertThat(result).isEqualTo(mappedFormData); + } + } + + @Nested + class TestAddAttachments { + + private final FormData inFormData = FormDataTestFactory.createBuilder().clearAttachments().numberOfAttachments(0).build(); + + @Test + void shouldAddAttachments() { + var result = service.addAttachments(XtaMessageTestFactory.create(), inFormData); + + assertThat(result.getAttachments()).hasSize(1); + assertThat(result.getNumberOfAttachments()).isEqualTo(1); + } + + @Test + void shouldWorkWithoutAnyAttachment() { + var result = service.addAttachments(XtaMessageTestFactory.createBuilder().clearAttachments().build(), inFormData); + + assertThat(result.getAttachments()).hasSize(0); + assertThat(result.getNumberOfAttachments()).isEqualTo(0); } }