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 fc61ce304635f52190fc79b1e2f850795a7c300f..7293fb0f6399b0b56f3e8d16bf146013ced93ead 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,8 +23,6 @@ */ package de.itvsh.kop.eingangsadapter.formsolutions; -import static de.itvsh.kop.eingangsadapter.common.file.TempFileUtils.*; - import java.io.File; import java.util.ArrayList; import java.util.List; @@ -51,21 +49,19 @@ class FormSolutionsRepresentationsMapper { public static final String TMP_FILE_PREFIX = "filecached-inputstream-fs"; public static final String TMP_FILE_SUFFIX = ".ozg-cloud.tmp"; - List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, Optional<String> json) { + List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, File jsonFile) { List<IncomingFile> representations = new ArrayList<>(); Optional.ofNullable((String) plainMap.get(PDF)) .filter(StringUtils::isNoneEmpty) .ifPresent(data -> representations.add(buildPdfFile(data))); - json.ifPresent(jsonData -> representations.add(buildJsonFile(jsonData))); + representations.add(buildJsonFile(jsonFile)); return representations; } - private IncomingFile buildJsonFile(String jsonData) { - var jsonFile = writeTmpFile(jsonData); - + private IncomingFile buildJsonFile(File jsonFile) { return IncomingFile.builder() .file(jsonFile) .contentType(JSON_CONTENT_TYPE) diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java index 039c6da7d4dd0604acb52de36fbf57f980cf5986..4d81e93066165ff6fffc5e69cf3c9977a6d9dc39 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java @@ -23,13 +23,14 @@ */ package de.itvsh.kop.eingangsadapter.formsolutions; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Map; -import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -50,36 +51,36 @@ class FormSolutionsRequestMapper { @Autowired private ObjectMapper objectMapper; - public FormData map(String json) { - var formData = buildFormData(json); + public FormData map(File jsonFile) { + var formData = buildFormData(jsonFile); - return mapFiles(formData, json); + return mapFiles(formData, jsonFile); } - private FormData buildFormData(String json) { - return FormData.builder().formData(mapFormData(json)).build(); + private FormData buildFormData(File jsonFile) { + return FormData.builder().formData(mapFormData(jsonFile)).build(); } - Map<String, Object> mapFormData(String json) { - try { - return objectMapper.readValue(json, VALUE_TYPE_REF); - } catch (JsonProcessingException e) { + Map<String, Object> mapFormData(File jsonFile) { + try (var in = new FileInputStream(jsonFile)) { + return objectMapper.readValue(in, VALUE_TYPE_REF); + } catch (IOException e) { throw new TechnicalException("Error parsing JSON from FormSolutions-Server", e); } } - FormData mapFiles(FormData formData, String json) { + FormData mapFiles(FormData formData, File jsonFile) { return FormDataUtils.from(formData) - .put(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, buildMappedFiles(formData, json)) + .put(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, buildMappedFiles(formData, jsonFile)) .remove(FormSolutionsAttachmentsMapper.ZIP) .remove(FormSolutionsRepresentationsMapper.PDF) .build(); } - private Map<String, Object> buildMappedFiles(FormData formData, String json) { + private Map<String, Object> buildMappedFiles(FormData formData, File jsonFile) { return Map.of( FilesMapperHelper.ATTACHMENTS, attachmentMapper.mapAttachments(formData.getFormData()), - FilesMapperHelper.REPRESENTATIONS, representationMapper.mapRepresentations(formData.getFormData(), Optional.of(json))); + FilesMapperHelper.REPRESENTATIONS, representationMapper.mapRepresentations(formData.getFormData(), jsonFile)); } } \ No newline at end of file diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/SendFormEndpoint.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/SendFormEndpoint.java index f78c38ce83a826df23d8a3af00ca85347f6da800..18b06e2919e02764784ccf16e1481f3acad5f028 100644 --- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/SendFormEndpoint.java +++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/SendFormEndpoint.java @@ -23,6 +23,8 @@ */ package de.itvsh.kop.eingangsadapter.formsolutions; +import java.io.File; + import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ws.server.endpoint.annotation.Endpoint; @@ -30,6 +32,7 @@ import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.springframework.ws.server.endpoint.annotation.RequestPayload; import org.springframework.ws.server.endpoint.annotation.ResponsePayload; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter; import lombok.extern.log4j.Log4j2; @@ -48,13 +51,16 @@ public class SendFormEndpoint { @ResponsePayload public Response receiveForm(@RequestPayload Request request) { try { - semantikAdapter.processFormData(requestMapper.map(request.getJSON())); + semantikAdapter.processFormData(requestMapper.map(writeRequestJsonToFile(request.getJSON()))); return buildSuccessResponse(); } catch (Exception e) { LOG.error("Error on processing FormSolutions Formdata.", e); return ExceptionUtils.rethrow(e); } + } + private File writeRequestJsonToFile(String json) { + return TempFileUtils.writeTmpFile(json); } private Response buildSuccessResponse() { diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java index 9f9cdaac34a856eb1213fe8d2adf88f45c92ba29..e96b8cdc0fa2629fdb2d44b2de65412db61caae5 100644 --- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java +++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java @@ -29,10 +29,11 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.io.File; import java.util.List; import java.util.Map; -import java.util.Optional; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -47,6 +48,7 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.itvsh.kop.common.errorhandling.TechnicalException; +import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory; import de.itvsh.kop.eingangsadapter.semantik.enginebased.FilesMapperHelper; @@ -207,9 +209,17 @@ class FormSolutionsRequestMapperTest { @Nested class TestMapFiles { + + private File jsonFile = TempFileUtils.writeTmpFile(ATTACHMENTS_JSON); + + @AfterAll + void deleteTempFile() { + jsonFile.delete(); + } + @Test void shouldCallAttachmentMappers() { - mapper.mapFiles(FormDataTestFactory.create(), ATTACHMENTS_JSON); + mapper.mapFiles(FormDataTestFactory.create(), jsonFile); verify(attachmentMapper).mapAttachments(Mockito.<Map<String, Object>>any()); } @@ -217,23 +227,23 @@ class FormSolutionsRequestMapperTest { @DisplayName("result should have mapped files field") @Test void shouldHaveMappedFilesField() { - var result = mapper.mapFiles(FormDataTestFactory.create(), ATTACHMENTS_JSON); + var result = mapper.mapFiles(FormDataTestFactory.create(), jsonFile); assertThat(result.getFormData()).containsKey(FilesMapperHelper.FIELD_NAME_MAPPED_FILES); } @Test void shouldCallRepresentationMapper() { - mapper.mapFiles(FormDataTestFactory.create(), ATTACHMENTS_JSON); + mapper.mapFiles(FormDataTestFactory.create(), jsonFile); - verify(representationsMapper).mapRepresentations(Mockito.<Map<String, Object>>any(), eq(Optional.of(ATTACHMENTS_JSON))); + verify(representationsMapper).mapRepresentations(Mockito.<Map<String, Object>>any(), jsonFile); } @Test void shouldRemoveZip() { var formData = FormDataTestFactory.withFormDataMaps(Map.of(FormSolutionsAttachmentsMapper.ZIP, "test")); - var dataMap = mapper.mapFiles(formData, ATTACHMENTS_JSON); + var dataMap = mapper.mapFiles(formData, jsonFile); assertThat(dataMap.getFormData()).doesNotContainKey(FormSolutionsAttachmentsMapper.ZIP); } @@ -242,7 +252,7 @@ class FormSolutionsRequestMapperTest { void shouldRemovePdf() { var formData = FormDataTestFactory.withFormDataMaps(Map.of(FormSolutionsRepresentationsMapper.PDF, "test")); - var dataMap = mapper.mapFiles(formData, ATTACHMENTS_JSON); + var dataMap = mapper.mapFiles(formData, jsonFile); assertThat(dataMap.getFormData()).doesNotContainKey(FormSolutionsRepresentationsMapper.PDF); } diff --git a/router/src/main/java/de/itvsh/kop/eingangsadapter/router/VorgangRemoteService.java b/router/src/main/java/de/itvsh/kop/eingangsadapter/router/VorgangRemoteService.java index d96f167c463d7fbbe7be31a74c7fb46c072c0192..120f865a8026aaa5330e803f8c6da3146eab89c9 100644 --- a/router/src/main/java/de/itvsh/kop/eingangsadapter/router/VorgangRemoteService.java +++ b/router/src/main/java/de/itvsh/kop/eingangsadapter/router/VorgangRemoteService.java @@ -23,7 +23,6 @@ */ package de.itvsh.kop.eingangsadapter.router; -import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Optional; @@ -32,6 +31,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -171,15 +171,12 @@ public class VorgangRemoteService { return streamFuture.get(10, TimeUnit.MINUTES); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - throw new TechnicalException(e.getMessage(), e); + throw new TechnicalException("Waiting for finishing upload was interrupted.", e); } catch (ExecutionException | TimeoutException e) { - throw new TechnicalException(e.getMessage(), e); + streamFuture.cancel(true); + throw new TechnicalException("Error / Timeout on uploading data.", e); } finally { - try { - fileContentStream.close(); - } catch (IOException e) { - LOG.debug("Error closing fileContentStream", e); - } + IOUtils.closeQuietly(fileContentStream); } }