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 592fea25bbffbe37a4ac7bc4896ddd8086ad0816..cdba687ee3c7f2dc369d8b2342afc66972cdaf75 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 @@ -8,6 +8,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; +import java.util.function.UnaryOperator; +import java.util.stream.Stream; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -17,11 +19,12 @@ import org.springframework.stereotype.Component; import com.fasterxml.jackson.dataformat.xml.XmlMapper; 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.formdata.ServiceKonto; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; +import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; @@ -36,8 +39,9 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema private static final String KEY_POSTFACH_ID = "InboxReference"; private static final String KEY_ORGANISATIONS_EINHEIT_ID = "MetaText1"; private static final String KEY_FORM_NAME = "Title"; + private static final String KEY_FORM_ID = "ProjectTitle"; - static final String DEFAULT_FORM_NAME = "dFördermittelantrag: Ohne Titel"; + static final String DEFAULT_FORM_NAME = "dFördermittelantrag"; @Autowired private ServiceKontoFactory serviceKontoFactory; @@ -51,26 +55,49 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema } FormData processFachnachricht(FormData formData) { - Map<String, Object> fachnachricht = getFachnachricht(formData); + return pipe( + Stream.of( + this::addFormName, + this::addFormEngineName, + this::addServiceKonto, + this::addOrganisationsEinheitId, + this::addFormId + ) + ).apply(formData); + } - var extendedFormData = addFormName(formData); - extendedFormData = addFormEngineName(extendedFormData); - extendedFormData = addServiceKonto(extendedFormData, fachnachricht); - return addOrganisationsEinheitId(extendedFormData, fachnachricht); + private UnaryOperator<FormData> pipe(Stream<UnaryOperator<FormData>> functions) { + return (formData) -> functions + .reduce(formData, (acc, f) -> f.apply(acc), (a, b) -> a); } + FormData addFormId(FormData formData) { + return getNonEmptyFachnachrichtValueByKey(formData, KEY_FORM_ID) + .map(formId -> mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formId(formId))) + .orElse(formData); + } - FormData addServiceKonto(FormData formData, Map<String, Object> fachnachricht) { - return Optional.ofNullable((String) fachnachricht.get(KEY_POSTFACH_ID)) + private Optional<String> getNonEmptyFachnachrichtValueByKey(FormData formData, String key) { + return Optional.ofNullable((String) getFachnachricht(formData).get(key)) + .filter(StringUtils::isNotBlank); + } + + private FormData mapWithModifiedHeader(FormData formData, UnaryOperator<FormHeader.FormHeaderBuilder> headerBuilderOperator) { + return formData.toBuilder() + .header(headerBuilderOperator.apply(formData.getHeader().toBuilder()).build()) + .build(); + } + + FormData addServiceKonto(FormData formData) { + return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_POSTFACH_ID)) .map(this::extractPrefix) .map(this::createServiceKonto) - .map(serviceKonto -> formData.getHeader().toBuilder().serviceKonto(serviceKonto).build()) - .map(header -> formData.toBuilder().header(header).build()) + .map(serviceKonto -> mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.serviceKonto(serviceKonto))) .orElse(formData); } - FormData addOrganisationsEinheitId(FormData formData, Map<String, Object> fachnachricht) { - return Optional.ofNullable((String) fachnachricht.get(KEY_ORGANISATIONS_EINHEIT_ID)) + FormData addOrganisationsEinheitId(FormData formData) { + return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_ORGANISATIONS_EINHEIT_ID)) .map(orgaId -> addOrganisationsEinheitId(orgaId, formData.getZustaendigeStelle())) .map(zustStelle -> formData.toBuilder().zustaendigeStelle(zustStelle).build()) .orElse(formData); @@ -88,16 +115,10 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema } FormData addFormName(FormData formData) { - return formData.toBuilder() - .header(formData.getHeader().toBuilder() - .formName(getFormName(formData).orElse(DEFAULT_FORM_NAME)) - .build() - ) - .build(); - } - private Optional<String> getFormName(FormData formData) { - return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_FORM_NAME)) - .filter(StringUtils::isNotBlank); + return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formName( + getNonEmptyFachnachrichtValueByKey(formData, KEY_FORM_NAME) + .orElse(DEFAULT_FORM_NAME) + )); } @SuppressWarnings("unchecked") @@ -106,12 +127,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema } FormData addFormEngineName(FormData formData) { - return formData.toBuilder() - .header(formData.getHeader().toBuilder() - .formEngineName("dFördermittelantrag") - .build() - ) - .build(); + return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formEngineName("dFördermittelantrag")); } String extractPrefix(@NonNull String postfachId) { diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java index 8f3bcec4c6ac8eb48984b6f40c38fca0473d5fe5..110e80b7d0a2f055a9624458e3ae15594ef87d86 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java @@ -22,6 +22,7 @@ import de.ozgcloud.common.binaryfile.TempFileUtils; import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; @@ -153,22 +154,23 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { @Mock FormData formData4; + @Mock + FormData formData5; + @BeforeEach void mock() { - var formData = DFoerdermittelFormDataTestFactory.create(); - var fachnachrichtMap = DFoerdermittelFormDataTestFactory.createFachnachrichtMap(); - when(formData0.getFormData()).thenReturn(formData.getFormData()); doReturn(formData1).when(adapter).addFormName(formData0); doReturn(formData2).when(adapter).addFormEngineName(formData1); - doReturn(formData3).when(adapter).addServiceKonto(formData2, fachnachrichtMap); - doReturn(formData4).when(adapter).addOrganisationsEinheitId(formData3, fachnachrichtMap); + doReturn(formData3).when(adapter).addServiceKonto(formData2); + doReturn(formData4).when(adapter).addOrganisationsEinheitId(formData3); + doReturn(formData5).when(adapter).addFormId(formData4); } @Test void shouldReturn() { var processedFormData = adapter.processFachnachricht(formData0); - assertThat(processedFormData).isEqualTo(formData4); + assertThat(processedFormData).isEqualTo(formData5); } } @@ -182,8 +184,7 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { @Test void shouldHaveServiceKonto() { - var formData = adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create(), - DFoerdermittelFormDataTestFactory.createFachnachrichtMap()); + var formData = adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create()); assertThat(formData.getHeader().getServiceKonto().getPostfachAddresses().get(0).getIdentifier()) .asInstanceOf(type(StringBasedIdentifier.class)).extracting(StringBasedIdentifier::getPostfachId) @@ -192,7 +193,7 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { @Test void shouldRemovePrefix() { - adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create(), DFoerdermittelFormDataTestFactory.createFachnachrichtMap()); + adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create()); verify(serviceKontoFactory).buildOsiServiceKonto(DFoerdermittelFormDataTestFactory.POSTFACH_ID); } @@ -219,8 +220,7 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { class TestAddOrganisationsEinheitId { @Test void shouldHaveOrganisationsEinheitId() { - var formData = adapter.addOrganisationsEinheitId(DFoerdermittelFormDataTestFactory.create(), - DFoerdermittelFormDataTestFactory.createFachnachrichtMap()); + var formData = adapter.addOrganisationsEinheitId(DFoerdermittelFormDataTestFactory.create()); assertThat(formData.getZustaendigeStelle()).isNotNull().extracting(ZustaendigeStelle::getOrganisationseinheitenId) .isEqualTo(ORGANISATIONS_EINHEIT_ID); @@ -260,6 +260,40 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { } + @DisplayName("add form id") + @Nested + class TestAddFormId { + + @DisplayName("should get form id from project title") + @Test + void shouldGetFormIdFromProjectTitle() { + var formData = adapter.addFormId(createFormDataWithProjectTitle(FORM_ID)); + + assertThat(formData.getHeader().getFormId()).isEqualTo(FORM_ID); + } + + @DisplayName("should keep form id if project title is empty") + @Test + void shouldKeepFormIdIfProjectTitleIsEmpty() { + var formData = adapter.addFormId(createFormDataWithProjectTitle("")); + + assertThat(formData.getHeader().getFormId()).isEqualTo(FormHeaderTestFactory.FORM_ID); + } + + @DisplayName("should keep form id if project title is null") + @Test + void shouldKeepFormIdIfProjectTitleIsNull() { + var formData = adapter.addFormId(createFormDataWithProjectTitle(null)); + + assertThat(formData.getHeader().getFormId()).isEqualTo(FormHeaderTestFactory.FORM_ID); + } + + FormData createFormDataWithProjectTitle(String projectTitle) { + return createFachnachrichtBuilder().projectTitle(projectTitle).build().createFormData(); + } + + } + @Nested class TestAddFormEngineName { diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java index 969f4a635ed892e59106591f73d945b27f0b40be..8b8c9bf4103b13f085a7910361925a11e7b90297 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java @@ -8,17 +8,20 @@ import java.util.function.Predicate; import java.util.stream.IntStream; import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; import lombok.Builder; class DFoerdermittelFormDataTestFactory { static final String FORM_NAME = "Name of form"; + static final String FORM_ID = "Wert von ProjectTitle"; static final String POSTFACH_ID = "4dd01647-b9d9-4775-1b50-08da3d83800a"; static final String ORGANISATIONS_EINHEIT_ID = "9795669"; static Fachnachricht.FachnachrichtBuilder createFachnachrichtBuilder() { return Fachnachricht.builder() .title(FORM_NAME) + .projectTitle(FORM_ID) .postfachId(POSTFACH_ID) .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID); } @@ -33,6 +36,7 @@ class DFoerdermittelFormDataTestFactory { static FormData.FormDataBuilder createBuilderWithFachnachricht(Fachnachricht fachnachricht) { return FormData.builder() + .header(FormHeaderTestFactory.create()) .formData(Map.of("Fachnachricht", createFachnachrichtMapWithFachnachricht(fachnachricht))); } @@ -44,6 +48,7 @@ class DFoerdermittelFormDataTestFactory { return createMapWithValueFilter( Objects::nonNull, "Title", fachnachricht.title(), + "ProjectTitle", fachnachricht.projectTitle(), "InboxReference", "sh/sh/" + fachnachricht.postfachId(), "MetaText1", fachnachricht.organisationsEinheitId() ); @@ -61,7 +66,7 @@ class DFoerdermittelFormDataTestFactory { } @Builder - record Fachnachricht(String title, String postfachId, String organisationsEinheitId) { + record Fachnachricht(String title, String projectTitle, String postfachId, String organisationsEinheitId) { FormData createFormData() { return createBuilderWithFachnachricht(this).build(); }