Skip to content
Snippets Groups Projects
Commit e485ef17 authored by OZGCloud's avatar OZGCloud
Browse files

fix writing to file without to much buffering

parent 1d3537d0
No related branches found
No related tags found
No related merge requests found
...@@ -38,4 +38,5 @@ class FormSolutionsFileMapperUtils { ...@@ -38,4 +38,5 @@ class FormSolutionsFileMapperUtils {
ByteArrayInputStream base64ContentStream = new ByteArrayInputStream(base64FileContent.getBytes()); ByteArrayInputStream base64ContentStream = new ByteArrayInputStream(base64FileContent.getBytes());
return Base64.getDecoder().wrap(base64ContentStream); return Base64.getDecoder().wrap(base64ContentStream);
} }
} }
\ No newline at end of file
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
*/ */
package de.itvsh.kop.eingangsadapter.formsolutions; package de.itvsh.kop.eingangsadapter.formsolutions;
import java.io.ByteArrayInputStream; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
...@@ -33,7 +33,6 @@ import java.util.ArrayList; ...@@ -33,7 +33,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
...@@ -59,7 +58,9 @@ class FormSolutionsRepresentationsMapper { ...@@ -59,7 +58,9 @@ class FormSolutionsRepresentationsMapper {
List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, Optional<String> json) { List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, Optional<String> json) {
List<IncomingFile> representations = new ArrayList<>(); List<IncomingFile> representations = new ArrayList<>();
Optional.ofNullable((String) plainMap.get(PDF)).filter(StringUtils::isNoneEmpty).ifPresent(data -> representations.add(buildPdfFile(data))); Optional.ofNullable((String) plainMap.get(PDF))
.filter(StringUtils::isNoneEmpty)
.ifPresent(data -> representations.add(buildPdfFile(data)));
json.ifPresent(jsonData -> representations.add(buildJsonFile(jsonData))); json.ifPresent(jsonData -> representations.add(buildJsonFile(jsonData)));
...@@ -67,24 +68,25 @@ class FormSolutionsRepresentationsMapper { ...@@ -67,24 +68,25 @@ class FormSolutionsRepresentationsMapper {
} }
private IncomingFile buildJsonFile(String jsonData) { private IncomingFile buildJsonFile(String jsonData) {
var size = getSize(new ByteArrayInputStream(jsonData.getBytes())); var jsonFile = writeFile(jsonData);
return IncomingFile.builder() return IncomingFile.builder()
.id(UUID.randomUUID().toString()) .file(jsonFile.toFile())
.contentStream(new ByteArrayInputStream(jsonData.getBytes()))
.contentType(JSON_CONTENT_TYPE) .contentType(JSON_CONTENT_TYPE)
.name(FILE_NAME_JSON_REP) .name(FILE_NAME_JSON_REP)
.size(size) .size(getFileSize(jsonFile))
.build(); .build();
} }
private IncomingFile buildPdfFile(String data) { private IncomingFile buildPdfFile(String data) {
var size = getSize(FormSolutionsFileMapperUtils.decodeFile(data)); var zipFile = writeFile(FormSolutionsFileMapperUtils.decodeFile(data));
return IncomingFile.builder() return IncomingFile.builder()
.id(UUID.randomUUID().toString()) .file(zipFile.toFile())
.contentStream(FormSolutionsFileMapperUtils.decodeFile(data)) .contentStream(FormSolutionsFileMapperUtils.decodeFile(data))
.contentType(PDF_CONTENT_TYPE) .contentType(PDF_CONTENT_TYPE)
.name(FILE_NAME_PDF_REP) .name(FILE_NAME_PDF_REP)
.size(size) .size(getFileSize(zipFile))
.build(); .build();
} }
...@@ -96,11 +98,24 @@ class FormSolutionsRepresentationsMapper { ...@@ -96,11 +98,24 @@ class FormSolutionsRepresentationsMapper {
return size; 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) { Path writeFile(InputStream contentStream) {
Path tmpFile;
try { try {
tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX); var tmpFile = createTmpFile();
tmpFile.toFile().deleteOnExit();
Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING); Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING);
contentStream.close(); contentStream.close();
...@@ -110,6 +125,12 @@ class FormSolutionsRepresentationsMapper { ...@@ -110,6 +125,12 @@ class FormSolutionsRepresentationsMapper {
} }
} }
private Path createTmpFile() throws IOException {
var tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX);
tmpFile.toFile().deleteOnExit();
return tmpFile;
}
long getFileSize(Path path) { long getFileSize(Path path) {
try { try {
return Files.size(path); return Files.size(path);
......
...@@ -32,23 +32,19 @@ import static org.mockito.Mockito.*; ...@@ -32,23 +32,19 @@ import static org.mockito.Mockito.*;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.errorhandling.TechnicalException;
import de.itvsh.kop.common.test.TestUtils; import de.itvsh.kop.common.test.TestUtils;
import de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory;
import lombok.SneakyThrows; import lombok.SneakyThrows;
class FormSolutionsRepresentationsMapperTest { class FormSolutionsRepresentationsMapperTest {
...@@ -160,44 +156,6 @@ class FormSolutionsRepresentationsMapperTest { ...@@ -160,44 +156,6 @@ class FormSolutionsRepresentationsMapperTest {
} }
} }
@DisplayName("Get Size")
@Nested
class TestGetSize {
@Mock
private InputStream stream;
@Mock
private Path path;
@BeforeEach
void mock() {
doReturn(path).when(mapper).writeFile(any());
doReturn(IncomingFileTestFactory.SIZE).when(mapper).getFileSize(any());
doNothing().when(mapper).deleteTmpFile(any());
}
@Test
void shouldWriteFile() {
mapper.getSize(stream);
verify(mapper).writeFile(stream);
}
@Test
void shouldGetFileSize() {
mapper.getSize(stream);
verify(mapper).getFileSize(path);
}
@Test
void shouldDeleteTmpFile() {
mapper.getSize(stream);
verify(mapper).deleteTmpFile(path);
}
}
@Nested @Nested
class TestWriteFile { class TestWriteFile {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment