diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java index b12dfc7a99548a5868891da6608dab10242e64d2..b3217e3fed5aaf5e77990f6b48515713d5916934 100644 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java +++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java @@ -71,8 +71,8 @@ class DepositDataMapper { } public FormData mapToFormData(DepositData depositData) { - Map<String, IncomingFile> incomingFileMap = mapDepositAttachmentsToIncomingFiles(depositData); - Document document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); + var incomingFileMap = mapDepositAttachmentsToIncomingFiles(depositData); + var document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); var attachmentGroups = findAttachmentGroups(document); return mapToFormDataWithRepresentationsAndAttachments( @@ -99,7 +99,14 @@ class DepositDataMapper { .build(); } - Map<String, IncomingFile> mapDepositAttachmentsToIncomingFiles(DepositData depositData) { + Map<String, IncomingFile> mapDepositAttachmentsToSortedIncomingFiles(DepositData depositData) { + var incomingFilesMap = mapDepositAttachmentsToIncomingFiles(depositData); + var primaryId = depositData.getPrimaryDataAttachmentId(); + incomingFilesMap.putFirst(primaryId, getIncomingFileById(primaryId, incomingFilesMap)); + return incomingFilesMap; + } + + private LinkedHashMap<String, IncomingFile> mapDepositAttachmentsToIncomingFiles(DepositData depositData) { return depositData.getAttachments() .stream() .collect(Collectors.toMap( diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java index 0bc63fd67c648f3a51d7a57942cd5414a3293262..296091c2e7c4b7bfb4c79b7d583946826ad33413 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java @@ -114,7 +114,7 @@ public class AttachmentTestFactory { .build()); } - private static Attachment createAttachment(MetaAttachment metaAttachment) { + public static Attachment createAttachment(MetaAttachment metaAttachment) { var attachment = new Attachment(); attachment.getAttributes().add(createAttributesEntry()); attachment.setContent(metaAttachment.content.getBytes()); @@ -163,7 +163,7 @@ public class AttachmentTestFactory { } @Builder - private record MetaAttachment(String id, String name, String contentType, String content, String templateId) { + public record MetaAttachment(String id, String name, String contentType, String content, String templateId) { } private static List<MetaAttachment> arrayToMetaAttachments(String[] array) { diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java index 53aa6003c9e0595b8df9e4f534ca82c2f0e91b6e..146bd522508b4c21806fdd3c5e4faa4508b806fc 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java @@ -25,13 +25,13 @@ package de.ozgcloud.eingang.intelliform; import static de.ozgcloud.eingang.intelliform.AttachmentTestFactory.*; import static de.ozgcloud.eingang.intelliform.DepositDataTestFactory.*; +import static java.util.Collections.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import java.io.IOException; import java.io.StringReader; import java.nio.charset.Charset; -import java.util.Collections; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; @@ -244,7 +244,7 @@ class DepositDataMapperTest { @DisplayName("should throw technical exception") @Test void shouldThrowTechnicalException() { - depositData = DepositDataTestFactory.create(Collections.emptyList()); + depositData = DepositDataTestFactory.create(emptyList()); assertThatThrownBy(TestMapToFormData.this::doMapping) .isInstanceOf(TechnicalException.class); @@ -257,20 +257,53 @@ class DepositDataMapperTest { } - @DisplayName("map deposit attachments to incoming files") + @DisplayName("map deposit attachments to sorted incoming files") @Nested - class TestMapDepositAttachmentsToIncomingFiles { + class TestMapDepositAttachmentsToSortedIncomingFiles { + + @DisplayName("should fail without primaryDataAttachmentId attachment") + @Test + void shouldFailWithoutPrimaryDataAttachmentIdAttachment() { + var depositData = DepositDataTestFactory.create(emptyList()); + + assertThatThrownBy(() -> mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData)) + .isInstanceOf(TechnicalException.class); + } + @DisplayName("should keep entry order") @Test void shouldKeepEntryOrder() { var depositData = DepositDataTestFactory.create(ATTACHMENTS); - var incomingFileMap = mapper.mapDepositAttachmentsToIncomingFiles(depositData); + var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); var keys = incomingFileMap.keySet().stream().toList(); assertThat(keys).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID, PNG_ATTACHMENT_ID); } + @DisplayName("should move primary attachment id to first position") + @Test + void shouldMovePrimaryAttachmentIdToFirstPosition() { + var rohformId = "XML-daten-rohform"; + var depositData = DepositDataTestFactory.create(List.of( + AttachmentTestFactory.createAttachment(MetaAttachment.builder() + .id(rohformId) + .name("XML-Daten (Rohform).xml") + .contentType(XML_CONTENT_TYPE) + .content("abc") + .build() + ), + AttachmentTestFactory.createPdf(), + AttachmentTestFactory.createXmlDaten(), + AttachmentTestFactory.createPng() + )); + + var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); + + var keys = incomingFileMap.keySet().stream().toList(); + assertThat(keys).containsExactly(XML_ATTACHMENT_ID, rohformId, PDF_ATTACHMENT_ID, PNG_ATTACHMENT_ID); + } + @DisplayName("should keep last entry for duplicate key") @Test void shouldKeepLastEntryForDuplicateKey() { @@ -280,7 +313,7 @@ class DepositDataMapperTest { AttachmentTestFactory.createXmlDaten() )); - var incomingFileMap = mapper.mapDepositAttachmentsToIncomingFiles(depositData); + var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); var keys = incomingFileMap.keySet().stream().toList(); assertThat(keys).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID);