diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java index 27d668debea6b1b69e56f327dcdea56493b4515d..44a034a849e5b5a34f20f4a369122aac82cf6d80 100644 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java +++ b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java @@ -54,8 +54,11 @@ public class FormData { @Builder.Default private Map<String, Object> formData = Collections.emptyMap(); + private int numberOfAttachments; @Singular private List<IncomingFileGroup> attachments; + + private int numberOfRepresentations; @Singular private List<IncomingFile> representations; diff --git a/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java b/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java index b205c7e48052942ce401c52565c628857383977b..8f060cb8fa68e7045e788920dc9d5e6364fed2c1 100644 --- a/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java +++ b/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java @@ -25,6 +25,7 @@ package de.ozgcloud.eingang.common.zip; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -42,6 +43,7 @@ import java.util.zip.ZipInputStream; import org.springframework.util.MimeTypeUtils; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; +import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream; import de.ozgcloud.eingang.common.formdata.IncomingFile; import lombok.Getter; import lombok.extern.log4j.Log4j2; @@ -212,10 +214,27 @@ public class ZipAttachmentReader { .build(); } + @Deprecated + public InputStream getSourceZipAsStream() { + try { + return new DeleteOnCloseInputStream(sourceZipFile); + } catch (FileNotFoundException e) { + throw new TechnicalException("Original ZIP was deleted", e); + } + } + public File getSourceZip() { return sourceZipFile; } + public long getSourceFileSize() { + try { + return Files.size(sourceZipFile.toPath()); + } catch (IOException e) { + throw new TechnicalException("Cannot get size of source ZIP.", e); + } + } + String getContentType(String name) { Objects.requireNonNull(name); return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java index 9dced378f2a744c234a0abc57365ee48f6d5e446..05bdcffff581a6e8ce7e4f56fe5d86cb53054bb0 100644 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java +++ b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java @@ -65,11 +65,13 @@ public class FormDataTestFactory { SUBFORM_KEY, SUBFORM_VALUE, NESTED_LIST_WITH_STRINGS_KEY, NESTED_LIST_WITH_STRINGS, NESTED_LIST_WITH_OBJECTS_KEY, NESTED_LIST_WITH_OBJECTS)) + // TODO nach entfernen des zweiten Attachments den Wert auf 1 setzen + .numberOfAttachments(2) + // TODO zweites Attachment aus der TestFactory entfernen und die entsprechenden + // Tests anpassen .attachments(List.of(IncomingFileGroupTestFactory.create(), - IncomingFileGroupTestFactory.createBuilder() - .name(ATTACHMENT_GROUP_2) - .file(IncomingFileTestFactory.create()) - .build())) + IncomingFileGroupTestFactory.createBuilder().name(ATTACHMENT_GROUP_2).build())) + .numberOfRepresentations(1) .representations(List.of(IncomingFileTestFactory.create())); } diff --git a/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java b/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java index a8bdbe27d084c75abd689628a79e46350c91766b..8cd2ad76c5b602b4b4e9096211afca5621c8569b 100644 --- a/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java +++ b/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java @@ -33,7 +33,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.function.Predicate; -import java.util.stream.Stream; import java.util.zip.ZipException; import java.util.zip.ZipInputStream; @@ -47,7 +46,6 @@ import org.mockito.Spy; import org.springframework.util.MimeTypeUtils; import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream; import de.ozgcloud.eingang.common.formdata.IncomingFile; import lombok.SneakyThrows; @@ -75,11 +73,20 @@ class ZipAttachmentReaderTest { @SneakyThrows private void verifySourceFileSavedInTmpDirectory() { - try (Stream<Path> paths = Files.find(Path.of(getTmpDirectoryPath()), 1, - ((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX)))) { - List<Path> foundFiles = paths.toList(); - assertThat(foundFiles).hasSize(1); - } + List<Path> foundFiles = Files.find(Path.of(getTmpDirectoryPath()), 1, + ((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX))) + .toList(); + assertThat(foundFiles).hasSize(1).first(); + } + + @Test + @DisplayName("should return readable input stream for source zip file") + void shouldReturnSourceStream() { + var expectedContent = TestUtils.loadFile(ZIP_1_FILE_NAME); + + var sourceZipAsStream = createZipAttachment(ZIP_1_FILE_NAME).getSourceZipAsStream(); + + assertThat(sourceZipAsStream).hasSameContentAs(expectedContent); } @Test @@ -128,7 +135,7 @@ class ZipAttachmentReaderTest { var attachmentContentList = new ZipAttachmentReader().readContent(loadZip(ZIP_1_FILE_NAME)); assertThat(attachmentContentList).hasSize(1); - var contentEntry = attachmentContentList.getFirst(); + var contentEntry = attachmentContentList.get(0); assertThat(contentEntry.getName()).isEqualTo(content_file_0_name); assertThat(contentEntry.getSize()).isEqualTo(content_file_0_size); assertThat(contentEntry.getContentStream()).hasSameContentAs(TestUtils.loadFile(content_file_0_name)); @@ -162,7 +169,6 @@ class ZipAttachmentReaderTest { entry.getContentStreamForFinalRead().close(); } - @SneakyThrows @Test @DisplayName("should return readable input stream for source zip if cannot extract content") void shouldReturnSourceStreamByError() { @@ -171,7 +177,7 @@ class ZipAttachmentReaderTest { assertThrows(ReadZipException.class, attachment::readContent); - assertThat(new DeleteOnCloseInputStream(attachment.getSourceZip())).hasSameContentAs(new ByteArrayInputStream(attachmentContent)); + assertThat(attachment.getSourceZipAsStream()).hasSameContentAs(new ByteArrayInputStream(attachmentContent)); } @Test @@ -204,35 +210,30 @@ class ZipAttachmentReaderTest { private static final String ZIP_BOMB_WITH_MANY_FILES = "zipbombs/filewithmanyfiles.dat.zip"; @Test - @SneakyThrows void shouldFailOnExtremCompressionRatio() { - try (var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT)) { + var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT); - ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); + ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); - assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious"); - } + assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious"); } @Test @SneakyThrows void shouldFailOnTotalExtractedSize() { - try (var zip = loadZip(ZIP_1_FILE_NAME)) { - reader.readContent(zip); + var zip = loadZip(ZIP_1_FILE_NAME); + reader.readContent(zip); - verify(reader).checkTotalExtractedSize(157); - } + verify(reader).checkTotalExtractedSize(157); } @Test - @SneakyThrows void shouldFailOnTotalZipEntries() { - try (var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES)) { + var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES); - ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); + ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); - assertThat(exception.getMessage()).contains("Total entries in zip file exceeded"); - } + assertThat(exception.getMessage()).contains("Total entries in zip file exceeded"); } } @@ -299,16 +300,12 @@ class ZipAttachmentReaderTest { @SneakyThrows private static void cleanupTempFiles() { - try (Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) { - paths.filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); - } + Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); } @SneakyThrows private static boolean noFilesWithSuffixInTempDirectory() { - try (Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) { - return paths.noneMatch(hasNameSuffix); - } + return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix); } @SneakyThrows @@ -320,4 +317,4 @@ class ZipAttachmentReaderTest { private static String getTmpDirectoryPath() { return TMP_DIRECTORY_PATH.endsWith("/") ? TMP_DIRECTORY_PATH.substring(0, TMP_DIRECTORY_PATH.length() - 1) : TMP_DIRECTORY_PATH; } -} +} \ No newline at end of file diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java index f6467d0f714bdcf4f969fede48c36007b3e8c6ad..20b6563bd1a8f6dd48a55340a4f803b05b9e542d 100644 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java @@ -3,31 +3,36 @@ package de.ozgcloud.eingang.enterprise.entry; import java.io.IOException; import java.time.ZonedDateTime; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; import de.ozgcloud.eingang.enterprise.entry.EntryResponse.ResponseVorgang; import de.ozgcloud.eingang.semantik.SemantikAdapter; -@RestController +@Controller +@ResponseBody @RequestMapping("antrag") -@RequiredArgsConstructor public class EntryController { private static final String STARTING_STATUS = "NEU"; - private final EntryDataMapper mapper; - private final SemantikAdapter semantikAdapter; - private final VorgangNummerSupplier vorgangNummerSupplier; + @Autowired + private EntryDataMapper mapper; + + @Autowired + private SemantikAdapter semantikAdapter; + @Autowired + private VorgangNummerSupplier vorgangNummerSupplier; @ResponseStatus(HttpStatus.ACCEPTED) @PostMapping(consumes = "multipart/form-data", produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java index ddbcefa40b341878ac154216c8d184b58b0b6097..189ebcc7becbb1b9aa524efac4555d25e3fe5198 100644 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java @@ -3,7 +3,7 @@ package de.ozgcloud.eingang.enterprise.entry; import java.io.IOException; import java.io.InputStream; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; @@ -11,11 +11,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.ozgcloud.eingang.common.formdata.FormData; @Component -@RequiredArgsConstructor class EntryDataMapper { - private final ObjectMapper objectMapper; - private final FormDataMapper formDataMapper; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private FormDataMapper formDataMapper; public FormData mapEntryData(InputStream request) { return formDataMapper.mapEntryData(readRequest(request)); @@ -27,7 +28,5 @@ class EntryDataMapper { } catch (IOException e) { throw new ReadingRequestException(e); } - } - } diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java index 6f633b2998461a29dcf55bcc1a95c0d87699df74..4ecc509d8213d160b34c0af4e8bfc5c98afebbe3 100644 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java @@ -12,6 +12,7 @@ import org.mapstruct.Mapping; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.PostfachAddressIdentifier; import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; @@ -25,8 +26,10 @@ public interface FormDataMapper { @Mapping(target = "antragsteller", ignore = true) @Mapping(target = "attachment", ignore = true) @Mapping(target = "attachments", ignore = true) + @Mapping(target = "numberOfAttachments", ignore = true) @Mapping(target = "representation", ignore = true) @Mapping(target = "representations", ignore = true) + @Mapping(target = "numberOfRepresentations", ignore = true) @Mapping(target = "id", ignore = true) @Mapping(target = "header", source = "control") @@ -77,12 +80,20 @@ public interface FormDataMapper { } default int toNumericType(String type) { - return switch (type) { - case "privat" -> 0; - case "unternehmen" -> 1; - case "behoerde" -> 2; - default -> -1; - }; + switch (type) { + case "privat": + return 0; + case "unternehmen": + return 1; + case "behoerde": + return 2; + default: + return -1; + } + } + + default PostfachAddressIdentifier map(String value) { + return StringBasedIdentifier.builder().postfachId(value).build(); } } diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java index a3367f81967d01537c7862e9594c891c5ac3e2d2..40b324dbdd4cdb25229e037a426cb8f19dd9fd07 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java @@ -33,9 +33,11 @@ import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; public interface FormCycleFormDataMapper { @Mapping(target = "antragsteller", ignore = true) - @Mapping(target = "id", ignore = true) @Mapping(target = "attachment", ignore = true) @Mapping(target = "attachments", ignore = true) + @Mapping(target = "id", ignore = true) + @Mapping(target = "numberOfAttachments", ignore = true) + @Mapping(target = "numberOfRepresentations", ignore = true) @Mapping(target = "representation", ignore = true) @Mapping(target = "representations", ignore = true) @Mapping(target = "zustaendigeStelle.organisationseinheitenId", source = "header.organisationsEinheitId") diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java index bc14537b1630250aa8d3be26dc70419f6343563a..06206c9f99a6bc1d9442c5452979f90090faa60a 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java @@ -32,10 +32,11 @@ import java.util.Objects; import java.util.Optional; import java.util.UUID; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import de.ozgcloud.common.binaryfile.TempFileUtils; @@ -48,11 +49,13 @@ import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; import de.ozgcloud.eingang.semantik.SemantikAdapter; +import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Log4j2 -@RestController +@Controller +@ResponseBody @RequestMapping("formData") @RequiredArgsConstructor class FormDataController { @@ -88,7 +91,7 @@ class FormDataController { private FormData addRepresentations(Optional<Collection<MultipartFile>> files, FormData mappedFormData) { Collection<IncomingFile> representations = buildIncomingFiles(files); - return mappedFormData.toBuilder().representations(representations).build(); + return mappedFormData.toBuilder().representations(representations).numberOfRepresentations(representations.size()).build(); } private Collection<IncomingFile> buildIncomingFiles(Optional<Collection<MultipartFile>> files) { @@ -98,7 +101,7 @@ class FormDataController { private FormData addFiles(FormCycleFormData inFormData, Optional<Collection<MultipartFile>> attachments, FormData mappedFormData) { var groups = new AttachmentGroupsBuilder(inFormData.getAttachmentGroupList(), attachments).buildGroups(); - return mappedFormData.toBuilder().attachments(groups).build(); + return mappedFormData.toBuilder().attachments(groups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(groups)).build(); } private IncomingFile buildIncomingFile(MultipartFile multipartFile) { diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java index c1fc281ebae3ea8d44fc70863c021b26450437c2..25a588403ce89dc7c6bfa1cd89a5972f0ef2a458 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java @@ -89,7 +89,7 @@ class FormDataControllerTest { static final String VORGANG_NUMMER = "VorgangNummer"; - private final FormData mappedFormData = FormDataTestFactory.create(); + private FormData mappedFormData = FormDataTestFactory.create(); @Captor private ArgumentCaptor<FormData> formDataCaptor; @@ -168,7 +168,7 @@ class FormDataControllerTest { @BeforeEach void init() { - var formData = FormDataTestFactory.createBuilder().clearRepresentations().build(); + var formData = FormDataTestFactory.createBuilder().clearRepresentations().numberOfRepresentations(0).build(); when(mapper.toFormData(any())).thenReturn(formData); when(htmlCleaner.clean(any())).thenReturn(formData); } @@ -180,6 +180,7 @@ class FormDataControllerTest { verify(semantikAdapter).processFormData(formDataCaptor.capture()); var formData = formDataCaptor.getValue(); assertThat(formData.getRepresentations()).hasSize(1); + assertThat(formData.getNumberOfRepresentations()).isEqualTo(1); } @Test @@ -206,7 +207,7 @@ class FormDataControllerTest { class Attachments { @BeforeEach void init() { - var formData = FormDataTestFactory.createBuilder().clearAttachments().build(); + var formData = FormDataTestFactory.createBuilder().clearAttachments().numberOfAttachments(0).build(); when(mapper.toFormData(any())).thenReturn(formData); when(htmlCleaner.clean(any())).thenReturn(formData); } @@ -219,6 +220,14 @@ class FormDataControllerTest { assertThat(formDataCaptor.getValue().getAttachments()).hasSize(1); } + @Test + void shouldSetNumberOfAttachments() { + doPostRequest(); + + verify(semantikAdapter).processFormData(formDataCaptor.capture()); + assertThat(formDataCaptor.getValue().getNumberOfAttachments()).isEqualTo(1); + } + } @SneakyThrows @@ -361,6 +370,6 @@ class FormDataControllerTest { private String getPostfachIdFormData(FormData formData) { return ((StringBasedIdentifier) formData.getHeader().getServiceKonto().getPostfachAddresses() - .getFirst().getIdentifier()).getPostfachId(); + .get(0).getIdentifier()).getPostfachId(); } } diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java b/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java index 3996c20101b170aa632159011ac7d0647bff898c..1f7577426808fb799db0ff3292ad43898cf652c3 100644 --- a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java +++ b/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java @@ -71,12 +71,14 @@ class FormSolutionsRequestMapper { .formData(buildFormDataMap(eingang)) .attachments(attachmentMapper.mapAttachments(eingang.getZip())) .representation(buildJsonFile(jsonFile)); + var numberOfRepresentations = 1; if (Objects.nonNull(eingang.getPdf())) { builder.representation(buildPdfFile(eingang.getPdf())); + numberOfRepresentations++; } - return builder.build(); + return builder.numberOfRepresentations(numberOfRepresentations).build(); } Map<String, Object> buildFormDataMap(FormSolutionsEingang eingang) { diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java b/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java index 64673c04c7272bfa49113846bf17bb36e5fe8150..bbae0375f29ff23f9c5b93ffcf0843c16762689c 100644 --- a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java +++ b/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java @@ -134,21 +134,21 @@ class FormSolutionsRequestMapperTest { void shouldContainPanelIdentifier() { var eingang = mapper.mapEingang(simpleJsonFile); - assertThat(getPanels(eingang).getFirst()).containsEntry(IDENTIFIER_KEY, PANEL_ID); + assertThat(getPanels(eingang).get(0)).containsEntry(IDENTIFIER_KEY, PANEL_ID); } @Test void shouldContainPanelComponets() { var eingang = mapper.mapEingang(simpleJsonFile); - assertThat(getPanels(eingang).getFirst().get(COMPONENTS)).isNotNull(); + assertThat(getPanels(eingang).get(0).get(COMPONENTS)).isNotNull(); } @Test void shouldContainTextComponets() { var eingang = mapper.mapEingang(simpleJsonFile); - assertThat(getComponents(eingang).getFirst()) + assertThat(getComponents(eingang).get(0)) .containsEntry(IDENTIFIER_KEY, COMPONENT_ID) .containsEntry(STRING_VALUE, COMPONENT_VALUE); } @@ -168,14 +168,14 @@ class FormSolutionsRequestMapperTest { void shouldContainGroup() { var eingang = mapper.mapEingang(nestedComponenetJsonFile); - assertThat(getComponents(eingang).getFirst()).containsEntry(IDENTIFIER_KEY, OBJEKTGRUPPE_0); + assertThat(getComponents(eingang).get(0)).containsEntry(IDENTIFIER_KEY, OBJEKTGRUPPE_0); } @Test void shouldContainDateField() { var eingang = mapper.mapEingang(nestedComponenetJsonFile); - assertThat(getNestedComponents(eingang).getFirst()) + assertThat(getNestedComponents(eingang).get(0)) .containsEntry(IDENTIFIER_KEY, DATE_COMPONENT_ID) .containsEntry(STRING_VALUE, DATE_COMPONENT_VALUE); } @@ -184,16 +184,12 @@ class FormSolutionsRequestMapperTest { @SuppressWarnings("unchecked") private List<Map<String, Object>> getComponents(FormSolutionsEingang eingang) { - return (List<Map<String, Object>>) getPanels(eingang).getFirst().get(COMPONENTS); + return (List<Map<String, Object>>) getPanels(eingang).get(0).get(COMPONENTS); } @SuppressWarnings("unchecked") private List<Map<String, Object>> getNestedComponents(FormSolutionsEingang eingang) { - return (List<Map<String, Object>>) ((List<Map<String, Object>>) getPanels(eingang) - .getFirst() - .get(COMPONENTS)) - .getFirst() - .get(COMPONENTS); + return (List<Map<String, Object>>) ((List<Map<String, Object>>) getPanels(eingang).get(0).get(COMPONENTS)).get(0).get(COMPONENTS); } @SuppressWarnings("unchecked") @@ -254,6 +250,13 @@ class FormSolutionsRequestMapperTest { assertThat(result.getRepresentations()).hasSize(2); } + + @Test + void shouldAddNumberOfRepresentations() { + var result = mapper.map(jsonFile); + + assertThat(result.getNumberOfRepresentations()).isEqualTo(2); + } } } diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java index f8bd996761a542c149bef0172315626ddc390984..c562cae01b6d903da745260d7e31f29c9b39fb63 100644 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java +++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormEndpoint.java @@ -42,7 +42,6 @@ import lombok.extern.log4j.Log4j2; @Endpoint @Log4j2 -@RequiredArgsConstructor public class IntelliFormEndpoint { private static final String NAMESPACE_URI = "http://xmlns.cit.de/intelliform/2009/webservices/backend"; @@ -52,8 +51,11 @@ public class IntelliFormEndpoint { private static final QName _DepositResponse_QNAME = new QName(NAMESPACE_URI, "depositResponse"); private static final QName _PrefillResponse_QNAME = new QName(NAMESPACE_URI, "prefillResponse"); - private final IntelliFormMapper intelliFormMapper; - private final SemantikAdapter semantikAdapter; + + @Autowired + private IntelliFormMapper intelliFormMapper; + @Autowired + private SemantikAdapter semantikAdapter; @PayloadRoot(namespace = NAMESPACE_URI, localPart = "deposit") @ResponsePayload diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java index 8ec4b78eb890c52cb73deb7638de95e39dd0dfdd..b073dd971016dbdf7b7930efc27309a1682eb65c 100644 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java +++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/IntelliFormMapper.java @@ -65,18 +65,20 @@ class IntelliFormMapper { // Find ids of <file> attachments var attachmentFileIds = findAttachmentIds(document); + var attachments = attachmentFileIds.stream() + .map(id -> getIncomingFileById(id, incomingFileMap)) + .map(this::createSingularFileGroup) + .toList(); + var representations = getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream() + .map(id -> getIncomingFileById(id, incomingFileMap)) + .toList(); return FormData.builder() // Put each <file> attachment in a separate file group - .attachments(attachmentFileIds.stream() - .map(id -> getIncomingFileById(id, incomingFileMap)) - .map(this::createSingularFileGroup) - .toList() - ) + .attachments(attachments) + .numberOfAttachments(attachments.size()) // If a deposit attachment is not referenced by <file> it is interpreted as a representation - .representations(getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream() - .map(id -> getIncomingFileById(id, incomingFileMap)) - .toList() - ) + .representations(representations) + .numberOfRepresentations(representations.size()) .build(); } diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java index 6f56380d5accd9f047942a21d6546a2ec9638ead..c394c2b2ee230d008e392252f11067af34032d74 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/IntelliFormMapperTest.java @@ -106,6 +106,14 @@ class IntelliFormMapperTest { .toList(); assertThat(incomingFileIds).contains(PNG_ATTACHMENT_ID); } + + @DisplayName("should return with number of representations") + @Test + void shouldReturnWithNumberOfRepresentations() { + var formData = doMapping(); + + assertThat(formData.getNumberOfRepresentations()).isEqualTo(2); + } } @DisplayName("with empty attachments") diff --git a/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java b/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java index 3a2bcc0429d4b71c24bb7eb571e0de5e04c58519..74607f148396fb856dd86a4716f5f67f0d2f4019 100644 --- a/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java +++ b/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java @@ -23,9 +23,8 @@ */ package de.ozgcloud.eingang.router; -import java.util.List; +import java.util.UUID; -import de.ozgcloud.eingang.common.formdata.*; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -33,6 +32,12 @@ import org.mapstruct.NullValueCheckStrategy; import org.mapstruct.NullValuePropertyMappingStrategy; import org.mapstruct.ReportingPolicy; +import com.google.protobuf.ByteString; + +import de.ozgcloud.eingang.common.formdata.Antragsteller; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; +import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller; import de.ozgcloud.vorgang.vorgang.GrpcEingang; @@ -47,19 +52,17 @@ import de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle; uses = { GrpcFormDataMapper.class, ServiceKontoMapper.class }) public interface GrpcEingangMapper { - @Mapping(target = "antragsteller.otherData", source = "antragsteller.data") - @Mapping(target = "attachmentsList", source = "attachments") - @Mapping(target = "numberOfAttachments", source = "attachments") - @Mapping(target = "representationsList", source = "representations") - @Mapping(target = "numberOfRepresentations", source = "representations") + @Mapping(source = "antragsteller.data", target = "antragsteller.otherData") + @Mapping(source = "attachments", target = "attachmentsList") + @Mapping(source = "representations", target = "representationsList") GrpcEingang toEingang(FormData formData); - default int representationsToSize(List<IncomingFile> representations) { - return representations.size(); - } + default ByteString byteArrayToByteString(byte[] byteArray) { + if (byteArray == null) { + return null; + } - default int attachmentsToSize(List<IncomingFileGroup> attachments) { - return attachments.stream().mapToInt(group -> group.getFiles().size()).sum(); + return ByteString.copyFrom(byteArray); } @Mapping(source = "files", target = "filesList") @@ -78,6 +81,10 @@ public interface GrpcEingangMapper { GrpcAntragsteller toAntragsteller(Antragsteller antragsteller); + default String uuidToString(UUID id) { + return id.toString(); + } + // FIXME map representations and attachments @Mapping(target = "attachment", ignore = true) @Mapping(target = "attachments", ignore = true) diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java index d54bdf17b8c848ebb42a79fd5b49b300ee06a96f..4150f6cef6d0574b78c6db89d9b61c068cd620e2 100644 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java +++ b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java @@ -106,7 +106,7 @@ class GrpcEingangMapperITCase { @Test void validateNumberOfAttachments() { - assertThat(eingang.getNumberOfAttachments()).isEqualTo(3); + assertThat(eingang.getNumberOfAttachments()).isEqualTo(2); } @Test @@ -136,7 +136,7 @@ class GrpcEingangMapperITCase { @Test void validateGroup2AttachmentCount() { - assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(2); + assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(1); } @Test diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java index 207b534c4f44785350f93096e1ab95d4b3ed2e01..b0348cc39fa405d1b7ea467d6d99e2a5ee5db4f0 100644 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java @@ -125,7 +125,7 @@ class GrpcEingangMapperTest { void validateNumberOfAttachments() { var eingang = toEingang(); - assertThat(eingang.getNumberOfAttachments()).isEqualTo(3); + assertThat(eingang.getNumberOfAttachments()).isEqualTo(2); } @Test @@ -139,14 +139,14 @@ class GrpcEingangMapperTest { void validateGroup1AttachmentCount() { var eingang = toEingang(); - assertThat(eingang.getAttachmentsList().getFirst().getFilesCount()).isEqualTo(1); + assertThat(eingang.getAttachmentsList().get(0).getFilesCount()).isEqualTo(1); } @Test void validateGroup1Attachment() { var eingang = toEingang(); - var attachment = eingang.getAttachmentsList().getFirst().getFilesList().getFirst(); + var attachment = eingang.getAttachmentsList().get(0).getFilesList().get(0); assertThat(attachment.getId()).isEqualTo(IncomingFileTestFactory.ID); assertThat(attachment.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); assertThat(attachment.getName()).isEqualTo(IncomingFileTestFactory.NAME); @@ -158,7 +158,7 @@ class GrpcEingangMapperTest { void validateGroup2AttachmentCount() { var eingang = toEingang(); - assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(2); + assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(1); } @Test diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java index 773d545d6ff2b7dbd78a7b1cfeba77aba9cb8e40..60206de34962325a9a4b66061f7f65617233cec3 100644 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java @@ -184,7 +184,7 @@ class VorgangRemoteServiceTest { void shouldCallUploadIncomingFile() { vorgangCreator.uploadAttachments(); - verify(vorgangCreator, times(3)).uploadIncomingFile(any(IncomingFile.class)); + verify(vorgangCreator, times(2)).uploadIncomingFile(any(IncomingFile.class)); } @Test diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java index 26a4131246c635ee14f60858fd85193996172ad4..c42fc60a26aeb1e12dcc51249d086181fe677b96 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java @@ -26,6 +26,7 @@ package de.ozgcloud.eingang.semantik; import java.util.List; import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.formdata.FormData; @@ -35,12 +36,14 @@ import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter; import lombok.RequiredArgsConstructor; @Service -@RequiredArgsConstructor public class SemantikAdapter { - private final List<EngineBasedSemantikAdapter> engineBasedAdapters; - private final FormBasedSemantikAdapter formBasedAdapter; - private final VorgangService vorgangService; + @Autowired + private List<EngineBasedSemantikAdapter> engineBasedAdapters; + @Autowired + private FormBasedSemantikAdapter formBasedAdapter; + @Autowired + private VorgangService vorgangService; public String processFormData(FormData formData) { formData = parseByEngineAdapter(formData); diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java index 5b74b88e7019d211662de352ad6327e62257fe7a..3e0ccb8a863a59546dd91ba4749b399bc5cfd952 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java @@ -23,8 +23,10 @@ */ package de.ozgcloud.eingang.semantik.enginebased; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import de.ozgcloud.eingang.common.formdata.FormData; @@ -53,6 +55,10 @@ public class FilesMapperHelper { return getMappedFiles(formData).map(mappedFiles -> (List<IncomingFile>) mappedFiles.get(REPRESENTATIONS)); } + public static int countAttachedFiles(Collection<IncomingFileGroup> fileGroups) { + return fileGroups.stream().filter(Objects::nonNull).mapToInt(group -> group.getFiles().size()).sum(); + } + public static FormData removeProcessedData(FormData formData) { return FormDataUtils.from(formData).remove(FIELD_NAME_MAPPED_FILES).build(); } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java index e32e8600f3872923d54bacbbae360bbfa1513522..8f6733cd1d89b68580e8ab128fae413714b87e61 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java @@ -25,6 +25,7 @@ package de.ozgcloud.eingang.semantik.enginebased.afm; import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.FormData; @@ -34,12 +35,13 @@ import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepre import lombok.RequiredArgsConstructor; @Component -@RequiredArgsConstructor public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter { - private final IntelliFormRepresentationAdapter intelliFormRepresentationAdapter; + @Autowired + private IntelliFormRepresentationAdapter intelliFormRepresentationAdapter; - private final List<AfmEngineBasedMapper> mappers; + @Autowired + private List<AfmEngineBasedMapper> mappers; @Override public FormData parseFormData(FormData formData) { diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java index 120ea31f036e32490d7a01d4fa8770d47d45305c..f9c67a198432302626fb210f1e87c1901feb9545 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java @@ -33,8 +33,8 @@ import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; interface AfmEngineBasedMapper extends EngineBasedMapper { - String KOP_CONTROLDATA_NODENAME = "_kopControlData"; - String CONTROLDATA_METADATA_PROPERTYNAME = "metaData"; + String KOP_CONTROLDATA_NODENAME = "_kopControlData"; + String CONTROLDATA_METADATA_PROPERTYNAME = "metaData"; default FormData addControlNode(FormData formData, String nodeName) { var editableFormMap = new LinkedHashMap<>(formData.getFormData()); diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java similarity index 76% rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapper.java rename to semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java index aefaaa9778895bf73c5810d02c8679b74027e0e3..e706d63e31d8161b639826fe9f22b06beeda65d1 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java @@ -29,17 +29,14 @@ import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; @Component -class AfmAttachedFilesMapper implements AfmEngineBasedMapper { +class AfmFileCountMapper implements AfmEngineBasedMapper { @Override public FormData parseFormData(FormData formData) { - var formDataBuilder = formData.toBuilder(); - FilesMapperHelper.getAttachedFileGroups(formData) - .ifPresent(formDataBuilder::attachments); - FilesMapperHelper.getRepresentations(formData) - .ifPresent(formDataBuilder::representations); - - return FilesMapperHelper.removeProcessedData(formDataBuilder.build()); + return formData.toBuilder() + .numberOfRepresentations(formData.getRepresentations().size()) + .numberOfAttachments(FilesMapperHelper.countAttachedFiles(formData.getAttachments())) + .build(); } -} \ No newline at end of file +} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java index 8e55983c1dd5ac7ea4395aea3b7a8c52b09c7d03..2984f9a6d257eeae0e1c6e2d361383b37d6a2dbb 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java @@ -23,21 +23,21 @@ */ package de.ozgcloud.eingang.semantik.enginebased.afm; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataUtils; import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.ServiceKonto; import de.ozgcloud.eingang.semantik.enginebased.ServiceKontoBuildHelper; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Map; -import java.util.Optional; @Component -@RequiredArgsConstructor class AfmHeaderMapper implements AfmEngineBasedMapper { static final String AFM_FORMENGINE_NAME = "AFM"; @@ -52,7 +52,8 @@ class AfmHeaderMapper implements AfmEngineBasedMapper { static final String FORM = "t:form"; static final String SENDER = "t:sender"; - private final ServiceKontoBuildHelper serviceKontoBuildHelper; + @Autowired + private ServiceKontoBuildHelper serviceKontoBuildHelper; @Override public FormData parseFormData(FormData formData) { @@ -84,7 +85,7 @@ class AfmHeaderMapper implements AfmEngineBasedMapper { Optional<ServiceKonto> createBayernIdServiceKonto(FormData formData) { var postfachId1 = getPostfachId(formData); - return postfachId1.map(serviceKontoBuildHelper::buildBayernIdServiceKonto); + return postfachId1.map(postfachId -> serviceKontoBuildHelper.buildBayernIdServiceKonto(postfachId)); } Optional<String> getPostfachId(FormData formData) { diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java index 9cbca92ba867286c544ce762119201542b7c6d90..1e057c6e81f5c937a429d8050c2c8996742026c9 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java @@ -29,13 +29,13 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; @Component -@RequiredArgsConstructor class AfmZustaendigeStelleMapper implements AfmEngineBasedMapper { public static final String ZUSTAENDIGESTELLE = "zustaendigestelle"; @@ -44,7 +44,8 @@ class AfmZustaendigeStelleMapper implements AfmEngineBasedMapper { public static final String ORGANISATIONSEINHEITEN_ID = "OrganisationseinheitenID"; public static final String TAG_BEZEICHNUNG = "OrganisationseinheitenBEZEICHNUNG"; - private final ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper; + @Autowired + private ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper; @Override public FormData parseFormData(FormData formData) { diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java index 26bae7ab72ab5d78a80ecffad59e1a8b143d2d19..36fb9fa6507228103bb71f8c0d2612d39b868c11 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java @@ -103,7 +103,6 @@ public class IntelliFormRepresentationAdapter { Map.of( HEADER_FIELD, createHeaderMap(document) ).entrySet().stream() - ).collect(ORDERED_MAP_ENTRY_COLLECTOR)) .build(); } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java index 28f4773dc71c7f08ccba19c80350149398fea7cf..04d21f1a271da454917f3a580727e31bc3baac98 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java @@ -3,21 +3,23 @@ package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; import java.util.List; import java.util.Map; +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; + import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; @Component -@RequiredArgsConstructor class JsonService { static final TypeReference<List<Map<String, Object>>> VALUE_TYPE_REF = new TypeReference<List<Map<String, Object>>>() { }; - private final ObjectMapper objectMapper; + @Autowired + private ObjectMapper objectMapper; public List<Map<String, Object>> readAsListMap(String json) { return readValueSafety(json, VALUE_TYPE_REF); diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java index 09024a1f5dee52719697d5fc6d7a425548339bef..1bb43a80e2f70556be226637d2d63ad78de41efe 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java @@ -11,6 +11,7 @@ import java.util.function.Predicate; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.fasterxml.jackson.dataformat.xml.XmlMapper; @@ -27,7 +28,6 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @Component -@RequiredArgsConstructor public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSemantikAdapter { private static final String FACHNACHRICHT_SUFFIX = "Fachnachricht.xml"; @@ -37,7 +37,8 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema private static final String KEY_POSTFACH_ID = "InboxReference"; private static final String KEY_ORGANISATIONS_EINHEIT_ID = "MetaText1"; - private final ServiceKontoBuildHelper serviceKontoHelper; + @Autowired + private ServiceKontoBuildHelper serviceKontoHelper; @Override public FormData parseFormData(FormData formData) { diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java index 2258394fac564f349a94b229fa8b610e631a168e..d63b1e4f5a502a5efce7f280b107422e0ee83a64 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java @@ -54,7 +54,7 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { if (attachments.isEmpty()) { return formDataBuilder.build(); } - return formDataBuilder.attachments(attachments).build(); + return formDataBuilder.attachments(attachments).numberOfAttachments(FilesMapperHelper.countAttachedFiles(attachments)).build(); } List<IncomingFileGroup> readAttachments(FormData srcFormData) { diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java index e0b943c707fe2346ccc383406a2ac8db6425be13..d6e7196a5e2e471cebf54f5891fd5de2f91405ae 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java @@ -13,9 +13,11 @@ import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; @Component @RequiredArgsConstructor +@Log4j2 public class MantelantragFormBasedMapper implements FormBasedMapper { private final Environment environment; @@ -42,6 +44,15 @@ public class MantelantragFormBasedMapper implements FormBasedMapper { @Override public FormData adaptFormData(FormData formData) { + try { + return adaptFormDataWithPossibleException(formData); + } catch (TechnicalException exception) { + LOG.warn("Mantelantrag is invalid: %s".formatted(exception.getMessage())); + return formData; + } + } + + FormData adaptFormDataWithPossibleException(FormData formData) { var fieldMap = formData.getFormData(); var slotIndex = findSlotIndex(fieldMap); UnaryOperator<String> getValueOrEmpty = field -> getFieldByKeyOrEmpty( @@ -51,7 +62,7 @@ public class MantelantragFormBasedMapper implements FormBasedMapper { var organisationseinheitId = getValueOrEmpty.apply(ORGANISATIONSEINHEIT_ID_FIELD); if (organisationseinheitId.isBlank()) { - throw new TechnicalException("OrganistaionseinheitId not found in Mantelantrag!"); + throw new TechnicalException("OrganistaionseinheitId not found!"); } return formData.toBuilder() diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java index 19a6f7ef707aaaeac2a5f7044ed3d4bf852e63ba..cfbf8d3481cd4679412ceceb84f886152467c30a 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java @@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; @@ -84,7 +85,7 @@ class FilesMapperHelperTest { } @Test - void shouldReturnRepresentations() { + void souldReturnRepresentations() { var incomingFileGroups = List.of(IncomingFileTestFactory.create()); Map<String, Object> mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, Map.of(FilesMapperHelper.REPRESENTATIONS, incomingFileGroups)); @@ -104,6 +105,48 @@ class FilesMapperHelperTest { } } + @Nested + class TestAttachmentCount { + + @Test + void shouldCountEmptyList() { + var counter = FilesMapperHelper.countAttachedFiles(List.of()); + + assertThat(counter).isZero(); + } + + @Test + void shouldCountNoAttachedFiles() { + var counter = FilesMapperHelper.countAttachedFiles(List.of(IncomingFileGroupTestFactory.createBuilder().clearFiles().build())); + + assertThat(counter).isZero(); + } + + @Test + void shouldCountOneAttachment() { + var fileGroup = List.of(IncomingFileGroupTestFactory.createBuilder().file(IncomingFileTestFactory.create()).build()); + + var counter = FilesMapperHelper.countAttachedFiles(fileGroup); + + assertThat(counter).isEqualTo(2); + } + + @Test + void shouldCountAllAttachments() { + var counter = FilesMapperHelper.countAttachedFiles(createFileGroupsWith4Files()); + + assertThat(counter).isEqualTo(4); + } + + private static List<IncomingFileGroup> createFileGroupsWith4Files() { + return List.of(IncomingFileGroupTestFactory.createBuilder() + .clearFiles() + .files(List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create(), IncomingFileTestFactory.create())).build(), + IncomingFileGroupTestFactory.create()); + + } + } + @Nested class TestRemoveProcessedData { @@ -130,7 +173,9 @@ class FilesMapperHelperTest { assertThat(cleanedFormData.getHeader()).isEqualTo(formData.getHeader()); assertThat(cleanedFormData.getZustaendigeStelle()).isEqualTo(formData.getZustaendigeStelle()); assertThat(cleanedFormData.getAntragsteller()).isEqualTo(formData.getAntragsteller()); + assertThat(cleanedFormData.getNumberOfAttachments()).isEqualTo(formData.getNumberOfAttachments()); assertThat(cleanedFormData.getAttachments()).isEqualTo(formData.getAttachments()); + assertThat(cleanedFormData.getNumberOfRepresentations()).isEqualTo(formData.getNumberOfRepresentations()); assertThat(cleanedFormData.getRepresentations()).isEqualTo(formData.getRepresentations()); assertThat(cleanedFormData.getFormData()).containsAllEntriesOf(formData.getFormData()); } diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapperTest.java deleted file mode 100644 index 1c3db207fb4c46607d68cfd242c98bc0f68b61f3..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapperTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.parsers.ParserConfigurationException; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.xml.sax.SAXException; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; - -class AfmEngineBasedMapperTest { - /* - @Nested - class TestMapFormData { - - private final Deposit deposit = DepositTestFactory.create(); - - @Test - void shouldMapIdField() throws SAXException, IOException, ParserConfigurationException { - var formData = mapToFormData(deposit); - - assertThat(formData.getId()).isNotNull(); - } - - @Test - void shouldRemoveFileReferences() { - Map<String, Object> formDataMap = new HashMap<>(Map.of(FILE_REF1, Map.of(IntelliFormMapper.FILE, Map.of(ID, VENDOR_ID_XXX)))); - - mapper.removeMappedFileReferences(FILE_GROUPS, formDataMap); - - assertThat(formDataMap).doesNotContainKey(FILE_REF1); - } - - @Nested - class TestMapDepositRepresentations { - - @Test - void shouldMap() throws SAXException, IOException, ParserConfigurationException { - var formData = mapToFormData(deposit); - - assertThat(getRepresentations(formData)).hasSize(2); - } - - @Test - void shouldContainsXmlData() { - var formData = mapToFormData(deposit); - - var xmlRepresentation = getRepresentations(formData).stream() - .filter(xml -> xml.getContentType().equals(AttachmentTestFactory.XML_CONTENT_TYPE)).findFirst(); - assertThat(xmlRepresentation).isPresent(); - } - - @Test - void shouldContainsPdfData() { - var formData = mapToFormData(deposit); - - var pdfRepresentation = getRepresentations(formData).stream() - .filter(pdf -> pdf.getContentType().equals(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT_TYPE)).findFirst(); - assertThat(pdfRepresentation).isPresent(); - } - - @Test - void shouldContainsPdfAttributes() { - var formData = mapToFormData(deposit); - - var pdfAttachment = getRepresentations(formData).stream() - .filter(pdf -> pdf.getContentType().equals(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT_TYPE)).findFirst(); - - assertThat(pdfAttachment).isPresent(); - assertThat(pdfAttachment.get().getContentType()).isEqualTo(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT_TYPE); - assertThat(pdfAttachment.get().getVendorId()).isEqualTo(AttachmentTestFactory.PDF_ATTACHMENT_ID); - assertThat(pdfAttachment.get().getName()).isEqualTo(AttachmentTestFactory.PDF_ATTACHMENT_NAME); - assertThat(pdfAttachment.get().getContentStream()).hasBinaryContent(AttachmentTestFactory.PDF_ATTACHMENT_CONTENT); - } - - @SuppressWarnings("unchecked") - private List<IncomingFile> getRepresentations(FormData formData) { - return (List<IncomingFile>) ((Map<String, Object>) formData.getFormData().get(FilesMapperHelper.FIELD_NAME_MAPPED_FILES)) - .get(FilesMapperHelper.REPRESENTATIONS); - } - } - - @Nested - class TestMapHeader { - - @Test - void shouldMapHeader() { - var formData = mapToFormData(deposit); - - var formHeader = getHeader(formData); - assertThat(formHeader) - .containsEntry(AfmEngineBasedMapper.HEADER_ID, "20201118365670866101") - .containsEntry(AfmEngineBasedMapper.HEADER_TIMESTAMP, "2020-11-18T09:09:27.627Z") - .containsEntry(AfmEngineBasedMapper.HEADER_FORM_ID, "waffen/kleinerWaffenschein") - .containsEntry(AfmEngineBasedMapper.HEADER_FORM, "Kleiner Waffenschein gem. ยง 10 Abs. 4 Satz 4 Waffengesetz (WaffG)") - .containsEntry(AfmEngineBasedMapper.HEADER_SENDER, "afm.schleswig-holstein.de") - .containsEntry(AfmEngineBasedMapper.HEADER_CUSTOMER, "Einheitlicher Ansprechpartner") - .containsEntry(AfmEngineBasedMapper.HEADER_CUSTOMER_ID, "ea-sh") - .containsEntry(AfmEngineBasedMapper.HEADER_CLIENT, "Schleswig-Holstein") - .containsEntry(AfmEngineBasedMapper.HEADER_CLIENT_ID, "land"); - } - - @Test - void shouldAddBayernHeader() { - Map<String, Object> bayernHeader = Map.of(CustomHeaderReader.HEADER_POSTFACH_ID, CustomHeaderTestFactory.POSTFACH_ID); - when(customHeaderReader.getHeader(any())).thenReturn(bayernHeader); - - var formData = mapToFormData(deposit); - - verify(customHeaderReader).getHeader(any()); - assertThat(getHeader(formData)).containsEntry(CustomHeaderReader.HEADER_POSTFACH_ID, CustomHeaderTestFactory.POSTFACH_ID); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getHeader(FormData formData) { - return (Map<String, Object>) formData.getFormData().get(IntelliFormMapper.HEADER_FIELD); - } - } - - private FormData mapToFormData(Deposit deposit) { - return mapper.mapToFormData(deposit); - } - } - */ -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java similarity index 81% rename from semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapperTest.java rename to semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java index 8da61c1b9b45fc394f7b679db1072f067fb7195e..7c63ef8ed048579653880f4ef7904f0b97d9554a 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAttachedFilesMapperTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java @@ -26,25 +26,23 @@ package de.ozgcloud.eingang.semantik.enginebased.afm; import static org.assertj.core.api.Assertions.*; import java.util.List; -import java.util.Map; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Spy; -class AfmAttachedFilesMapperTest { +class AfmFileCountMapperTest { @Spy @InjectMocks - private AfmAttachedFilesMapper mapper; + private AfmFileCountMapper mapper; private final IncomingFileGroup attachmentWithMultipleFiles = IncomingFileGroupTestFactory.createBuilder() .name("anotherAttachment") @@ -54,15 +52,14 @@ class AfmAttachedFilesMapperTest { private final FormData formData = FormDataTestFactory.createBuilder() .clearAttachments() - .formData(Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, - Map.of(FilesMapperHelper.ATTACHMENTS, List.of(IncomingFileGroupTestFactory.create(), attachmentWithMultipleFiles)))) + .attachments(List.of(IncomingFileGroupTestFactory.create(), attachmentWithMultipleFiles)) .build(); @Nested class TestParseFormData { @Test - void shouldMapAttachments() { + void shouldKeepAttachments() { var parsedFormData = parseFormData(); assertThat(parsedFormData.getAttachments()).hasSize(2); @@ -71,21 +68,28 @@ class AfmAttachedFilesMapperTest { } @Test - void shouldMapRepresentations() { + void shouldSetNumberOfAttachments() { + var parsedFormData = parseFormData(); + + assertThat(parsedFormData.getNumberOfAttachments()).isEqualTo(3); + } + + @Test + void shouldKeepRepresentations() { var parsedFormData = parseFormData(); assertThat(parsedFormData.getRepresentations()).hasSize(1); } @Test - void shouldRemoveFilesFromMap() { + void shouldSetNumberOfRepresentations() { var parsedFormData = parseFormData(); - assertThat(parsedFormData.getFormData().get(FilesMapperHelper.FIELD_NAME_MAPPED_FILES)).isNull(); + assertThat(parsedFormData.getNumberOfRepresentations()).isEqualTo(1); } private FormData parseFormData() { return mapper.parseFormData(formData); } } -} \ No newline at end of file +} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java index f548a7ca2f7390a43bc3af5791a0c8fb4c792191..47c563508627226dac6341fe8d6e4b36f9062b70 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java @@ -35,6 +35,7 @@ import java.util.Optional; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.ActiveProfiles; @@ -49,6 +50,7 @@ import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; +import de.ozgcloud.eingang.semantik.SemantikAdapter; import lombok.SneakyThrows; @SpringBootTest @@ -58,15 +60,18 @@ public class FormSolutionsEngineBasedAdapterITCase { private static final String ZIP_CONTENT_TYPE = "application/zip"; private static final String FILE_NAME_ZIP_ATTACHMENT = "formsolutions/attachment-2files.zip"; + @MockBean + private SemantikAdapter semantikAdapter; + @SpyBean private FormSolutionsEngineBasedAdapter engineAdapter; - private final ObjectMapper objectMapper = new ObjectMapper(); + private ObjectMapper objectMapper = new ObjectMapper(); @Nested class TestEngineBasedAdapter { - private final FormData formData = prepareTestData(); + private FormData formData = prepareTestData(); @Test void shouldMap() { @@ -126,9 +131,8 @@ public class FormSolutionsEngineBasedAdapterITCase { void shouldMapAttachment() { var data = engineAdapter.parseFormData(formData); - assertThat(data.getAttachments()).hasSize(1); - assertThat(data.getAttachments().getFirst()).isNotNull(); - assertThat(data.getAttachments().getFirst().getFiles()).hasSize(2); + assertThat(data.getAttachments().get(0)).isNotNull(); + assertThat(data.getNumberOfAttachments()).isEqualTo(2); } } diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java index 744115a5843d2b8e2b4bcb3b66c959b5fad093be..8c019e946e13b43882cbcda8d41f599cbe5d7d18 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java @@ -76,6 +76,37 @@ class MantelantragFormBasedMapperTest { @Nested class TestAdaptFormData { + @Mock + private FormData formData; + + @Mock + private FormData formData2; + + @DisplayName("should return adapted value") + @Test + void shouldReturnAdaptedValue() { + doReturn(formData2).when(mapper).adaptFormDataWithPossibleException(formData); + + var resultFormData = mapper.adaptFormData(formData); + + assertThat(resultFormData).isEqualTo(formData2); + } + + @DisplayName("should return original value with exception") + @Test + void shouldReturnOriginalValueWithException() { + doThrow(new TechnicalException("some error")).when(mapper).adaptFormDataWithPossibleException(formData); + + var resultFormData = mapper.adaptFormData(formData); + + assertThat(resultFormData).isEqualTo(formData); + } + } + + @DisplayName("adapt form data with possible exception") + @Nested + class TestAdaptFormDataWithPossibleException { + private FormData formData; private Map<String, Object> fieldMap; @@ -208,7 +239,7 @@ class MantelantragFormBasedMapperTest { } private ZustaendigeStelle getAdaptedZustaendigeStelle() { - var formDataResult = mapper.adaptFormData(formData); + var formDataResult = mapper.adaptFormDataWithPossibleException(formData); return formDataResult.getZustaendigeStelle(); } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java index 9f9f2f93c60d21fe2faa903601e1db37dd4206d4..e6d9f6836b5ef0d26087356de2545d512683b863 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java @@ -25,37 +25,54 @@ public class XdomeaMessageDataMapper { public XdomeaMessageData mapIncomingFilesToXdomeaMessageData(List<IncomingFile> incomingFileList) { var xdomeaXMLFile = findXdomeaXMLFile(incomingFileList); - var representationFileNames = valueReader.readRepresentationFileNames(xdomeaXMLFile); + var attachmentFileNames = getFileNamesExcluding( + incomingFileList, + Stream.concat(Stream.of(xdomeaXMLFile.getName()), representationFileNames.stream()) + ); - var fileNameToFileMap = incomingFileList.stream() - .collect(Collectors.toMap(IncomingFile::getName, file -> file)); + var fileNameToFileMap = createFileNameToIncomingFileMap(incomingFileList); return XdomeaMessageData.builder() .metadataFile(xdomeaXMLFile) - // Representations are incoming files which are referenced in the xdomea-xml in 'Dateiname' elements - .representations(getFilesByName( - movePrimaryRepresentationFileNameToFirstPosition(representationFileNames), - fileNameToFileMap - ) - ) - // Attachments are all incoming files which are neither the xdomea-xml nor representations - .attachments(Stream.of(IncomingFileGroup.builder() - .name(ATTACHMENT_GROUP_NAME) - .files(getFilesByName( - dropNames( - incomingFileList.stream().map(IncomingFile::getName), - Stream.concat(Stream.of(xdomeaXMLFile.getName()), representationFileNames.stream()) - .collect(Collectors.toSet()) - ), - fileNameToFileMap)) - .build()) - // Do not include empty attachment group - .filter(group -> !group.getFiles().isEmpty()) - .toList() - ) + .representations(getRepresentations(representationFileNames, fileNameToFileMap)) + .attachments(getAttachments(attachmentFileNames, fileNameToFileMap)) .build(); } + private Map<String, IncomingFile> createFileNameToIncomingFileMap(List<IncomingFile> incomingFileList) { + return incomingFileList.stream() + .collect(Collectors.toMap(IncomingFile::getName, file -> file)); + } + + private Stream<String> getFileNamesExcluding(List<IncomingFile> incomingFileList, Stream<String> excludedFileNames) { + return dropNames( + incomingFileList.stream().map(IncomingFile::getName), + excludedFileNames.collect(Collectors.toSet()) + ); + } + + private List<IncomingFile> getRepresentations(List<String> representationFileNames, Map<String, IncomingFile> fileNameToFileMap) { + return getFilesByName( + movePrimaryRepresentationFileNameToFirstPosition(representationFileNames), + fileNameToFileMap + ); + } + + private List<IncomingFileGroup> getAttachments(Stream<String> attachmentFileNames, Map<String, IncomingFile> fileNameToFileMap) { + return Stream.of(IncomingFileGroup.builder() + .name(ATTACHMENT_GROUP_NAME) + .files( + getFilesByName( + attachmentFileNames, + fileNameToFileMap + ) + ) + .build()) + // Do not include empty attachment group + .filter(group -> !group.getFiles().isEmpty()) + .toList(); + } + private Stream<String> movePrimaryRepresentationFileNameToFirstPosition(List<String> representationFileNames) { var primaryRepresentationFileName = findPrimaryRepresentationName(representationFileNames); return Stream.concat( diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java index 5f4d60a4dc45a9c31a88a95c7fbc37c9c7eb6068..f0fc982a33fc939726023ff751d36873e811b105 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java @@ -25,13 +25,6 @@ public class XdomeaXMLValueReader { private static final String DATEINAME_NODE_QUERY_STRING = "//Hauptobjekt//Dateiname"; private static final XPathExpression DATEINAME_NODE_QUERY = compileXPathExpression(DATEINAME_NODE_QUERY_STRING); - /** - * Find all 'Dateiname' elements in the 'Hauptobjekt' element. - * <h4>Struktur</h4> Geschaeftsgang.Geschaeftsgang.0201 > Hauptobjekt > Dokument > Version > Format > Primaerdokument > Dateiname - * - * @param xdomeaXMLFile the xml incoming file of a xdomea Geschaeftsvorgang.Geschaeftsvorgang.0201 - * @return list of file names which represent the primary document - */ public List<String> readRepresentationFileNames(IncomingFile xdomeaXMLFile) { return getTextsFromNodes( queryDateinameNodeList( diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java index 6f936847d3c5f66dfd55c05b35cf9062d725a44c..a685b0a20bfc5a93b90dcd606cebb2dea31e8187 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java @@ -1,6 +1,6 @@ package de.ozgcloud.eingang.xta; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.ws.client.WebServiceClientException; import org.springframework.ws.client.support.interceptor.ClientInterceptor; @@ -8,6 +8,7 @@ import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapMessage; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; +import eu.osci.ws._2014._10.transport.OriginatorsType; import eu.osci.ws._2014._10.transport.PartyIdentifierType; import eu.osci.ws._2014._10.transport.PartyType; import jakarta.validation.Valid; @@ -16,11 +17,11 @@ import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.JAXBException; @Component -@RequiredArgsConstructor class WsHeaderAddingInterceptor implements ClientInterceptor { + @Autowired @Valid - private final XtaProperties properties; + private XtaProperties properties; @Override public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { @@ -46,6 +47,9 @@ class WsHeaderAddingInterceptor implements ClientInterceptor { identifier.setValue(properties.getIdentifier()); partyType.setIdentifier(identifier); + var origin = new OriginatorsType(); + origin.setAuthor(partyType); + return objectFactory.createAuthor(partyType); } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java index 79cfdc3eefff7301f9f4daff34e7603f861710e6..af561ff948a92bee781a4745cd9b98af4ece0c8e 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java @@ -11,9 +11,10 @@ import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; +import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; import de.ozgcloud.eingang.xdomea.XdomeaMessageData; -@Mapper +@Mapper(imports = FilesMapperHelper.class) interface XtaMessageMapper { int VORGANG_NUMMER_SUFFIX_LENGTH = 4; @@ -22,6 +23,8 @@ interface XtaMessageMapper { @Mapping(target = "id", ignore = true) @Mapping(target = "zustaendigeStelle", ignore = true) @Mapping(target = "header", source = "metaData") + @Mapping(target = "numberOfAttachments", expression = "java(FilesMapperHelper.countAttachedFiles(xdomeaMessageData.attachments()))") + @Mapping(target = "numberOfRepresentations", dependsOn = "representations", expression = "java(getRepresentations(xdomeaMessageData).size())") @Mapping(target = "representations", source = "xdomeaMessageData") @Mapping(target = "representation", ignore = true) @Mapping(target = "attachment", ignore = true) diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java index b543be4a74e03d1f6f453f3071ad51a872c71495..4f59251706db33e1fe5d24ce333fb7f3a255a5a3 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java @@ -10,6 +10,10 @@ import java.util.Iterator; import java.util.stream.Stream; import javax.xml.namespace.QName; +import javax.xml.transform.TransformerException; + +import jakarta.validation.Valid; +import jakarta.xml.bind.JAXBElement; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -43,8 +47,6 @@ import eu.osci.ws._2008._05.transport.MsgSelector; import eu.osci.ws._2008._05.transport.MsgStatusListType; import eu.osci.ws._2008._05.transport.ObjectFactory; import eu.osci.ws._2014._10.transport.MessageMetaData; -import jakarta.validation.Valid; -import jakarta.xml.bind.JAXBElement; import lombok.NonNull; import lombok.extern.log4j.Log4j2; @@ -103,16 +105,19 @@ class XtaRemoteService { } WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) { - return message -> { - MarshallingUtils.marshal(osciMarshaller, jaxbElement, message); - callback.doWithMessage(message); + return new WebServiceMessageCallback() { + @Override + public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { + MarshallingUtils.marshal(osciMarshaller, jaxbElement, message); + callback.doWithMessage(message); + } }; } WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() { - return new WebServiceMessageExtractor<>() { + return new WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse>() { @Override - public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException { + public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException, TransformerException { MsgBoxResponseType header = extractHeader(message); @@ -273,7 +278,7 @@ class XtaRemoteService { @SuppressWarnings("unchecked") ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue(); - return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName()); + return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName().toString()); } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java index 10fad61ff239daa3ce420d95feaa2373b513dfc6..8668263d9b0914c6458296220db651e6b26552c7 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java @@ -11,7 +11,7 @@ import java.security.cert.CertificateException; import javax.net.ssl.KeyManagerFactory; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,12 +28,12 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @Configuration -@RequiredArgsConstructor public class XtaRemoteServiceConfiguration { static final String URI_TEMPLATE = "%s://%s/MB_XTA-WS/XTA210msgBoxPort.svc"; - private final XtaProperties properties; + @Autowired + private XtaProperties properties; @Bean Jaxb2Marshaller osciTransportMarshaller() { diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java index 5f580e13f68ed182ac9886601b9ff519edb94782..0c497d51f85560d84085d663c2bc32aaf46a408e 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java @@ -1,6 +1,6 @@ package de.ozgcloud.eingang.xta; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Profile; import org.springframework.context.event.ContextRefreshedEvent; @@ -11,15 +11,15 @@ import de.ozgcloud.eingang.semantik.SemantikAdapter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; - @Profile("!itcase") @Log4j2 @Component -@RequiredArgsConstructor class XtaRunner implements ApplicationListener<ContextRefreshedEvent> { - private final XtaService service; - private final SemantikAdapter semantikAdapter; + @Autowired + private XtaService service; + @Autowired + private SemantikAdapter semantikAdapter; @Override public void onApplicationEvent(ContextRefreshedEvent event) { diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java index 9dcae95b16545544a6a0f9ecab9cd0b2b1411557..2341fbf6dc93899cb0c195ee6f09be52266c5c81 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java @@ -8,6 +8,7 @@ import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.formdata.FormData; @@ -16,16 +17,20 @@ import lombok.extern.log4j.Log4j2; @Service @Log4j2 -@RequiredArgsConstructor class XtaService { static final String XDOMEA_0201_MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201"; - private final XtaRemoteService remoteService; - private final XtaMessageMapper mapper; - private final VorgangNummerSupplier vorgangNummerSupplier; - private final XdomeaMessageDataMapper xdomeaMessageDataMapper; - private final XtaIncomingFilesMapper xtaIncomingFilesMapper; + @Autowired + private XtaRemoteService remoteService; + @Autowired + private XtaMessageMapper mapper; + @Autowired + private VorgangNummerSupplier vorgangNummerSupplier; + @Autowired + private XdomeaMessageDataMapper xdomeaMessageDataMapper; + @Autowired + private XtaIncomingFilesMapper xtaIncomingFilesMapper; public Stream<FormData> getMessages() { return createXtaMessageStream().filter(this::isSupportedMessageType).map(this::getFormData); diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java index 374b4de0335bdfadae06528258db5cae4e782b4c..509880984a7ee0a50eb1fa424541121e7c58909e 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java @@ -10,7 +10,8 @@ class FormDataTestFactory { static FormData.FormDataBuilder createBuilder() { return FormData.builder() - .header(FormHeaderTestFactory.create()); + .header(FormHeaderTestFactory.create()) + .numberOfRepresentations(1); } } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java index 6a7881a89df1c91678d1abd9c8ac4602250c1b76..8e2d830f342905d66d07dca69cd304b92bef142c 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java @@ -1,6 +1,7 @@ package de.ozgcloud.eingang.xta; -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.*; + import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; @@ -14,7 +15,7 @@ class XtaApplicationTest { @Test void startup() { // should start without exception; - Assertions.assertTrue(true); + assertTrue(true); } } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java index e915ba4a787289e6dfa52970dc11c581be501840..48fab4d367f5eaa16cd4426de0c1189bc5b7bd9c 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java @@ -22,7 +22,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.test.context.ActiveProfiles; import de.ozgcloud.eingang.Application; -import de.ozgcloud.eingang.semantik.SemantikAdapter; import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc; import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse; import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangRequest; @@ -30,11 +29,9 @@ import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangResponse; import de.ozgcloud.vorgang.vorgang.GrpcEingang; import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationResponse; import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc; -import lombok.RequiredArgsConstructor; @SpringBootTest(classes = { Application.class, - XtaITCase.ActivateXTARunnerConfig.class, XtaITCase.ActivateXTARunnerConfig.class }) @ActiveProfiles({ "itcase" }) @@ -52,17 +49,26 @@ class XtaITCase { class TestRunGetXtaMessages { @BeforeEach void setup() { - // Mock 'start vorgang creation' + mockStartVorgangCreation(); + mockUploadBinaryFiles(); + mockFinishVorgangCreation(); + } + + private void mockStartVorgangCreation() { stubFor( unaryMethod(VorgangServiceGrpc.getStartCreationMethod()) .willReturn(GrpcCreateVorgangResponse.getDefaultInstance()) ); - // Mock 'upload binary files' + } + + private void mockUploadBinaryFiles() { stubFor( clientStreamingMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod()) .willReturn(GrpcUploadBinaryFileResponse.getDefaultInstance()) ); - // Mock 'finish vorgang creation' + } + + private void mockFinishVorgangCreation() { stubFor( unaryMethod(VorgangServiceGrpc.getFinishCreationMethod()) .willReturn(GrpcFinishCreationResponse.getDefaultInstance()) @@ -72,31 +78,38 @@ class XtaITCase { @AfterEach void teardown() { try { - // Expect one Vorgang to be created (start and finish) - verifyThat( - calledMethod(VorgangServiceGrpc.getStartCreationMethod()) - .withRequest(GrpcCreateVorgangRequest::hasEingang), - times(1) - ); - verifyThat( - calledMethod(VorgangServiceGrpc.getFinishCreationMethod()), - times(1) - ); - // Expect upload of two xml representations: xdomea.xml and antrag.xml - verifyThat( - calledMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod()) - .withRequestsContaining(request -> - request.hasMetadata() && - request.getMetadata().getContentType().contains("xml") - ), - times(2) - ); + expectOneVorgangCreateAndFinishCall(); + expectUploadCallForXmlRepresentations(); } finally { xtaMocker.teardownServer(); resetMappings(); } } + private void expectOneVorgangCreateAndFinishCall() { + verifyThat( + calledMethod(VorgangServiceGrpc.getStartCreationMethod()) + .withRequest(GrpcCreateVorgangRequest::hasEingang), + times(1) + ); + verifyThat( + calledMethod(VorgangServiceGrpc.getFinishCreationMethod()), + times(1) + ); + } + + private void expectUploadCallForXmlRepresentations() { + // Expect two xml representations: xdomea.xml and antrag.xml + verifyThat( + calledMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod()) + .withRequestsContaining(request -> + request.hasMetadata() && + request.getMetadata().getContentType().contains("xml") + ), + times(2) + ); + } + @DisplayName("should have three representations with pdf") @TestZipFileNamesWithPdf void shouldHaveThreeRepresentationsWithPdf(String zipFileName) { @@ -259,15 +272,10 @@ class XtaITCase { @interface TestZipFileNames { } - @RequiredArgsConstructor static class ActivateXTARunnerConfig { - private final XtaService service; - private final SemantikAdapter semantikAdapter; - @Bean XtaRunner xtaRunner() { - return new XtaRunner(service, semantikAdapter); + return new XtaRunner(); } } - } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java index 52eb46a971f9c52dd4c6289b44812a9e464695e9..b9bcda822a302872474e1c4341cbe08b11675b99 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java @@ -46,6 +46,20 @@ class XtaMessageMapperTest { assertThat(formData.getRepresentations()).containsExactly(xdomeaMessageData.metadataFile(), xdomeaMessageData.representations().getFirst()); } + @Test + void shouldSetNumberOfAttachments() { + var formData = doMapping(); + + assertThat(formData.getNumberOfAttachments()).isEqualTo(1); + } + + @Test + void shouldSetNumberOfRepresentations() { + var formData = doMapping(); + + assertThat(formData.getNumberOfRepresentations()).isEqualTo(2); + } + @Test void shouldMapAttachments() { var formData = doMapping(); diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java index 5b7ba85a8a5874513b8bfe91b38df36fb9e06a9a..5cbebb33620ba8ec6801326c71526527b2ebdc35 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java @@ -59,8 +59,8 @@ class XtaServiceITCase { void shouldUnzipCorrectNumberOfRepresentations() { var firstFormData = xtaService.getMessages().toList().getFirst(); - // Expect that there are 3 files (xdomea.xml, intelliform.xml and intelliform.pdf) assertThat(firstFormData.getRepresentations()).hasSize(3); + assertThat(firstFormData.getNumberOfRepresentations()).isEqualTo(3); } @DisplayName("should unzip correct number of attachments") @@ -68,7 +68,6 @@ class XtaServiceITCase { void shouldUnzipCorrectNumberOfAttachments() { var firstFormData = xtaService.getMessages().toList().getFirst(); - // Expect that there are no attachment files assertThat(firstFormData.getAttachments()).isEmpty(); }