diff --git a/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java b/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java index 218a7c9d3789b4b2f7f7235dd4af3a2b78b6c329..1c4fb0545a16cb00f0ca4ad92df343494260bb78 100644 --- a/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java +++ b/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java @@ -47,14 +47,40 @@ public class XdomeaMessageDataMapper { private final XdomeaXMLValueReader valueReader; - public EingangRepresentationsAndAttachments mapIncomingFilesToRepresentationsAttachmentsPair(List<IncomingFile> incomingFileList) { + public EingangRepresentationsAndAttachments mapEingangRepresentationsAndAttachments(List<IncomingFile> incomingFileList) { + return removeUuidPrefixFromEingangFiles( + mapRawEingangRepresentationsAndAttachments(incomingFileList) + ); + } + + private EingangRepresentationsAndAttachments removeUuidPrefixFromEingangFiles(EingangRepresentationsAndAttachments eingang) { + return EingangRepresentationsAndAttachments.builder() + .primaryFormDataFileName(removeUuidPrefix(eingang.primaryFormDataFileName())) + .primaryFormDataPdfFileName(removeUuidPrefix(eingang.primaryFormDataPdfFileName())) + .representations(removeUuidPrefixFromIncomingFiles(eingang.representations())) + .attachments(removeUuidPrefixFromIncomingFileGroups(eingang.attachments())) + .build(); + } + + private EingangRepresentationsAndAttachments mapRawEingangRepresentationsAndAttachments(List<IncomingFile> incomingFileList) { var xdomeaMessageData = mapIncomingFilesToXdomeaMessageData(incomingFileList); return EingangRepresentationsAndAttachments.builder() - .representations(removeUuidPrefixFromIncomingFiles(getPairRepresentations(xdomeaMessageData))) - .attachments(removeUuidPrefixFromIncomingFileGroups(xdomeaMessageData.attachments())) + .primaryFormDataFileName(findRepresentationFileNameBySuffixFromMetadata(xdomeaMessageData, ".xml")) + .primaryFormDataPdfFileName(findRepresentationFileNameBySuffixFromMetadata(xdomeaMessageData, ".pdf")) + .representations(getPairRepresentations(xdomeaMessageData)) + .attachments(xdomeaMessageData.attachments()) .build(); } + private String findRepresentationFileNameBySuffixFromMetadata(XdomeaMessageData xdomeaMessageData, String suffix) { + return findRepresentationFileNameBySuffix( + xdomeaMessageData.representations().stream() + .map(IncomingFile::getName) + .toList(), + suffix + ); + } + private List<IncomingFileGroup> removeUuidPrefixFromIncomingFileGroups(List<IncomingFileGroup> incomingFileGroups) { return incomingFileGroups.stream() .map(group -> group.toBuilder() @@ -116,10 +142,7 @@ public class XdomeaMessageDataMapper { } private List<IncomingFile> getRepresentations(List<String> representationFileNames, Map<String, IncomingFile> fileNameToFileMap) { - return getFilesByName( - movePrimaryRepresentationFileNameToFirstPosition(representationFileNames), - fileNameToFileMap - ); + return getFilesByName(representationFileNames.stream(), fileNameToFileMap); } private List<IncomingFileGroup> getAttachments(Stream<String> attachmentFileNames, Map<String, IncomingFile> fileNameToFileMap) { @@ -137,14 +160,6 @@ public class XdomeaMessageDataMapper { .toList(); } - private Stream<String> movePrimaryRepresentationFileNameToFirstPosition(List<String> representationFileNames) { - var primaryRepresentationFileName = findPrimaryRepresentationName(representationFileNames); - return Stream.concat( - Stream.of(primaryRepresentationFileName), - dropNames(representationFileNames.stream(), Set.of(primaryRepresentationFileName)) - ); - } - private List<IncomingFile> getFilesByName(Stream<String> names, Map<String, IncomingFile> fileNameToFileMap) { return names.map(fileNameToFileMap::get).toList(); } @@ -153,16 +168,17 @@ public class XdomeaMessageDataMapper { return names.filter(name -> !namesToDrop.contains(name)); } - String findPrimaryRepresentationName(List<String> representationFileNames) { - var xmlFileNames = representationFileNames.stream() - .filter(name -> name.endsWith(".xml")) + String findRepresentationFileNameBySuffix(List<String> representationFileNames, String suffix) { + var fileNames = representationFileNames.stream() + .filter(name -> name.endsWith(suffix)) .toList(); - if (xmlFileNames.isEmpty()) { - throw new TechnicalException("No xml representation file name found!"); - } else if (xmlFileNames.size() > 1) { - LOG.warn("There is more than one xml representations. Choosing the first of {}.", xmlFileNames.size()); + if (fileNames.isEmpty()) { + LOG.warn("There is no representation with suffix {}!.", suffix); + return ""; + } else if (fileNames.size() > 1) { + LOG.warn("There is more than one representation with suffix {}. Choosing the first of {}.", suffix, fileNames.size()); } - return xmlFileNames.getFirst(); + return fileNames.getFirst(); } IncomingFile findXdomeaXMLFile(List<IncomingFile> incomingFileList) { diff --git a/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/src/main/java/de/ozgcloud/eingang/xta/XtaService.java index cee05fbdc39b3ef0685832794323677f95cff119..1898f89e539569c93f14507b846fbcf23c14f6c1 100644 --- a/src/main/java/de/ozgcloud/eingang/xta/XtaService.java +++ b/src/main/java/de/ozgcloud/eingang/xta/XtaService.java @@ -29,9 +29,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Consumer; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -51,6 +48,9 @@ import de.ozgcloud.xta.client.model.XtaMessage; import de.ozgcloud.xta.client.model.XtaMessageMetaData; import de.ozgcloud.xta.client.model.XtaMessageStatus; import de.ozgcloud.xta.client.model.XtaTransportReport; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; @Service @Log4j2 @@ -71,7 +71,6 @@ class XtaService { private final XdomeaMessageDataMapper xdomeaMessageDataMapper; private final XtaIncomingFilesMapper xtaIncomingFilesMapper; - public void fetchMessages() throws XtaClientException { var transportReports = xtaClient.fetchMessages(messageProcessor); @@ -114,7 +113,7 @@ class XtaService { EingangRepresentationsAndAttachments getRepresentationsAttachmentsPair(XtaMessageMetaData metaData, List<IncomingFile> incomingFiles) { if (isXDomeaMessageType(metaData.messageTypeCode())) { - return xdomeaMessageDataMapper.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFiles); + return xdomeaMessageDataMapper.mapEingangRepresentationsAndAttachments(incomingFiles); } if (isFimMessageType(metaData.messageTypeCode())) { return mapIncomingFilesToRepresentations(incomingFiles); diff --git a/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java b/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java index 92c8ca837ca4aa6ded9bd6d7a1238e801ef19bcd..a82bd209f46b9e00bc6312445ad8cb9cc6528441 100644 --- a/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java +++ b/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java @@ -26,7 +26,6 @@ package de.ozgcloud.eingang.xdomea; import static de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper.*; import static de.ozgcloud.eingang.xdomea.XdomeaMessageDataTestFactory.*; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Collection; @@ -57,9 +56,9 @@ class XdomeaMessageDataMapperTest { @Mock private XdomeaXMLValueReader valueReader; - @DisplayName("map incoming files to representations attachments pair") + @DisplayName("map EingangRepresentationsAndAttachments") @Nested - class TestMapIncomingFilesToEingangRepresentationsAndAttachments { + class TestMapEingangRepresentationsAndAttachments { @Mock private List<IncomingFile> incomingFileList; @@ -70,7 +69,7 @@ class XdomeaMessageDataMapperTest { void shouldMapRepresentations(boolean useUuidPrefix) { mockXdomeaMessageData(useUuidPrefix); - var pair = fileClassifier.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFileList); + var pair = fileClassifier.mapEingangRepresentationsAndAttachments(incomingFileList); var representationFilenames = pair.representations().stream().map(IncomingFile::getName).toList(); assertThat(representationFilenames).containsExactly(XDOMEA_XML_NAME, REPR_XML_NAME, REPR_PDF_NAME); @@ -82,7 +81,7 @@ class XdomeaMessageDataMapperTest { void shouldMapAttachments(boolean useUuidPrefix) { mockXdomeaMessageData(useUuidPrefix); - var pair = fileClassifier.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFileList); + var pair = fileClassifier.mapEingangRepresentationsAndAttachments(incomingFileList); var attachmentFilenames = pair.attachments().stream() .map(IncomingFileGroup::getFiles) @@ -92,6 +91,28 @@ class XdomeaMessageDataMapperTest { assertThat(attachmentFilenames).containsExactly(ATTATCHMENT_XML_NAME, ATTATCHMENT_PNG_NAME, ATTATCHMENT_PDF_NAME); } + @DisplayName("should map primaryFormDataFileName") + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldMapPrimaryFormDataFileName(boolean useUuidPrefix) { + mockXdomeaMessageData(useUuidPrefix); + + var pair = fileClassifier.mapEingangRepresentationsAndAttachments(incomingFileList); + + assertThat(pair.primaryFormDataFileName()).isEqualTo(REPR_XML_NAME); + } + + @DisplayName("should map primaryFormDataPdfFileName") + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldMapPrimaryFormPdfDataFileName(boolean useUuidPrefix) { + mockXdomeaMessageData(useUuidPrefix); + + var pair = fileClassifier.mapEingangRepresentationsAndAttachments(incomingFileList); + + assertThat(pair.primaryFormDataPdfFileName()).isEqualTo(REPR_PDF_NAME); + } + private void mockXdomeaMessageData(boolean useUuidPrefix) { doReturn(XdomeaMessageDataTestFactory.create(useUuidPrefix)).when(fileClassifier).mapIncomingFilesToXdomeaMessageData(incomingFileList); } @@ -129,31 +150,53 @@ class XdomeaMessageDataMapperTest { } } - @DisplayName("find primary representation name") + @DisplayName("find representation file name by suffix") @Nested - class TestFindPrimaryRepresentationName { - private static final String FILE_NAME_WITHOUT_XML_SUFFIX = "some-file-name.pdf"; - private static final String FILE_NAME_WITHOUT_XML_SUFFIX2 = "some-file-name.xml.pdf"; - private static final String FILE_NAME_WITH_XML_SUFFIX = "some-file-name.xml"; - private static final String FILE_NAME_WITH_XML_SUFFIX2 = "some-file-name.pdf.xml"; + class TestFindRepresentationFileNameBySuffix { + private static final String PDF_FILE_NAME = "some-file-name.pdf"; + private static final String PDF_FILE_NAME2 = "some-file-name.xml.pdf"; + private static final String XML_FILE_NAME = "some-file-name.xml"; + private static final String XML_FILE_NAME2 = "some-file-name.pdf.xml"; - @DisplayName("should throw if no xml suffix") + @DisplayName("should return empty if no xml suffix") @Test - void shouldThrowIfNoXmlSuffix() { - var listWithoutSuffix = List.of(FILE_NAME_WITHOUT_XML_SUFFIX, FILE_NAME_WITHOUT_XML_SUFFIX2); + void shouldReturnEmptyIfNoXmlSuffix() { + var namesWithSuffix = List.of(PDF_FILE_NAME, PDF_FILE_NAME2); + + var fileName = fileClassifier.findRepresentationFileNameBySuffix(namesWithSuffix, ".xml"); - assertThrows(TechnicalException.class, () -> fileClassifier.findPrimaryRepresentationName(listWithoutSuffix)); + assertThat(fileName).isEmpty(); } @DisplayName("should return first with xml suffix") @Test void shouldReturnFirstWithXmlSuffix() { - var listWithSuffix = List.of(FILE_NAME_WITHOUT_XML_SUFFIX, FILE_NAME_WITH_XML_SUFFIX, FILE_NAME_WITHOUT_XML_SUFFIX2, - FILE_NAME_WITH_XML_SUFFIX2); + var namesWithSuffix = List.of(PDF_FILE_NAME, XML_FILE_NAME, PDF_FILE_NAME2, + XML_FILE_NAME2); + + var fileName = fileClassifier.findRepresentationFileNameBySuffix(namesWithSuffix, ".xml"); + + assertThat(fileName).isEqualTo(XML_FILE_NAME); + } + + @DisplayName("should return empty if no pdf suffix") + @Test + void shouldReturnEmptyIfNoPdfSuffix() { + var namesWithoutSuffix = List.of(XML_FILE_NAME, XML_FILE_NAME2); - var fileName = fileClassifier.findPrimaryRepresentationName(listWithSuffix); + var fileName = fileClassifier.findRepresentationFileNameBySuffix(namesWithoutSuffix, ".pdf"); - assertThat(fileName).isEqualTo(FILE_NAME_WITH_XML_SUFFIX); + assertThat(fileName).isEmpty(); + } + + @DisplayName("should return first with pdf suffix") + @Test + void shouldReturnFirstWithPdfSuffix() { + var namesWithSuffix = List.of(PDF_FILE_NAME, XML_FILE_NAME, PDF_FILE_NAME2, XML_FILE_NAME2); + + var fileName = fileClassifier.findRepresentationFileNameBySuffix(namesWithSuffix, ".pdf"); + + assertThat(fileName).isEqualTo(PDF_FILE_NAME); } } @@ -184,7 +227,6 @@ class XdomeaMessageDataMapperTest { var representationFileNames = List.of(REPR_PDF_NAME, REPR_XML_NAME); when(valueReader.readRepresentationFileNames(xdomeaXMLFile)).thenReturn(representationFileNames); - doReturn(REPR_XML_NAME).when(fileClassifier).findPrimaryRepresentationName(representationFileNames); } @DisplayName("should contain xdomea metadata file") @@ -204,8 +246,8 @@ class XdomeaMessageDataMapperTest { var resultRepresentationFileNames = classification.representations().stream() .map(IncomingFile::getName) .toList(); - // Expect that the primary representation xml file is moved to the first position - assertThat(resultRepresentationFileNames).isEqualTo(List.of(REPR_XML_NAME, REPR_PDF_NAME)); + + assertThat(resultRepresentationFileNames).isEqualTo(List.of(REPR_PDF_NAME, REPR_XML_NAME)); } @DisplayName("should contain attachments") diff --git a/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java index ee254b4e7c8b0c985a722a5f7917469b191a22a6..7959874bcc2db472b5224680b550a2427ef3a16b 100644 --- a/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java +++ b/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java @@ -296,7 +296,7 @@ class XtaServiceTest { @Test void shouldUseCorrectMapperXdomeaMessageType() { when(messageMetaData.messageTypeCode()).thenReturn(XtaService.XDOMEA_0201_MESSAGE_TYPE); - when(xdomeaMessageDataMapper.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFiles)) + when(xdomeaMessageDataMapper.mapEingangRepresentationsAndAttachments(incomingFiles)) .thenReturn(classification); var result = service.getRepresentationsAttachmentsPair(messageMetaData, incomingFiles);