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 {
ByteArrayInputStream base64ContentStream = new ByteArrayInputStream(base64FileContent.getBytes());
return Base64.getDecoder().wrap(base64ContentStream);
}
}
\ No newline at end of file
......@@ -23,7 +23,7 @@
*/
package de.itvsh.kop.eingangsadapter.formsolutions;
import java.io.ByteArrayInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
......@@ -33,7 +33,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
......@@ -59,7 +58,9 @@ class FormSolutionsRepresentationsMapper {
List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, Optional<String> json) {
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)));
......@@ -67,24 +68,25 @@ class FormSolutionsRepresentationsMapper {
}
private IncomingFile buildJsonFile(String jsonData) {
var size = getSize(new ByteArrayInputStream(jsonData.getBytes()));
var jsonFile = writeFile(jsonData);
return IncomingFile.builder()
.id(UUID.randomUUID().toString())
.contentStream(new ByteArrayInputStream(jsonData.getBytes()))
.file(jsonFile.toFile())
.contentType(JSON_CONTENT_TYPE)
.name(FILE_NAME_JSON_REP)
.size(size)
.size(getFileSize(jsonFile))
.build();
}
private IncomingFile buildPdfFile(String data) {
var size = getSize(FormSolutionsFileMapperUtils.decodeFile(data));
var zipFile = writeFile(FormSolutionsFileMapperUtils.decodeFile(data));
return IncomingFile.builder()
.id(UUID.randomUUID().toString())
.file(zipFile.toFile())
.contentStream(FormSolutionsFileMapperUtils.decodeFile(data))
.contentType(PDF_CONTENT_TYPE)
.name(FILE_NAME_PDF_REP)
.size(size)
.size(getFileSize(zipFile))
.build();
}
......@@ -96,11 +98,24 @@ class FormSolutionsRepresentationsMapper {
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 tmpFile;
try {
tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX);
tmpFile.toFile().deleteOnExit();
var tmpFile = createTmpFile();
Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING);
contentStream.close();
......@@ -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) {
try {
return Files.size(path);
......
......@@ -32,23 +32,19 @@ import static org.mockito.Mockito.*;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
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;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory;
import lombok.SneakyThrows;
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
class TestWriteFile {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment