Skip to content
Snippets Groups Projects
Commit 5dc2dda3 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-3757 parse fachnachricht into form data

parent d107dceb
No related branches found
No related tags found
No related merge requests found
......@@ -43,6 +43,17 @@
<artifactId>router</artifactId>
</dependency>
<!-- Tools -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<!-- test -->
<dependency>
<groupId>de.itvsh.kop.eingangsadapter</groupId>
......
package de.itvsh.kop.eingangsadapter.semantik.formbased;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import lombok.extern.log4j.Log4j2;
@Log4j2
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";
@Override
public FormData parseFormData(FormData formData) {
return formData.getRepresentations().stream().filter(IS_FACHNACHRICHT).findAny()
.map(inFile -> parseFachnachricht(formData, inFile))
.orElse(formData);
}
FormData parseFachnachricht(FormData formData, IncomingFile fachnachrichtFile) {
// TODO allow re-reading of incoming file
var fachnachrichtData = extractFormDataFormXML(fachnachrichtFile.getContentStream());
if (fachnachrichtData != null) {
var editable = new HashMap<>(formData.getFormData());
editable.put(KEY_FACHNACHRICHT, fachnachrichtData);
return formData.toBuilder().formData(Collections.unmodifiableMap(editable)).build();
}
return formData;
}
@SuppressWarnings("unchecked")
Map<String, Object> extractFormDataFormXML(InputStream xmlFileStream) {
XmlMapper xmlMapper = new XmlMapper();
try {
return xmlMapper.readValue(xmlFileStream, Map.class);
} catch (IOException e) {
LOG.error("Error reading xml fachnachricht.", e);
}
return null;
}
@Override
public boolean isResponsible(FormData formData) {
return formData.getRepresentations().stream().anyMatch(IS_FACHNACHRICHT);
}
}
package de.itvsh.kop.eingangsadapter.semantik.formbased;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.Collections;
import java.util.Map;
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.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;
class DFoerdermittelFormBasedMapperTest {
@Spy
@InjectMocks
private DFoerdermittelFormBasedMapper mapper;
@Nested
class TestIsResponsible {
@Test
void shouldBeTrueWithFachnachricht() {
var responsible = mapper.isResponsible(createWithFachnachricht());
assertThat(responsible).isTrue();
}
@Test
void shouldBeFalseForOuther() {
var responsible = mapper.isResponsible(FormDataTestFactory.create());
assertThat(responsible).isFalse();
}
}
@Nested
class TestParseFachnachricht {
@Nested
class ExtractData {
@Test
void shouldHaveFormData() {
var result = mapper.extractFormDataFormXML(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml"));
assertThat(result).isNotNull();
}
@Test
void shouldHavePages() {
var result = mapper.extractFormDataFormXML(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml"));
assertThat(result).containsKey("Pages");
}
@Test
void shouldHaveInboxRef() {
var result = mapper.extractFormDataFormXML(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml"));
assertThat(result).containsEntry("InboxReference", "sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a");
}
}
@Nested
class HandleFachnachrichtData {
private Map<String, Object> extracted = Collections.emptyMap();
@BeforeEach
void init() {
doReturn(extracted).when(mapper).extractFormDataFormXML(any());
}
@Test
void shouldCallExtractData() {
mapper.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile());
verify(mapper).extractFormDataFormXML(notNull());
}
@Test
void shouldAddMap() {
var result = mapper.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile());
assertThat(result.getFormData()).containsEntry("Fachnachricht", extracted);
}
}
}
FormData createWithFachnachricht() {
return FormData.builder()
.formData(Collections.emptyMap())
.representation(createFachnachrichtFile()).build();
}
IncomingFile createFachnachrichtFile() {
return IncomingFile.builder()
.contentStream(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml"))
.contentType("application/xml")
.size(1283)
.name("Beispieldatensatz_Fachnachricht.xml")
.build();
}
}
<?xml version="1.0" encoding="utf-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.dataport.de/dFAD/ApplicationDataMessageSchema">
<ApplicationFormId>08db3c1c-db1f-4d27-8dec-73af167e87f2</ApplicationFormId>
<Timestamp>2023-04-18T11:40:24.9940624+02:00</Timestamp>
<ApplicationDataMessageVersion>1</ApplicationDataMessageVersion>
<Title>Testantrag XML-Fachnachricht-Erweiterung</Title>
<ProjectName>XML-Fachnachricht-Erweiterung</ProjectName>
<ProjectTitle>XML-Fachnachricht-Erweiterung</ProjectTitle>
<TransmittedApplicationId>7AtSMHpx3LfJp4</TransmittedApplicationId>
<InboxReference>sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a</InboxReference>
<MetaText1>9795669</MetaText1>
<Pages>
<Page>
<Title>Beispiel Seite 1</Title>
<Navigation>Beispiel Seite 1</Navigation>
<Controls>
<Control>
<RadioButtonGroup>
<Label>Beispiel-Steuerelement</Label>
<Alias>beispiel-element</Alias>
<SelectedItems>
<SelectedItem>
<Label>Beispielwert 2</Label>
<Value>bsp-2</Value>
</SelectedItem>
</SelectedItems>
</RadioButtonGroup>
</Control>
</Controls>
</Page>
</Pages>
</application>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment