diff --git a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormData.java b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormData.java index 63bfd47f7ebe982e66315507cb6a17e7d38dd007..e453853dd85f354ff8d0ab59f86cef980c5607de 100644 --- a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormData.java +++ b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormData.java @@ -43,7 +43,8 @@ public class FormData { @Builder.Default private String id = UUID.randomUUID().toString(); - private FormHeader header; + @Builder.Default + private FormHeader header = FormHeader.builder().build(); private ZustaendigeStelle zustaendigeStelle; @ToString.Exclude diff --git a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormHeader.java b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormHeader.java index ca599555c2418396f0bf7106cb31ba910fb803f1..f637172c3141726b8e4d827832485d81835b19f7 100644 --- a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormHeader.java +++ b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/FormHeader.java @@ -32,7 +32,7 @@ import lombok.ToString; @Getter @Setter -@Builder +@Builder(toBuilder = true) @ToString public class FormHeader { diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/ServiceKontoBuildHelper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/ServiceKontoBuildHelper.java index 4189c0af675af2d8e0b3cb795b58b9a06073e932..9e052241a6bc083a015b611098a402510c5d5311 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/ServiceKontoBuildHelper.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/ServiceKontoBuildHelper.java @@ -25,11 +25,11 @@ public class ServiceKontoBuildHelper { public static final String REST_RESPONSE_NAME_MEMBER_SCOPE = "memberscope"; public static final String REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE = "mailboxtype"; - public ServiceKonto buildServicekonto(String postfachId) { + public ServiceKonto buildServiceKonto(String postfachId) { return buildDefault(postfachId); } - public ServiceKonto buildServiceKonto(String postfachId, FormData formData) { // NOSONAR + public ServiceKonto buildServiceKonto(String postfachId, FormData formData) { return Optional.ofNullable(getRestResponseNames(formData)) .filter(names -> !names.isEmpty()) .map(restResponseNames -> buildWithRestResponseNames(postfachId, restResponseNames)) diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java index 5b453a6a3be544fc1ccf7329ed053c39db1f5281..b9990e7663eae32144e32c036f252d5daa72a291 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java @@ -65,8 +65,8 @@ class FormSolutionsHeaderMapper implements FormSolutionsEngineBasedMapper { .formId(getIdentifier(formData)) .requestId(getRequestId(formData)) .formEngineName(FORM_ENGINE_NAME); - - Optional.ofNullable(getPostkorbhandle(formData)).map(serviceKontoBuildHelper::buildServicekonto).ifPresent(formHeaderBuilder::serviceKonto); + + Optional.ofNullable(getPostkorbhandle(formData)).map(serviceKontoBuildHelper::buildServiceKonto).ifPresent(formHeaderBuilder::serviceKonto); return formHeaderBuilder.build(); } diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapper.java index aba71d524317fb377a881a2b3feb9523cd74a4c6..4422fbd43859270eaf2e1f8a630f623d80f1617e 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapper.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapper.java @@ -5,23 +5,34 @@ import java.io.InputStream; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Optional; 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; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; +import de.itvsh.kop.eingangsadapter.common.formdata.ServiceKonto; +import de.itvsh.kop.eingangsadapter.semantik.enginebased.ServiceKontoBuildHelper; import lombok.extern.log4j.Log4j2; @Log4j2 +@Component public class DFoerdermittelFormBasedMapper implements FormBasedMapper { private static final String FACHNACHRICHT_SUFFIX = "Fachnachricht.xml"; private static final Predicate<IncomingFile> IS_FACHNACHRICHT = inFile -> StringUtils.endsWith(inFile.getName(), FACHNACHRICHT_SUFFIX); private static final String KEY_FACHNACHRICHT = "Fachnachricht"; + private static final String KEY_POSTFACH_ID = "InboxReference"; + + @Autowired + private ServiceKontoBuildHelper serviceKontoHelper; @Override public FormData parseFormData(FormData formData) { @@ -30,11 +41,28 @@ public class DFoerdermittelFormBasedMapper implements FormBasedMapper { .orElse(formData); } + FormData addServiceKonto(FormData formData) { + @SuppressWarnings("unchecked") + Map<String, Object> fachnachricht = (Map<String, Object>) MapUtils.getMap(formData.getFormData(), KEY_FACHNACHRICHT, + Collections.<String, Object>emptyMap()); + + return Optional.ofNullable((String) fachnachricht.get(KEY_POSTFACH_ID)) + .map(this::createServiceKonto) + .map(serviceKonto -> formData.getHeader().toBuilder().serviceKonto(serviceKonto).build()) + .map(header -> formData.toBuilder().header(header).build()) + .orElse(formData); + + } + + private ServiceKonto createServiceKonto(String postfachId) { + return serviceKontoHelper.buildServiceKonto(postfachId); + } + FormData parseFachnachricht(FormData formData, IncomingFile fachnachrichtFile) { // TODO allow re-reading of incoming file var fachnachrichtData = extractFormDataFormXML(fachnachrichtFile.getContentStream()); - if (fachnachrichtData != null) { + if (MapUtils.isNotEmpty(fachnachrichtData)) { var editable = new HashMap<>(formData.getFormData()); editable.put(KEY_FACHNACHRICHT, fachnachrichtData); return formData.toBuilder().formData(Collections.unmodifiableMap(editable)).build(); @@ -52,7 +80,7 @@ public class DFoerdermittelFormBasedMapper implements FormBasedMapper { } catch (IOException e) { LOG.error("Error reading xml fachnachricht.", e); } - return null; + return Collections.emptyMap(); } @Override diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java index 72028949552e4ee60df7ccbf7a778652f12d2c82..457e458d58eeba1b8b219f93459b7941e593b312 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java @@ -119,7 +119,7 @@ class FormSolutionsHeaderMapperTest { void shouldCallServiceKontoBuildHelper() { buildFormHeader(); - verify(serviceKontoBuildHelper).buildServicekonto(any()); + verify(serviceKontoBuildHelper).buildServiceKonto(any()); } @Test @@ -128,7 +128,7 @@ class FormSolutionsHeaderMapperTest { mapper.buildFormHeader(formDataWithoutPostkorbHandle); - verify(serviceKontoBuildHelper, never()).buildServicekonto(any()); + verify(serviceKontoBuildHelper, never()).buildServiceKonto(any()); } } diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java index fc7eea7f60f121d5d74fde20d4082376117c90cb..31ef8cf55fd76c93dad228d76e47fabae4a0259f 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java @@ -11,12 +11,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Spy; import de.itvsh.kop.common.test.TestUtils; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; +import de.itvsh.kop.eingangsadapter.common.formdata.ServiceKontoTestFactory; +import de.itvsh.kop.eingangsadapter.semantik.enginebased.ServiceKontoBuildHelper; class DFoerdermittelFormBasedMapperTest { @@ -24,6 +27,9 @@ class DFoerdermittelFormBasedMapperTest { @InjectMocks private DFoerdermittelFormBasedMapper mapper; + @Mock + private ServiceKontoBuildHelper serviceKontoHelper; + @Nested class TestIsResponsible { @@ -72,15 +78,12 @@ class DFoerdermittelFormBasedMapperTest { @Nested class HandleFachnachrichtData { - private Map<String, Object> extracted = Collections.emptyMap(); - - @BeforeEach - void init() { - doReturn(extracted).when(mapper).extractFormDataFormXML(any()); - } + private Map<String, Object> extracted = Map.of("name", "Theo"); @Test void shouldCallExtractData() { + doReturn(extracted).when(mapper).extractFormDataFormXML(any()); + mapper.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile()); verify(mapper).extractFormDataFormXML(notNull()); @@ -88,13 +91,22 @@ class DFoerdermittelFormBasedMapperTest { @Test void shouldAddMap() { + doReturn(extracted).when(mapper).extractFormDataFormXML(any()); var result = mapper.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile()); assertThat(result.getFormData()).containsEntry("Fachnachricht", extracted); } - } + @Test + void shouldIgnoreEmptyData() { + doReturn(Collections.emptyMap()).when(mapper).extractFormDataFormXML(any()); + + var result = mapper.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile()); + + assertThat(result.getFormData()).doesNotContainKey("Fachnachricht"); + } + } } FormData createWithFachnachricht() { @@ -112,4 +124,20 @@ class DFoerdermittelFormBasedMapperTest { .name("Beispieldatensatz_Fachnachricht.xml") .build(); } + + @Nested + class TestAddServiceKonto { + + @BeforeEach + void init() { + when(serviceKontoHelper.buildServiceKonto(any())).thenReturn(ServiceKontoTestFactory.create()); + } + + @Test + void shouldHaveServiceKonto() { + var formData = mapper.addServiceKonto(DFoerdermittelFormDataTestFactory.create()); + + assertThat(formData.getHeader().getServiceKonto()).isNotNull(); + } + } } diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormDataTestFactory.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormDataTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..19f9862e967395df80b73aa2a38ef774f4f8655c --- /dev/null +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormDataTestFactory.java @@ -0,0 +1,21 @@ +package de.itvsh.kop.eingangsadapter.semantik.formbased; + +import java.util.Map; + +import de.itvsh.kop.eingangsadapter.common.formdata.FormData; + +class DFoerdermittelFormDataTestFactory { + + static FormData create() { + return createBuilder().build(); + } + + static FormData.FormDataBuilder createBuilder() { + return FormData.builder() + .formData(Map.of("Fachnachricht", createFachnachrichtMap())); + } + + static Map<String, Object> createFachnachrichtMap() { + return Map.of("InboxReference", "sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a"); + } +} diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index ead1be9978bd5e8dfaef3b176a1d1e193a3bb4c3..94ef45f82231b769e0bc9184910d1238faa00e60 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -97,6 +97,9 @@ <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <profiles>local,sec</profiles> + </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId>