diff --git a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/file/TempFileUtils.java b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/file/TempFileUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..c3ce49a7b15ed125c4a3ab14e303e0fd73fe1754 --- /dev/null +++ b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/file/TempFileUtils.java @@ -0,0 +1,72 @@ +package de.itvsh.kop.eingangsadapter.common.file; + +import static de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile.*; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +import org.apache.commons.io.FileUtils; + +import de.itvsh.kop.common.errorhandling.TechnicalException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TempFileUtils { + + public static File writeTmpFile(InputStream contentStream) { + try { + var tmpFile = createTmpFile(); + + Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING); + contentStream.close(); + return tmpFile.toFile(); + } catch (IOException e) { + throw new TechnicalException("Error writing file to temp file.", e); + } + } + + public static File writeTmpFile(String stringData) { + try { + Path tmpFile = createTmpFile(); + + try (var writer = new FileWriter(tmpFile.toFile())) { + writer.write(stringData); + writer.flush(); + } + + return tmpFile.toFile(); + } catch (IOException e) { + throw new TechnicalException("Error writing file to temp file.", e); + } + } + + public static File writeTmpFile(byte[] data) { + try { + Path tmpFile = createTmpFile(); + + FileUtils.writeByteArrayToFile(tmpFile.toFile(), data); + + return tmpFile.toFile(); + } catch (IOException e) { + throw new TechnicalException("Error writing file to temp file.", e); + } + + } + + public static Path createTmpFile() { + try { + var tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX); + tmpFile.toFile().deleteOnExit(); + return tmpFile; + } catch (IOException e) { + throw new TechnicalException("Error creating temporary file.", e); + } + + } +} diff --git a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java index 97c3308d87326b22f659367135c758fe787122a3..00734f365d2ce8deb8621998aad7706759dd1fb2 100644 --- a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java +++ b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java @@ -26,12 +26,7 @@ package de.itvsh.kop.eingangsadapter.common.formdata; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.IOException; import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.Objects; import de.itvsh.kop.common.errorhandling.TechnicalException; import lombok.Builder; @@ -54,13 +49,7 @@ public class IncomingFile { private File file; - @ToString.Exclude - private InputStream contentStream; - public InputStream getContentStream() { - if (Objects.isNull(file)) { - file = writeToFile(); - } try { return new FileInputStream(file); } catch (FileNotFoundException e) { @@ -69,24 +58,7 @@ public class IncomingFile { } public InputStream getContentStreamForFinalRead() { - if (Objects.isNull(contentStream)) { - return DeleteOnCloseInputStream.from(file); - } - return contentStream; + return DeleteOnCloseInputStream.from(file); } - File writeToFile() { - Path tmpFile; - try { - tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX); - tmpFile.toFile().deleteOnExit(); - - Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING); - contentStream.close(); - contentStream = null; - return tmpFile.toFile(); - } catch (IOException e) { - throw new TechnicalException("Error writing incoming file to temp file.", e); - } - } } diff --git a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java index aa73c1abac24a857f878cce2977f624bd2b9720e..0526ce6e1106d083c1b905b33c74d3b293c30893 100644 --- a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java +++ b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java @@ -1,14 +1,10 @@ package de.itvsh.kop.eingangsadapter.common.formdata; +import static de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory.*; import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; -import java.io.ByteArrayInputStream; import java.io.File; -import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Predicate; @@ -17,15 +13,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import de.itvsh.kop.common.errorhandling.TechnicalException; import lombok.SneakyThrows; class IncomingFileTest { private static final String TMP_DIRECTORY_PATH = System.getProperty("java.io.tmpdir"); - private static final String TEST_CONTENT = "test123"; - private static final Predicate<Path> hasNameSuffix = path -> path.getFileName().toString().endsWith(IncomingFile.TMP_FILE_SUFFIX); @Nested @@ -38,14 +31,14 @@ class IncomingFileTest { @Test void shouldCreateTmpFile() { - createTestIncomingFile().getContentStream(); + IncomingFileTestFactory.create().getContentStream(); assertThat(noFilesWithSuffixInTempDirectory()).isFalse(); } @Test void shouldCreateDeleteOnCloseInputStream() { - var file = createTestIncomingFile(); + var file = IncomingFileTestFactory.create(); file.getContentStream(); InputStream newStream = file.getContentStreamForFinalRead(); @@ -54,16 +47,16 @@ class IncomingFileTest { @Test void validateInputStreamContent() { - InputStream newStream = createTestIncomingFile().getContentStream(); + InputStream newStream = IncomingFileTestFactory.create().getContentStream(); - String text = convertResultToString(newStream); + byte[] text = read(newStream); - assertThat(text).isEqualTo(TEST_CONTENT); + assertThat(text).isEqualTo(CONTENT); } @Test void shouldReturnNewInputStreamOnEveryRequest() { - IncomingFile incomingFile = createTestIncomingFile(); + IncomingFile incomingFile = IncomingFileTestFactory.create(); InputStream stream1 = incomingFile.getContentStream(); InputStream stream2 = incomingFile.getContentStream(); @@ -73,25 +66,21 @@ class IncomingFileTest { @Test void contentStreamShouldBeMultipleReadable() { - IncomingFile incomingFile = createTestIncomingFile(); + IncomingFile incomingFile = IncomingFileTestFactory.create(); InputStream stream1 = incomingFile.getContentStream(); InputStream stream2 = incomingFile.getContentStream(); - assertThat(convertResultToString(stream1)).isEqualTo(TEST_CONTENT); - assertThat(convertResultToString(stream2)).isEqualTo(TEST_CONTENT); + assertThat(read(stream1)).isEqualTo(CONTENT); + assertThat(read(stream2)).isEqualTo(CONTENT); InputStream stream3 = incomingFile.getContentStream(); - assertThat(convertResultToString(stream3)).isEqualTo(TEST_CONTENT); + assertThat(read(stream3)).isEqualTo(CONTENT); } @SneakyThrows - private String convertResultToString(InputStream newStream) { - return new String(newStream.readAllBytes(), StandardCharsets.UTF_8); - } - - IncomingFile createTestIncomingFile() { - return IncomingFile.builder().contentStream(new ByteArrayInputStream(TEST_CONTENT.getBytes())).build(); + private byte[] read(InputStream stream) { + return stream.readAllBytes(); } } @@ -105,17 +94,4 @@ class IncomingFileTest { return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix); } - @Nested - class TestWriteToFile { - @Test - @SneakyThrows - void shouldThrowTechnicalException() { - InputStream closedStream = mock(InputStream.class); - when(closedStream.transferTo(any())).thenThrow(IOException.class); - var file = IncomingFileTestFactory.createBuilder().contentStream(closedStream).build(); - - assertThatThrownBy(() -> file.writeToFile()).isInstanceOf(TechnicalException.class); - - } - } } diff --git a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java index 4cc9e18993faf7e6cea281cfa5a1d28f6c0d5596..22ab835d30059a5880f6c19d1f6af380301904da 100644 --- a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java +++ b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java @@ -23,12 +23,12 @@ */ package de.itvsh.kop.eingangsadapter.common.formdata; -import java.io.ByteArrayInputStream; import java.util.UUID; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile.IncomingFileBuilder; import lombok.SneakyThrows; @@ -53,7 +53,7 @@ public class IncomingFileTestFactory { .vendorId(VENDOR_ID) .name(NAME) .contentType(CONTENT_TYPE) - .contentStream(new ByteArrayInputStream(CONTENT)) + .file(TempFileUtils.writeTmpFile(CONTENT)) .size(SIZE); } diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java index 1702267a0ca19cf37ef769e1d6c2a41394bbe643..2462250618ed2967d8722067fa1fac675aacce54 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java @@ -40,6 +40,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup; @@ -110,7 +111,7 @@ class FormDataController { .name(multipartFile.getOriginalFilename()) .size(multipartFile.getSize()) .contentType(multipartFile.getContentType()) - .contentStream(multipartFile.getInputStream()) + .file(TempFileUtils.writeTmpFile(multipartFile.getInputStream())) .build(); } catch (IOException e) { throw new TechnicalException("Error reading incoming file", e); diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java index 91c647211d5e3d4c390cabf8bf0ee6426e8816bd..8b1cec63b3749e014bb49f84a1b3f0afdc16f678 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java @@ -23,8 +23,6 @@ */ package de.itvsh.kop.eingangsadapter.formsolutions; -import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFileMapperUtils.*; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -46,7 +44,9 @@ class FormSolutionsAttachmentsMapper { public static final String FILE_GROUP_ZIP_NAME = "gezippte Anhänge"; List<IncomingFileGroup> mapAttachments(Map<String, Object> data) { - return mapZipRepresentation(Optional.ofNullable((String) data.get(ZIP))); + var result = mapZipRepresentation(Optional.ofNullable((String) data.get(ZIP))); + data.remove(ZIP); + return result; } List<IncomingFileGroup> mapZipRepresentation(Optional<String> encodedZip) { @@ -67,7 +67,7 @@ class FormSolutionsAttachmentsMapper { private IncomingFile buildZipFile(String content) { return IncomingFile.builder() .id(UUID.randomUUID().toString()) - .contentStream(decodeFile(content)) + .file(FormSolutionsFileMapperUtils.decodeBase64Content(content)) .contentType(ZIP_CONTENT_TYPE) .name(FILE_NAME_ZIP_ATTACHMENT) .build(); diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java index 54562447257da8fbf25cd295bdb33422d2c39906..02dad87a32c47da80d5322c7454bce5ec92dc44d 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java @@ -24,9 +24,17 @@ package de.itvsh.kop.eingangsadapter.formsolutions; import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.util.Base64; +import org.apache.commons.io.IOUtils; + +import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -39,4 +47,20 @@ class FormSolutionsFileMapperUtils { return Base64.getDecoder().wrap(base64ContentStream); } + static InputStream decode(InputStream b64InputStream) { + return Base64.getDecoder().wrap(b64InputStream); + } + + static File decodeBase64Content(String content) { + var b64File = TempFileUtils.writeTmpFile(content); + var tempFile = TempFileUtils.createTmpFile(); + + try (var in = new FileInputStream(b64File); var out = new FileOutputStream(tempFile.toFile())) { + IOUtils.copy(FormSolutionsFileMapperUtils.decode(in), out); + out.flush(); + return tempFile.toFile(); + } catch (IOException e) { + throw new TechnicalException("Error decoding and saving b64 file.", e); + } + } } \ No newline at end of file diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java index f6e4e1599d36d38727a6f3727ef9b83aaeea872e..fc61ce304635f52190fc79b1e2f850795a7c300f 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java @@ -23,12 +23,9 @@ */ package de.itvsh.kop.eingangsadapter.formsolutions; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; +import static de.itvsh.kop.eingangsadapter.common.file.TempFileUtils.*; + +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -38,7 +35,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; -import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; @Component @@ -68,82 +64,25 @@ class FormSolutionsRepresentationsMapper { } private IncomingFile buildJsonFile(String jsonData) { - var jsonFile = writeFile(jsonData); + var jsonFile = writeTmpFile(jsonData); return IncomingFile.builder() - .file(jsonFile.toFile()) + .file(jsonFile) .contentType(JSON_CONTENT_TYPE) .name(FILE_NAME_JSON_REP) - .size(getFileSize(jsonFile)) + .size(jsonFile.length()) .build(); } private IncomingFile buildPdfFile(String data) { - var zipFile = writeFile(FormSolutionsFileMapperUtils.decodeFile(data)); + File file = FormSolutionsFileMapperUtils.decodeBase64Content(data); return IncomingFile.builder() - .file(zipFile.toFile()) - .contentStream(FormSolutionsFileMapperUtils.decodeFile(data)) + .file(file) .contentType(PDF_CONTENT_TYPE) .name(FILE_NAME_PDF_REP) - .size(getFileSize(zipFile)) + .size(file.length()) .build(); } - long getSize(InputStream contentStream) { - var path = writeFile(contentStream); - var size = getFileSize(path); - deleteTmpFile(path); - - return size; - } - - Path writeFile(String stringData) { - try { - Path tmpFile = createTmpFile(); - - try (var writer = new FileWriter(tmpFile.toFile())) { - writer.write(stringData); - writer.flush(); - } - - return tmpFile; - } catch (IOException e) { - throw new TechnicalException("Error writing file to temp file.", e); - } - } - - Path writeFile(InputStream contentStream) { - try { - var tmpFile = createTmpFile(); - - Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING); - contentStream.close(); - return tmpFile; - } catch (IOException e) { - throw new TechnicalException("Error writing file to temp file.", e); - } - } - - private Path createTmpFile() throws IOException { - var tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX); - tmpFile.toFile().deleteOnExit(); - return tmpFile; - } - - long getFileSize(Path path) { - try { - return Files.size(path); - } catch (IOException e) { - throw new TechnicalException("Error calculate size of tmp file.", e); - } - } - - void deleteTmpFile(Path path) { - try { - Files.deleteIfExists(path); - } catch (IOException e) { - throw new TechnicalException("Error delete tmp file.", e); - } - } } \ No newline at end of file diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java index 96033bf41979ee4a9c1e6a892380784f4b0ad676..bc88f739b6302c289de38aab59c77ce25c511581 100644 --- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java +++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java @@ -27,11 +27,7 @@ import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFact import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFilesTestFactory.*; import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsRepresentationsMapper.*; import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; -import java.io.IOException; -import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Optional; @@ -41,7 +37,6 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.Spy; -import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.test.TestUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; @@ -156,16 +151,4 @@ class FormSolutionsRepresentationsMapperTest { } } - @Nested - class TestWriteFile { - - @Test - @SneakyThrows - void shouldThrowTechnicalException() { - InputStream closedStream = mock(InputStream.class); - when(closedStream.transferTo(any())).thenThrow(IOException.class); - - assertThatThrownBy(() -> mapper.writeFile(closedStream)).isInstanceOf(TechnicalException.class); - } - } } diff --git a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java index 362928686d7aba6b7d7309bf58acfab618abb231..d126559dc1916ae4ba0f7b8742087281b77bfa7b 100644 --- a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java +++ b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java @@ -23,7 +23,7 @@ */ package de.itvsh.kop.eingangsadapter.intelliform; -import java.io.InputStream; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,24 +36,24 @@ import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup; @Component public class AttachmentsContentAdder { - List<IncomingFileGroup> addContentToAttachments(List<IncomingFileGroup> formDataFileGroups, List<IncomingFile> depositRequestFiles) { + public List<IncomingFileGroup> addContentToAttachments(List<IncomingFileGroup> formDataFileGroups, List<IncomingFile> depositRequestFiles) { var fileGroups = new ArrayList<IncomingFileGroup>(formDataFileGroups.size()); for (IncomingFileGroup fileGroup : formDataFileGroups) { var files = fileGroup.getFiles().stream() - .map(file -> file.toBuilder().contentStream(getContentStreamFromDepositRequest(file.getVendorId(), depositRequestFiles)).build()) + .map(file -> file.toBuilder().file(getContentStreamFromDepositRequest(file.getVendorId(), depositRequestFiles)).build()) .toList(); fileGroups.add(fileGroup.toBuilder().clearFiles().files(files).build()); } return Collections.unmodifiableList(fileGroups); } - private InputStream getContentStreamFromDepositRequest(String attachmentVendorId, List<IncomingFile> depositRequestFiles) { + private File getContentStreamFromDepositRequest(String attachmentVendorId, List<IncomingFile> depositRequestFiles) { return depositRequestFiles.stream() .filter(depositFile -> depositFile.getVendorId().equals(attachmentVendorId)) - .map(IncomingFile::getContentStream) + .map(IncomingFile::getFile) .findFirst() .orElseThrow(() -> new RuntimeException( - "DepositFiles does not contain content for (XML-Daten-)attachment with vendorId: " + attachmentVendorId)); + "DepositFiles does not contain content for attachment with vendorId: " + attachmentVendorId)); } } diff --git a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java index 1207c0c3719f8ec3733b981ed0fce57295796b6f..102e4fae4b97d712c74c2da4ae1c3293580ea385 100644 --- a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java +++ b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java @@ -23,12 +23,12 @@ */ package de.itvsh.kop.eingangsadapter.intelliform; -import java.io.ByteArrayInputStream; import java.util.List; import java.util.UUID; import org.springframework.stereotype.Component; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; @Component @@ -36,17 +36,19 @@ class DepositRequestIncomingFileMapper { List<IncomingFile> mapFiles(Deposit depositData) { return depositData.getData().getAttachments().stream() - .map(this::map).toList(); + .map(this::buildIncomingFile).toList(); } - private IncomingFile map(Attachment xa) { + private IncomingFile buildIncomingFile(Attachment attachment) { + var file = TempFileUtils.writeTmpFile(attachment.content); + return IncomingFile.builder() .id(UUID.randomUUID().toString()) - .vendorId(xa.getId()) - .name(xa.getName()) - .contentType(xa.getContentType()) - .contentStream(new ByteArrayInputStream(xa.content)) - .size(xa.getContent().length) + .vendorId(attachment.getId()) + .name(attachment.getName()) + .file(file) + .contentType(attachment.getContentType()) + .size(attachment.getContent().length) .build(); } } diff --git a/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java b/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java index 040a00dd39f95ba5528e72f8091787919418ecdf..c8ea8bb58088c605a66768ac15461c0aef385bd7 100644 --- a/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java +++ b/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java @@ -25,7 +25,6 @@ package de.itvsh.kop.eingangsadapter.intelliform; import static org.assertj.core.api.Assertions.*; -import java.io.ByteArrayInputStream; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -39,8 +38,6 @@ import lombok.SneakyThrows; class AttachmentsContentAdderTest { - private final static byte[] TESTCONTENT1 = "TestBytes".getBytes(); - AttachmentsContentAdder service; private List<IncomingFileGroup> attachments; @@ -53,9 +50,9 @@ class AttachmentsContentAdderTest { service = new AttachmentsContentAdder(); attachments = List.of(IncomingFileGroupTestFactory.createBuilder().clearFiles() - .files(List.of(IncomingFileTestFactory.createBuilder().contentStream(null).build())).build()); + .files(List.of(IncomingFileTestFactory.createBuilder().file(null).build())).build()); - depositRequestFiles = List.of(IncomingFileTestFactory.createBuilder().contentStream(new ByteArrayInputStream(TESTCONTENT1)).build()); + depositRequestFiles = List.of(IncomingFileTestFactory.create()); } @SneakyThrows @@ -63,6 +60,6 @@ class AttachmentsContentAdderTest { void testAddContentToAttachments() { List<IncomingFileGroup> attachmentsWithContent = service.addContentToAttachments(attachments, depositRequestFiles); - assertThat(attachmentsWithContent.get(0).getFiles().get(0).getContentStream()).hasBinaryContent(TESTCONTENT1); + assertThat(attachmentsWithContent.get(0).getFiles().get(0).getContentStream()).hasBinaryContent(IncomingFileTestFactory.CONTENT); } } diff --git a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/IncomingFileTestFactory.java b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/IncomingFileTestFactory.java deleted file mode 100644 index adca159776887be504d48e0326b3bd3b02a4c32c..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/IncomingFileTestFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.itvsh.kop.eingangsadapter.router; - -import java.io.ByteArrayInputStream; -import java.util.UUID; - -import de.itvsh.kop.common.binaryfile.FileId; -import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class IncomingFileTestFactory { - - public static final FileId ID = FileId.createNew(); - public static final String VENDOR_ID = UUID.randomUUID().toString(); - public static final String NAME = "XML-Daten.xml"; - public static final String CONTENT_TYPE_STR = "application/xml"; - public static final byte[] CONTENT = "Da ziehe ich meinen virtuellen Hut!".getBytes(); - public static final long SIZE = CONTENT.length; - - public static IncomingFile create() { - return createBuilder().build(); - } - - public static IncomingFile.IncomingFileBuilder createBuilder() { - return IncomingFile.builder() - .id(ID.toString()) - .vendorId(VENDOR_ID) - .name(NAME) - .contentType(CONTENT_TYPE_STR) - .size(SIZE) - .contentStream(new ByteArrayInputStream(CONTENT)); - } -} diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java index ba36758d2e4a7efbf2f3c0bdd0a95f0bffd50170..1c0b1d2adb4375ebb623baa264db867dca5bbc06 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java @@ -197,18 +197,15 @@ public class ZipAttachmentReader { } IncomingFile createContentEntry(File file, ZipEntry zipEntry) { - try { - return IncomingFile.builder() - .name(zipEntry.getName()) - .size(zipEntry.getSize()) - .contentType(getContentType(zipEntry.getName())) - .contentStream(new DeleteOnCloseInputStream(file)) - .build(); - } catch (FileNotFoundException e) { - throw new TechnicalException("Original ZIP was deleted before it was processed", e); - } + return IncomingFile.builder() + .name(zipEntry.getName()) + .size(zipEntry.getSize()) + .contentType(getContentType(zipEntry.getName())) + .file(file) + .build(); } + @Deprecated public InputStream getSourceZipAsStream() { try { return new DeleteOnCloseInputStream(sourceZipFile); @@ -217,6 +214,10 @@ public class ZipAttachmentReader { } } + public File getSourceZip() { + return sourceZipFile; + } + public long getSourceFileSize() { try { return Files.size(sourceZipFile.toPath()); diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java index bc88c2473afdf5fa77a67224f5e1061a58098e9a..e9cefb935f05c54d14b8384d065d8038cfa88974 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java @@ -46,7 +46,8 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { public FormData parseFormData(FormData srcFormData) { var formDataBuilder = FilesMapperHelper.getAttachedFileGroups(srcFormData) .map(this::collectAttachmentContent) - .map(fileGroups -> srcFormData.toBuilder().attachments(fileGroups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(fileGroups))) + .map(fileGroups -> srcFormData.toBuilder().attachments(fileGroups) + .numberOfAttachments(FilesMapperHelper.countAttachedFiles(fileGroups))) .orElseGet(srcFormData::toBuilder); FilesMapperHelper.getRepresentations(srcFormData) @@ -78,7 +79,7 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { return IncomingFile.builder() .name(zipAttachment.getSourceFileName()) .size(zipAttachment.getSourceFileSize()) - .contentStream(zipAttachment.getSourceZipAsStream()) + .file(zipAttachment.getSourceZip()) .contentType(ZIP_CONTENT_TYPE) .build(); } diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java index c4ca4ef958174919e48d9ceea438bc8314142b4e..1449e6279dc4b77fd53ad7cf6a5f9ca0912c3365 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java @@ -25,22 +25,17 @@ package de.itvsh.kop.eingangsadapter.semantik.enginebased; import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*; import static de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory.*; -import static de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FilesMapperHelper.*; +import static de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; import static org.assertj.core.api.Assertions.*; -import java.nio.charset.Charset; +import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Optional; -import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; -import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroupTestFactory; -import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory; -import de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter; -import lombok.SneakyThrows; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -54,9 +49,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.itvsh.kop.common.test.TestUtils; import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; +import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; +import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroupTestFactory; +import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory; import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter; -import org.testcontainers.shaded.org.apache.commons.io.IOUtils; +import de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter; +import lombok.SneakyThrows; @SpringBootTest @ActiveProfiles({ "local", "itcase" }) @@ -273,7 +273,7 @@ public class FormSolutionsEngineBasedAdapterITCase { .clearFiles() .file(IncomingFileTestFactory.createBuilder() .name(FILE_NAME_ZIP_ATTACHMENT) - .contentStream(TestUtils.loadFile(FILE_NAME_ZIP_ATTACHMENT)) + .file(asFile(FILE_NAME_ZIP_ATTACHMENT)) .size(getFileSize(FILE_NAME_ZIP_ATTACHMENT)) .contentType(ZIP_CONTENT_TYPE) .build()) @@ -290,12 +290,12 @@ public class FormSolutionsEngineBasedAdapterITCase { return List.of( IncomingFileTestFactory.createBuilder() .name(FILE_NAME_PDF_REP) - .contentStream(TestUtils.loadFile(FILE_NAME_PDF_REP)) + .file(asFile(FILE_NAME_PDF_REP)) .size(getFileSize(FILE_NAME_PDF_REP)) .contentType(PDF_CONTENT_TYPE).build(), IncomingFileTestFactory.createBuilder() .name(FILE_NAME_JSON_REP) - .contentStream(IOUtils.toInputStream(SIMPLE_JSON_DATA, Charset.defaultCharset())) + .file(TempFileUtils.writeTmpFile(SIMPLE_JSON_DATA)) .size(SIMPLE_JSON_DATA.length()) .contentType(JSON_CONTENT_TYPE).build()); } @@ -316,4 +316,8 @@ public class FormSolutionsEngineBasedAdapterITCase { throw new TechnicalException("Error parsing test JSON " + msg, e); } } + + private File asFile(String path) { + return TempFileUtils.writeTmpFile(TestUtils.loadFile(path)); + } } diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java index ee2f48122124b14ea5535ffe7eafed9aa748cacd..e28bd3292374d64b4bd73f40f41b6836fa91b35b 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java @@ -18,6 +18,7 @@ import org.mockito.Mock; import org.mockito.Spy; import de.itvsh.kop.common.test.TestUtils; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; @@ -123,8 +124,10 @@ class DFoerdermittelFormBasedMapperTest { } IncomingFile createFachnachrichtFile() { + var tmpFile = TempFileUtils.writeTmpFile(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml")); + return IncomingFile.builder() - .contentStream(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml")) + .file(tmpFile) .contentType("application/xml") .size(1283) .name("Beispieldatensatz_Fachnachricht.xml")