diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java index 7bfe66759840ae03293a1d35dcd0b0b35a400c60..dd8a74b7d1f5b0c4065c745b5be3c66fb9217f70 100644 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java +++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java @@ -50,36 +50,63 @@ import lombok.RequiredArgsConstructor; class DepositDataMapper { public FormData mapToFormData(DepositData depositData) { - // Transform deposit data attachments to incoming files - Map<String, IncomingFile> incomingFileMap = depositData.getAttachments() + Map<String, IncomingFile> incomingFileMap = mapDepositAttachmentsToIncomingFiles(depositData); + Document document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); + List<String> attachmentFileIds = findAttachmentFileIds(document); + var attachments = getAttachmentFileGroups(attachmentFileIds, incomingFileMap); + var representations = getRepresentations(incomingFileMap, attachmentFileIds); + return FormData.builder() + .attachments(attachments) + .numberOfAttachments(attachments.size()) + .representations(representations) + .numberOfRepresentations(representations.size()) + .build(); + } + + private Map<String, IncomingFile> mapDepositAttachmentsToIncomingFiles(DepositData depositData) { + return depositData.getAttachments() .stream() .collect( Collectors.toMap(Attachment::getId, this::mapAttachmentToIncomingFile) ); + } + + IncomingFile mapAttachmentToIncomingFile(Attachment attachment) { + var file = TempFileUtils.writeTmpFile(attachment.content); + return IncomingFile.builder() + .id(UUID.randomUUID().toString()) + .vendorId(attachment.id) + .name(attachment.name) + .contentType(attachment.contentType) + .size(file.length()) + .file(file) + .build(); + } - // Parse the primary <myForm> xml representation - Document document = XMLHelper.parseDocument( - // Expect that the <primaryDataAttachmentId> refers to the XML file (and the <primaryFormAttachmentId> to the PDF file) + private Document parsePrimaryXmlRepresentation(DepositData depositData, Map<String, IncomingFile> incomingFileMap) { + // Expect that the <primaryDataAttachmentId> refers to the XML file + return XMLHelper.parseDocument( getIncomingFileById(depositData.getPrimaryDataAttachmentId(), incomingFileMap) ); + } + + private List<String> findAttachmentFileIds(Document document) { + return streamElements(document.getElementsByTagName("file")) + .map(element -> element.getAttribute("id")) + .toList(); + } - // Find ids of <file> attachments - var attachmentFileIds = findAttachmentIds(document); - var attachments = attachmentFileIds.stream() + private List<IncomingFileGroup> getAttachmentFileGroups(List<String> attachmentFileIds, Map<String, IncomingFile> incomingFileMap) { + return attachmentFileIds.stream() .map(id -> getIncomingFileById(id, incomingFileMap)) .map(this::createSingularFileGroup) .toList(); - var representations = getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream() + } + + private List<IncomingFile> getRepresentations(Map<String, IncomingFile> incomingFileMap, List<String> attachmentFileIds) { + return getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream() .map(id -> getIncomingFileById(id, incomingFileMap)) .toList(); - return FormData.builder() - // Put each <file> attachment in a separate file group - .attachments(attachments) - .numberOfAttachments(attachments.size()) - // If a deposit attachment is not referenced by <file> it is interpreted as a representation - .representations(representations) - .numberOfRepresentations(representations.size()) - .build(); } private IncomingFile getIncomingFileById(String id, Map<String, IncomingFile> incomingFileMap) { @@ -98,27 +125,9 @@ class DepositDataMapper { return names.stream().filter(name -> !excludedStringsSet.contains(name)).toList(); } - private List<String> findAttachmentIds(Document document) { - return streamElements(document.getElementsByTagName("file")) - .map(element -> element.getAttribute("id")) - .toList(); - } - private Stream<Element> streamElements(NodeList nodeList) { return IntStream.range(0, nodeList.getLength()) .mapToObj(nodeList::item) .map(Element.class::cast); } - - IncomingFile mapAttachmentToIncomingFile(Attachment attachment) { - var file = TempFileUtils.writeTmpFile(attachment.content); - return IncomingFile.builder() - .id(UUID.randomUUID().toString()) - .vendorId(attachment.id) - .name(attachment.name) - .contentType(attachment.contentType) - .size(file.length()) - .file(file) - .build(); - } } 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 c42fc60a26aeb1e12dcc51249d086181fe677b96..7641a94284e519298304f8702cc5f467cde30090 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 @@ -33,7 +33,6 @@ import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.router.VorgangService; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter; -import lombok.RequiredArgsConstructor; @Service public class SemantikAdapter { @@ -65,6 +64,6 @@ public class SemantikAdapter { } private FormData parseByFormAdapter(FormData formData) { - return formBasedAdapter.adaptFormData(formData); + return formBasedAdapter.parseFormData(formData); } } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java index 8ca005996ebcd86ce4b59b03f9cc087ac3c3569a..9486e4838258234346c22e7165179c5641943919 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java @@ -81,7 +81,7 @@ class AfmAntragstellerMapper implements AfmEngineBasedMapper { return (String) formDataMap.get(POSTFACH_ID); } - private Optional<LinkedHashMap<String, Object>> getAntragstellerMap(Map<String, Object> formDataMap) { + private Optional<Map<String, Object>> getAntragstellerMap(Map<String, Object> formDataMap) { return Optional.ofNullable(formDataMap.get(ANTRAGSTELLER)) .or(() -> Optional.ofNullable(formDataMap.get(ANTRAGSTELLER_UPPERCASE))) .map(Map.class::cast) 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 1bb43a80e2f70556be226637d2d63ad78de41efe..aedb47f05d7d39b109d67b5ba214ac90b3e1d8f7 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 @@ -23,7 +23,6 @@ import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import de.ozgcloud.eingang.semantik.enginebased.ServiceKontoBuildHelper; import lombok.NonNull; -import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Log4j2 diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java index 64a5c44af69caffef810a2b4c8a8de077f6d44ac..47e053f919675dbbf0f1ab139117ceb65b210193 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java @@ -25,9 +25,9 @@ package de.ozgcloud.eingang.semantik.formbased; import de.ozgcloud.eingang.common.formdata.FormData; -interface FormBasedMapper { +public interface FormBasedMapper { - FormData adaptFormData(FormData formData); + FormData parseFormData(FormData formData); boolean isResponsible(FormData formData); } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java index a5121e8d8295c20eac12701362e33522d390fedf..39a9a030a2749cb3c0d7affce5e5956491697c84 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java @@ -36,11 +36,12 @@ public class FormBasedSemantikAdapter { private final List<FormBasedMapper> mappers; - public FormData adaptFormData(FormData formData) { - return mappers.stream() - .filter(mapper -> mapper.isResponsible(formData)) - .findFirst() - .map(mapper -> mapper.adaptFormData(formData)) - .orElse(formData); + public FormData parseFormData(FormData formData) { + for(var mapper: mappers) { + if (mapper.isResponsible(formData)) { + formData = mapper.parseFormData(formData); + } + } + return formData; } } 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/mantelantrag/MantelantragFormBasedMapper.java similarity index 95% rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java rename to semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragFormBasedMapper.java index d6e7196a5e2e471cebf54f5891fd5de2f91405ae..27fb3cd14b452d3892cbe8023c9c57c4133a2001 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/mantelantrag/MantelantragFormBasedMapper.java @@ -1,10 +1,11 @@ -package de.ozgcloud.eingang.semantik.formbased; +package de.ozgcloud.eingang.semantik.formbased.mantelantrag; import java.util.Map; import java.util.Optional; import java.util.function.UnaryOperator; import java.util.stream.IntStream; +import de.ozgcloud.eingang.semantik.formbased.FormBasedMapper; import org.apache.commons.collections.MapUtils; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @@ -19,13 +20,8 @@ import lombok.extern.log4j.Log4j2; @RequiredArgsConstructor @Log4j2 public class MantelantragFormBasedMapper implements FormBasedMapper { - - private final Environment environment; - static final String MANTELANTRAG_FORM_ID = "maa_mantelantrag/maa_mantelantrag_pvog"; - static final String ZUSTELLUNG_NACHRICHTENBROKER_FIELD = "zustellung_nachrichtenbroker"; - static final String ORGANISATIONSEINHEIT_ID_FIELD = "kontaktsystem_oeid"; static final String BEZEICHNUNG_FIELD = "OrganisationseinheitenBEZEICHNUNG"; static final String EMAIL_FIELD = "zust_emailadresse"; @@ -34,6 +30,8 @@ public class MantelantragFormBasedMapper implements FormBasedMapper { static final String HAUSANSCHRIFT_ORT_FIELD = "zust_ort"; static final String TELEFON_FIELD = "telefon"; + private final Environment environment; + @Override public boolean isResponsible(FormData formData) { return formData @@ -43,7 +41,7 @@ public class MantelantragFormBasedMapper implements FormBasedMapper { } @Override - public FormData adaptFormData(FormData formData) { + public FormData parseFormData(FormData formData) { try { return adaptFormDataWithPossibleException(formData); } catch (TechnicalException exception) { diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java index 0e230d638419df50c78544db57ac0735994ce13a..dbe206cafc115bf08a30839bab78afbc1933fdb3 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java @@ -107,7 +107,7 @@ class SemantikAdapterTest { void mockEngineAdapter() { doReturn(Optional.of(engineAdapter)).when(adapter).findResponsibleEngineAdapter(formData); when(engineAdapter.parseFormData(any())).thenReturn(engineAdapterResponse); - when(formAdapter.adaptFormData(any())).thenReturn(formAdapterResponse); + when(formAdapter.parseFormData(any())).thenReturn(formAdapterResponse); } @Test @@ -128,7 +128,7 @@ class SemantikAdapterTest { void shouldCallFormAdapter() { adapter.processFormData(formData); - verify(formAdapter).adaptFormData(engineAdapterResponse); + verify(formAdapter).parseFormData(engineAdapterResponse); } @Test diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java index c68c9c3848ab36f3fdcb7a4e2ccdcef6eb611566..7cb39b39ea3e1a7be01f3e256eb8a607724118f6 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java @@ -63,16 +63,16 @@ class FormBasedSemantikAdapterTest { @Test void shouldCallMapperIfResponsible() { - adapter.adaptFormData(formData); + adapter.parseFormData(formData); - verify(mapper).adaptFormData(formData); + verify(mapper).parseFormData(formData); } @Test void shouldNotCallMapperIfNotResponsible() { when(mapper.isResponsible(any())).thenReturn(false); - adapter.adaptFormData(formData); + adapter.parseFormData(formData); verifyNoMoreInteractions(mapper); } @@ -80,9 +80,9 @@ class FormBasedSemantikAdapterTest { @Test void shouldReturnMappingResult() { var expected = FormDataTestFactory.create(); - when(mapper.adaptFormData(any())).thenReturn(expected); + when(mapper.parseFormData(any())).thenReturn(expected); - var result = adapter.adaptFormData(formData); + var result = adapter.parseFormData(formData); assertThat(result).isSameAs(expected); } 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/mantelantrag/MantelantragFormBasedMapperTest.java similarity index 96% rename from semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java rename to semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragFormBasedMapperTest.java index 8c019e946e13b43882cbcda8d41f599cbe5d7d18..5bc55d0d97d695f85273fcba3f0353615b0d4b3d 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/mantelantrag/MantelantragFormBasedMapperTest.java @@ -1,6 +1,6 @@ -package de.ozgcloud.eingang.semantik.formbased; +package de.ozgcloud.eingang.semantik.formbased.mantelantrag; -import static de.ozgcloud.eingang.semantik.formbased.MantelantragFormBasedMapper.*; +import static de.ozgcloud.eingang.semantik.formbased.mantelantrag.MantelantragFormBasedMapper.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -87,7 +87,7 @@ class MantelantragFormBasedMapperTest { void shouldReturnAdaptedValue() { doReturn(formData2).when(mapper).adaptFormDataWithPossibleException(formData); - var resultFormData = mapper.adaptFormData(formData); + var resultFormData = mapper.parseFormData(formData); assertThat(resultFormData).isEqualTo(formData2); } @@ -97,7 +97,7 @@ class MantelantragFormBasedMapperTest { void shouldReturnOriginalValueWithException() { doThrow(new TechnicalException("some error")).when(mapper).adaptFormDataWithPossibleException(formData); - var resultFormData = mapper.adaptFormData(formData); + var resultFormData = mapper.parseFormData(formData); assertThat(resultFormData).isEqualTo(formData); } @@ -128,7 +128,7 @@ class MantelantragFormBasedMapperTest { void shouldKeepFormDataExceptZustaendigestelle() { doReturn(10).when(mapper).findSlotIndex(fieldMap); - var resultFormData = mapper.adaptFormData(formData); + var resultFormData = mapper.parseFormData(formData); assertThat(resultFormData.getId()).isEqualTo(formData.getId()); assertThat(resultFormData.getHeader()).isEqualTo(formData.getHeader()); 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 48fab4d367f5eaa16cd4426de0c1189bc5b7bd9c..b4e3f19f94a151b974a720e229fa4db5f2a856f8 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 @@ -193,20 +193,18 @@ class XtaITCase { runner.runGetXtaMessages(); - var vorgangNummer = captureEingang() - .getHeader() - .getVorgangNummer(); + var vorgangNummer = captureEingang().getHeader().getVorgangNummer(); assertThat(vorgangNummer).hasSize(9); } private GrpcEingang captureEingang() { return capturedRequestsFor( - calledMethod(VorgangServiceGrpc.getStartCreationMethod()) + calledMethod(VorgangServiceGrpc.getStartCreationMethod()) ) - .getFirst() - .requests() - .getFirst() - .getEingang(); + .getFirst() + .requests() + .getFirst() + .getEingang(); } }