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 0ad23b9e4e08d54aa7e356c3ea2cde213d0fc7f4..5c5f434fd84471469f5c6a05324b9ec94eab2a97 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 @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -61,6 +62,8 @@ public class FormDataTestFactory { IncomingFileGroupTestFactory.createBuilder().name(ATTACHMENT_GROUP_2).build()); public static final List<IncomingFile> REPRESENTATIONS = List.of(IncomingFileTestFactory.create()); + public static final FormDataControl FORM_DATA_CONTROL = FormDataControlTestFactory.create(); + public static final Map<String, Object> FORM_DATA = Map.of( SIMPLE_VALUE_KEY, SIMPLE_VALUE, SUBFORM_KEY, SUBFORM_VALUE, @@ -76,7 +79,7 @@ public class FormDataTestFactory { .header(FormHeaderTestFactory.create()) .antragsteller(AntragstellerTestFactory.create()) .zustaendigeStelle(ZustaendigeStelleTestFactory.create()) - .control(FormDataControlTestFactory.create()) + .control(FORM_DATA_CONTROL) .formData(FORM_DATA) // TODO nach entfernen des zweiten Attachments den Wert auf 1 setzen .numberOfAttachments(2) diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java index f64fee934e5fd263903ce5a0143a05b80f4b051b..9dfc1519007b4f0bd2807f90cda31413ae8a28d9 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java @@ -1,7 +1,9 @@ package de.ozgcloud.eingang.fim; import java.util.Map; +import java.util.Optional; +import org.apache.commons.collections.MapUtils; import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.Antragsteller; @@ -24,30 +26,30 @@ class AntragstellerMapper implements FimEngineBasedMapper { @Override public FormData parseFormData(FormData formData) { - return formData.toBuilder() - .antragsteller(mapAntragsteller(formData.getFormData())) - .build(); + return Optional.ofNullable(getAntragsteller(formData.getFormData())) + .filter(MapUtils::isNotEmpty) + .map(this::mapAntragsteller) + .map(antragsteller -> formData.toBuilder().antragsteller(antragsteller).build()).orElse(formData); + } + + Map<String, Object> getAntragsteller(Map<String, Object> formData) { + return FimDataUtil.getSubmap(formData, ANTRAGSTELLER_KEY); } - Antragsteller mapAntragsteller(Map<String, Object> formData) { - var antragsteller = getAntragsteller(formData); + Antragsteller mapAntragsteller(Map<String, Object> antragsteller) { var anschrift = getAnschrift(antragsteller); return Antragsteller.builder() - .vorname(FimDataUtil.getValue(antragsteller, VORNAME_KEY).orElse(null)) - .nachname(FimDataUtil.getValue(antragsteller, NACHNAME_KEY).orElse(null)) - .email(FimDataUtil.getValue(antragsteller, EMAIL_KEY).orElse(null)) - .strasse(FimDataUtil.getValue(anschrift, STRASSE_KEY).orElse(null)) - .hausnummer(FimDataUtil.getValue(anschrift, HAUSNUMMER_KEY).orElse(null)) - .plz(FimDataUtil.getValue(anschrift, PLZ_KEY).orElse(null)) - .ort(FimDataUtil.getValue(anschrift, ORT_KEY).orElse(null)) + .vorname(FimDataUtil.getValueByKey(antragsteller, VORNAME_KEY).orElse(null)) + .nachname(FimDataUtil.getValueByKey(antragsteller, NACHNAME_KEY).orElse(null)) + .email(FimDataUtil.getValueByKey(antragsteller, EMAIL_KEY).orElse(null)) + .strasse(FimDataUtil.getValueByKey(anschrift, STRASSE_KEY).orElse(null)) + .hausnummer(FimDataUtil.getValueByKey(anschrift, HAUSNUMMER_KEY).orElse(null)) + .plz(FimDataUtil.getValueByKey(anschrift, PLZ_KEY).orElse(null)) + .ort(FimDataUtil.getValueByKey(anschrift, ORT_KEY).orElse(null)) .build(); } - private Map<String, Object> getAntragsteller(Map<String, Object> formData) { - return FimDataUtil.getSubmap(formData, ANTRAGSTELLER_KEY); - } - private Map<String, Object> getAnschrift(Map<String, Object> antragsteller) { return FimDataUtil.getSubmap(antragsteller, ANSCHRIFT_KEY); } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java index 75487f4b3eba8ddd41ae2856bc557be292ac67ae..cd406cce2d95d9679884597da32083f8d668110e 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java @@ -1,10 +1,15 @@ package de.ozgcloud.eingang.fim; +import java.util.Collections; import java.util.List; +import java.util.Map; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.IncomingFile; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -31,11 +36,27 @@ public class FimBasedAdapter implements EngineBasedSemantikAdapter { for (var mapper : mappers) { processedFormData = mapper.parseFormData(processedFormData); } - return processedFormData; } FormData addFormDataDataMap(FormData formData) { - return formData.toBuilder().formData(service.parseRequestData(formData)).build(); + return formData.toBuilder().formData(parseRequestData(formData)).build(); + } + + Map<String, Object> parseRequestData(FormData formData) { + return service.findPrimaryRepresentation(formData).map(this::doParse).orElseGet(Collections::emptyMap); + } + + Map<String, Object> doParse(IncomingFile file) { + try { + return processData(DocumentHelper.parse(file.getContentStream())); + } catch (Exception e) { + LOG.warn("Error on parsing Document.", e); + return Collections.<String, Object>emptyMap(); + } + } + + Map<String, Object> processData(Document content) { + return FimDocumentHelper.createProcessor(content, service.getScheme(content)).process(); } } \ No newline at end of file diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java deleted file mode 100644 index b027412baa094ca2e8074eb58b45225cbd772d85..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.BiFunction; - -import org.springframework.stereotype.Service; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.Text; - -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Service -class FimDataMapper implements BiFunction<Document, FimScheme, Map<String, Object>> { - - private static final String LABEL_KEY = "label"; - private static final String VALUE_KEY = "value"; - - @Override - public Map<String, Object> apply(Document document, FimScheme fimScheme) { - return extractDocumentData(document.getDocumentElement(), fimScheme); - } - - Map<String, Object> extractDocumentData(Element documentRoot, FimScheme fimScheme) { - var data = new LinkedHashMap<String, Object>(); - processNode(documentRoot, fimScheme, data, 0); - return data; - } - - void processNode(Node element, FimScheme fimScheme, Map<String, Object> data, int level) { - LOG.debug(">".repeat(level) + " " + element.getNodeName()); - - var childNodes = element.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - if (childNodes.item(i) instanceof Element childElement) { - processElement(childElement, fimScheme, data, level); - } - } - } - - void processElement(Element childElement, FimScheme fimScheme, Map<String, Object> data, int level) { - var fieldName = fimScheme.getFieldName(childElement.getNodeName()); - var fieldNameWithoutNamespace = getFieldNameWithoutNamespace(childElement.getNodeName()); - var label = fieldName.orElse(fieldNameWithoutNamespace); - - if (isTextNode(childElement)) { - data.put(fieldNameWithoutNamespace, buildFieldMap(label, childElement.getTextContent())); - } else { - var childMap = new LinkedHashMap<String, Object>(); - data.put(fieldNameWithoutNamespace, buildFieldMap(label, childMap)); - processNode(childElement, fimScheme, childMap, level + 1); - } - } - - private String getFieldNameWithoutNamespace(String nodeName) { - var fieldNameParts = nodeName.split(":"); - return fieldNameParts[fieldNameParts.length - 1]; - } - - private boolean isTextNode(Node child) { - return child.getChildNodes().getLength() == 1 && child.getChildNodes().item(0) instanceof Text; - } - - private Map<String, Object> buildFieldMap(String fieldName, Object obj) { - return Map.<String, Object>of(LABEL_KEY, fieldName, VALUE_KEY, obj); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java index 06bbb98cec5de6c6bf94c13720693059a42ec76f..6d932ed9ee5642ad0010892cc2e5dc7f116124e0 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataUtil.java @@ -1,5 +1,6 @@ package de.ozgcloud.eingang.fim; +import java.util.Arrays; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -15,21 +16,16 @@ class FimDataUtil { static final String VALUE_KEY = "value"; - public static Optional<String> getValue(Map<String, Object> data, String... path) { - var current = FimDataUtil.getSubmap(data, ArrayUtils.subarray(path, 0, path.length - 1)); + public static Optional<String> getValue(Map<String, Object> data, String key, String... path) { + var current = FimDataUtil.getSubmap(data, ArrayUtils.subarray(path, 0, path.length)); if (Objects.isNull(current)) { return Optional.empty(); } - var map = FimDataUtil.castToMap(MapUtils.getMap(current, path[path.length - 1])); - return Optional.ofNullable(FimDataUtil.getValueAsString(map)); + return FimDataUtil.getValueByKey(current, key); } public static Map<String, Object> getSubmap(Map<String, Object> data, String... path) { - var current = data; - for (var step : path) { - current = FimDataUtil.getValueMapByKey(current, step); - } - return current; + return Arrays.stream(path).reduce(data, FimDataUtil::getValueMapByKey, (accumulator, combiner) -> combiner); } static Map<String, Object> getValueMapByKey(Map<String, Object> obj, String key) { @@ -39,6 +35,11 @@ class FimDataUtil { .orElse(null); } + public static Optional<String> getValueByKey(Map<String, Object> data, String key) { + var map = FimDataUtil.castToMap(MapUtils.getMap(data, key)); + return Optional.ofNullable(MapUtils.getString(map, VALUE_KEY)); + } + @SuppressWarnings("unchecked") private static Map<String, Object> castToMap(Map<?, ?> obj) { return (Map<String, Object>) obj; @@ -47,8 +48,4 @@ class FimDataUtil { private static Map<String, Object> getValueAsMap(Map<String, Object> map) { return FimDataUtil.castToMap(MapUtils.getMap(map, VALUE_KEY)); } - - private static String getValueAsString(Map<String, Object> map) { - return (String) map.get(VALUE_KEY); - } } \ No newline at end of file diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDocumentReader.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDocumentReader.java new file mode 100644 index 0000000000000000000000000000000000000000..c629f7dd8d0ccc88aa4dfa3ad280b14399d79e84 --- /dev/null +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDocumentReader.java @@ -0,0 +1,71 @@ +package de.ozgcloud.eingang.fim; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Optional; + +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@Component +class FimDocumentHelper { + + public static FimDocumentProcessor createProcessor(Document doc, FimScheme fimScheme) { + return new FimDocumentProcessor(doc, fimScheme); + } + + @Log4j2 + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + static class FimDocumentProcessor { + + private static final String LABEL_KEY = "label"; + private static final String VALUE_KEY = "value"; + + private final Document document; + private final FimScheme scheme; + + public Map<String, Object> process() { + var data = new LinkedHashMap<String, Object>(); + processNode(document.getDocumentElement(), data); + return Collections.unmodifiableMap(data); + } + + void processNode(Node element, Map<String, Object> data) { + LOG.debug(() -> "process node... " + element.getNodeName()); + DocumentHelper.getChildNodes(element.getChildNodes()).forEach(childElement -> processElement(childElement, data)); + } + + void processElement(Element element, Map<String, Object> data) { + if (DocumentHelper.isTextNode(element)) { + addToMap(element, data, element.getTextContent()); + } else { + var childMap = new LinkedHashMap<String, Object>(); + addToMap(element, data, childMap); + processNode(element, childMap); + } + } + + private void addToMap(Element element, Map<String, Object> data, Object value) { + var fieldName = DocumentHelper.getFieldNameWithoutNamespace(element.getNodeName()); + data.put(fieldName, buildFieldMap(getFieldName(element).orElse(fieldName), value)); + } + + private Optional<String> getFieldName(Element element) { + return scheme.getFieldName(element.getNodeName()); + } + + private Map<String, Object> buildFieldMap(String fieldName, Object obj) { + return Map.<String, Object>of(LABEL_KEY, fieldName, VALUE_KEY, obj); + } + } +} \ No newline at end of file diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java index 5e7e6ca6e1ceb4ad714be35a289c11fe02333419..1269441bbe51bd8b99ddf0c5bd15fcf4be983737 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java @@ -6,7 +6,9 @@ import java.util.Optional; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; import lombok.Getter; class FimScheme { @@ -28,15 +30,18 @@ class FimScheme { } private void buildFieldIndex() { - var groupList = doc.getElementsByTagName("xs:element"); - for (int i = 0; i < groupList.getLength(); i++) { - var group = (Element) groupList.item(i); - var groupName = group.getAttribute("name"); - fieldIndex.put(groupName, group); - } + DocumentHelper.getChildNodes(getElements()).forEach(group -> fieldIndex.put(getName(group), group)); } - Optional<String> getFieldName(final String fieldName) { + private NodeList getElements() { + return doc.getElementsByTagName("xs:element"); + } + + private String getName(Element element) { + return element.getAttribute("name"); + } + + Optional<String> getFieldName(String fieldName) { return schemeAdapter.getFieldName(fieldIndex, fieldName); } } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java index e2097792bfee16fa4e04ae93d01f17b24005de8f..f4c6fe23afcd3d94c44df1f8bd08a7ccd4a54dfb 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java @@ -4,36 +4,26 @@ import java.util.Map; import java.util.Optional; import org.w3c.dom.Element; -import org.w3c.dom.NodeList; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; import lombok.extern.log4j.Log4j2; @Log4j2 public abstract class FimSchemeAdapter { - public abstract FimSchemeIdentifier getIdentifier(); - - public Optional<String> getFieldName(final Map<String, Element> fieldIndex, final String fieldName) { - final String[] fieldNameParts = fieldName.split(":"); - final String fieldNameWithoutNamespace = fieldNameParts[fieldNameParts.length - 1]; - if (!fieldIndex.containsKey(fieldNameWithoutNamespace)) { - LOG.error("Cannot find Field: " + fieldName); - return Optional.empty(); - } - final Element nodeNameElement = fieldIndex.get(fieldNameWithoutNamespace); - final Optional<String> nodeNameOpt = getNameForElement(nodeNameElement); - return nodeNameOpt.map(this::cleanNodeName); - } - - public Optional<String> getNameForElement(final Element element) { - final NodeList nameTags = element.getElementsByTagName("name"); - if (nameTags.getLength() != 1) { - return Optional.empty(); - } - return Optional.ofNullable(nameTags.item(0).getTextContent()); - } - - public String cleanNodeName(final String s) { - return s.trim(); - } + public abstract FimSchemeIdentifier getIdentifier(); + + public Optional<String> getFieldName(Map<String, Element> fieldIndex, String fieldName) { + var fieldNameWithoutNamespace = DocumentHelper.getFieldNameWithoutNamespace(fieldName); + + if (!fieldIndex.containsKey(fieldNameWithoutNamespace)) { + LOG.error("Cannot find Field: " + fieldName); + return Optional.empty(); + } + return getNameForElement(fieldIndex.get(fieldNameWithoutNamespace)); + } + + public Optional<String> getNameForElement(Element element) { + return DocumentHelper.getChildElement(element, "name"); + } } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java index 580a3d9a4c70950c200e9f6cccfd40d789221ae2..f0e9330434bfdfc6cc1fbac5866bd403e47c2d1a 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java @@ -4,8 +4,6 @@ import java.io.File; import java.io.IOException; import java.util.LinkedHashMap; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.springframework.core.io.ResourceLoader; @@ -13,6 +11,7 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; import lombok.extern.log4j.Log4j2; @Log4j2 @@ -56,12 +55,12 @@ class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> { } private void initUnknownScheme() throws ParserConfigurationException { - put(createScheme(createDocumentBuilder().newDocument(), UnknownSchemeAdapter.UNKNOWN_SCHEME_NAME)); + put(createScheme(DocumentHelper.getDocumentBuilder().newDocument(), UnknownSchemeAdapter.UNKNOWN_SCHEME_NAME)); } private FimScheme loadFimScheme(String path) throws ParserConfigurationException, IOException, SAXException { LOG.debug(() -> "Load FIM schema: " + path); - var doc = createDocumentBuilder().parse(getFile(path)); + var doc = DocumentHelper.parse(getFile(path)); return createScheme(doc, getTargetNamespace(doc)); } @@ -69,10 +68,6 @@ class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> { this.put(scheme.getIdentifier(), scheme); } - private DocumentBuilder createDocumentBuilder() throws ParserConfigurationException { - return DocumentBuilderFactory.newInstance().newDocumentBuilder(); - } - private File getFile(String path) throws IOException { return resourceLoader.getResource("classpath:" + path).getFile(); } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java index b0c2a5db8f5b5b698aea4f722001f9d504723696..b8b4143d04963a77a57844daf09c5dcc7b9df8f5 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java @@ -1,16 +1,15 @@ package de.ozgcloud.eingang.fim; +import lombok.AccessLevel; import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) @EqualsAndHashCode class FimSchemeIdentifier { private final String schemeId; - FimSchemeIdentifier(String schemeId) { - this.schemeId = schemeId; - } - public static FimSchemeIdentifier fromString(String schemeId) { return new FimSchemeIdentifier(schemeId); } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java index 689bfae8147f7b103c53fca26eb5d1bfa271d404..121b7a9369c617c4270548297099a31469e2d470 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java @@ -1,7 +1,5 @@ package de.ozgcloud.eingang.fim; -import java.util.Collections; -import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -25,32 +23,16 @@ public class FimService { static final String DEFAULT_FORMDATA_REPRESENTATION_NAME = "Antrag.xml"; - private final FimDataMapper fimDataMapper; private final FimSchemeHelper schemeHelper; - private final DocumentHelper documentHelper; - public Map<String, Object> parseRequestData(FormData formData) { - return findRequestFile(formData).map(this::doParse).orElseGet(Collections::emptyMap); - } - - Map<String, Object> doParse(IncomingFile file) { - try { - var content = documentHelper.parse(file); - var schemeIdentifier = getSchemeForIdentifier(getSchemeName(content)); - return fimDataMapper.apply(content, schemeIdentifier); - } catch (Exception e) { - return Collections.<String, Object>emptyMap(); - } - } - - Optional<IncomingFile> findRequestFile(FormData formData) { - var primaryFormDataRepresentationName = getPrimaryRepresentationName(formData.getControl()); + public Optional<IncomingFile> findPrimaryRepresentation(FormData formData) { + var representationName = getRepresentationName(formData.getControl()); return formData.getRepresentations().stream() - .filter(file -> file.getName().endsWith(primaryFormDataRepresentationName)) + .filter(file -> file.getName().endsWith(representationName)) .findFirst(); } - String getPrimaryRepresentationName(FormDataControl formDataControl) { + String getRepresentationName(FormDataControl formDataControl) { return formDataControl.getRepresentations().map(Representations::getPrimaryFormDataRepresentation) .orElseGet(() -> { LOG.warn("No entry point found in metadata file for fim data mapping. Trying default."); @@ -58,13 +40,8 @@ public class FimService { }); } - String getSchemeName(Document doc) { - return Optional.of(documentHelper.extractSchemeName(doc)) - .filter(StringUtils::isNotEmpty) - .orElseThrow(() -> new FimException("XML Document does not provide a scheme.")); - } - - FimScheme getSchemeForIdentifier(String fimSchemaName) { + public FimScheme getScheme(Document document) { + var fimSchemaName = getSchemeName(document); var fimScheme = schemeHelper.getScheme(fimSchemaName); if (Objects.isNull(fimScheme)) { @@ -73,4 +50,10 @@ public class FimService { } return fimScheme; } + + String getSchemeName(Document doc) { + return Optional.of(DocumentHelper.extractSchemeName(doc)) + .filter(StringUtils::isNotEmpty) + .orElseThrow(() -> new FimException("XML Document does not provide a scheme.")); + } } \ No newline at end of file diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java index 31e45366490cf6bcd1c54fcba2e81b45ccd8355e..9309107809f45f4e177f440b4647df4120675e2c 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java @@ -6,7 +6,6 @@ import java.util.Optional; import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -15,20 +14,22 @@ import lombok.extern.log4j.Log4j2; @Component class HeaderMapper implements FimEngineBasedMapper { + static final String FORM_NAME_KEY = "F05002753"; + @Override public FormData parseFormData(FormData formData) { - return formData.toBuilder() - .header(buildHeader(formData)) - .build(); + return getFormName(formData.getFormData()).map(formName -> addFormName(formData, formName)).orElse(formData); } - FormHeader buildHeader(FormData formData) { - return formData.getHeader().toBuilder() - .formName(getFormName(formData.getFormData()).orElse(null)) - .build(); + Optional<String> getFormName(Map<String, Object> formData) { + return FimDataUtil.getValue(formData, FORM_NAME_KEY, "G17003529", "G05001479", "G05001480"); } - Optional<String> getFormName(Map<String, Object> formData) { - return FimDataUtil.getValue(formData, "G17003529", "G05001479", "G05001480", "F05002753"); + private FormData addFormName(FormData formData, String formName) { + return formData.toBuilder() + .header(formData.getHeader().toBuilder() + .formName(formName) + .build()) + .build(); } } \ No newline at end of file diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java index 69b20d1af523317fc741083b1ec198334a574afa..2190e23435ead3afd4b40399b1de1aa27fd44335 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java @@ -3,10 +3,12 @@ package de.ozgcloud.eingang.fim; import java.util.Map; import java.util.Optional; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.w3c.dom.Element; -@Service +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; + +@Component class UnknownSchemeAdapter extends FimSchemeAdapter { public static final String UNKNOWN_SCHEME_NAME = "unknown"; @@ -19,8 +21,6 @@ class UnknownSchemeAdapter extends FimSchemeAdapter { @Override public Optional<String> getFieldName(Map<String, Element> fieldIndex, String fieldName) { - var fieldNameParts = fieldName.split(":"); - var fieldNameWithoutNamespace = fieldNameParts[fieldNameParts.length - 1]; - return Optional.of(fieldNameWithoutNamespace); + return Optional.of(DocumentHelper.getFieldNameWithoutNamespace(fieldName)); } } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java index 6b31ebfc85afe8082d52a47b433235410adfa50e..0e410f64de2854a09777ef948e7cd9417a2e2581 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java @@ -1,26 +1,69 @@ package de.ozgcloud.eingang.fim.common.xml; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; import org.xml.sax.SAXException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; -@Component +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class DocumentHelper { - public Document parse(IncomingFile incomingFile) throws ParserConfigurationException, IOException, SAXException { - return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(incomingFile.getContentStream()); + public static Document parse(InputStream inputStream) throws ParserConfigurationException, IOException, SAXException { + return getDocumentBuilder().parse(inputStream); } - public String extractSchemeName(Document doc) { + public static Document parse(File file) throws ParserConfigurationException, IOException, SAXException { + return getDocumentBuilder().parse(file); + } + + public static DocumentBuilder getDocumentBuilder() throws ParserConfigurationException { + return DocumentBuilderFactory.newInstance().newDocumentBuilder(); + } + + public static String extractSchemeName(Document doc) { var tagParts = doc.getDocumentElement().getTagName().split(":"); var namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]); return doc.getDocumentElement().getAttribute("xmlns" + namespacePrefix); } -} + + public static Stream<Element> getChildNodes(NodeList childNodes) { + return IntStream.range(0, childNodes.getLength()) + .mapToObj(childNodes::item) + .filter(Element.class::isInstance) + .map(Element.class::cast); + } + + public static boolean isTextNode(Node child) { + return child.getChildNodes().getLength() == 1 && child.getChildNodes().item(0) instanceof Text; + } + + public static String getFieldNameWithoutNamespace(String nodeName) { + var fieldNameParts = nodeName.split(":"); + return fieldNameParts[fieldNameParts.length - 1]; + } + + public static Optional<String> getChildElement(Element element, String tagName) { + var nameTags = element.getElementsByTagName(tagName); + if (nameTags.getLength() != 1) { + return Optional.empty(); + } + return Optional.ofNullable(nameTags.item(0).getTextContent()).map(StringUtils::trim); + } +} \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java index fe829d0ef1416d982a3644476b46cd3965a1bca2..f6daa78ea5d7a00b56f86ed99941c87e1e0d6cc7 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java @@ -30,23 +30,78 @@ class AntragstellerMapperTest { private final FormData formData = FormDataTestFactory.createBuilder().antragsteller(null).build(); - @BeforeEach - void mock() { - doReturn(AntragstellerTestFactory.create()).when(mapper).mapAntragsteller(any()); + @DisplayName("on existing antragsteller") + @Nested + class TestOnExistingAntragsteller { + + private final Map<String, Object> antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap(); + private final Antragsteller antragsteller = AntragstellerTestFactory.create(); + + @BeforeEach + void mock() { + doReturn(antragstellerMap).when(mapper).getAntragsteller(any()); + doReturn(antragsteller).when(mapper).mapAntragsteller(any()); + } + + @Test + void shouldCallGetAntragsteller() { + mapper.parseFormData(formData); + + verify(mapper).getAntragsteller(FormDataTestFactory.FORM_DATA); + } + + @Test + void shouldCallMapAntragsteller() { + mapper.parseFormData(formData); + + verify(mapper).mapAntragsteller(antragstellerMap); + } + + @Test + void shouldReturnFormDataWithAntragsteller() { + var mappedFormData = mapper.parseFormData(formData); + + assertThat(mappedFormData.getAntragsteller()).isNotNull(); + } } + @DisplayName("on missing antragsteller") + @Nested + class TestOnMissingAntragsteller { + + @BeforeEach + void mock() { + doReturn(Collections.emptyMap()).when(mapper).getAntragsteller(any()); + } + + @Test + void shouldReturnNullAsAntragsteller() { + var mappedFormData = mapper.parseFormData(formData); + + assertThat(mappedFormData.getAntragsteller()).isNull(); + } + } + } + + @DisplayName("Get antragsteller") + @Nested + class TestGetAntragsteller { + @Test - void shouldCallMapAntragsteller() { - mapper.parseFormData(formData); + void shouldReturnMapIfAntragstellerExists() { + var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap(); + var formDataMap = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, Map.of(FimDataUtil.VALUE_KEY, antragstellerMap)); - verify(mapper).mapAntragsteller(FormDataTestFactory.FORM_DATA); + var antragsteller = mapper.getAntragsteller(formDataMap); + + assertThat(antragsteller).isNotEmpty().usingRecursiveComparison().isEqualTo(antragstellerMap); } @Test - void shouldReturnFormDataWithAntragsteller() { - var mappedFormData = mapper.parseFormData(formData); + void shouldReturnEmptyMapIfAntragstellerIsMissing() { + var antragsteller = mapper.getAntragsteller(Collections.emptyMap()); - assertThat(mappedFormData.getAntragsteller()).isNotNull(); + assertThat(antragsteller).isNull(); } } @@ -57,9 +112,8 @@ class AntragstellerMapperTest { @Test void shouldMap() { var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap(); - var formData = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap); - var antragsteller = mapper.mapAntragsteller(formData); + var antragsteller = mapper.mapAntragsteller(antragstellerMap); assertThat(antragsteller).usingRecursiveComparison().isEqualTo(AntragstellerTestFactory.create()); } diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java index 2dc6ad5a0c7493e50cb4a5e2e02a363b94adfbbc..e72806960894dce1f415e28f1624369c96852c71 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerTestFactory.java @@ -36,13 +36,11 @@ public class AntragstellerTestFactory { } public static Map<String, Object> createAntragstellerAsFimMap() { - var antragsteller = new HashMap<String, Object>(); - antragsteller.put(FimDataUtil.VALUE_KEY, Map.of( + return Map.of( AntragstellerMapper.VORNAME_KEY, Map.of(FimDataUtil.VALUE_KEY, VORNAME), AntragstellerMapper.NACHNAME_KEY, Map.of(FimDataUtil.VALUE_KEY, NACHNAME), AntragstellerMapper.EMAIL_KEY, Map.of(FimDataUtil.VALUE_KEY, EMAIL), - AntragstellerMapper.ANSCHRIFT_KEY, createAnschriftAsFimMap())); - return antragsteller; + AntragstellerMapper.ANSCHRIFT_KEY, createAnschriftAsFimMap()); } private static Map<String, Object> createAnschriftAsFimMap() { diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java deleted file mode 100644 index 4d228a09a8129974a542414e66b7158c231ae9a0..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -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.ozgcloud.common.test.ReflectionTestUtils; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; - -class FimBaseAdapterTest { - - @Spy - @InjectMocks - private FimBasedAdapter adapter; - @Mock - private FimEngineBasedMapper mapper; - @Mock - private FimService service; - - @DisplayName("Is responsible") - @Nested - class TestIsResponsible { - - @Test - void shouldReturnTrueOnFimFormEngineName() { - var formData = FormData.builder() - .header(FormHeaderTestFactory.createBuilder() - .formEngineName(FimBasedAdapter.FIM_FORM_ENGINE_NAME) - .build()) - .build(); - - var isResponsible = adapter.isResponsible(formData); - - assertThat(isResponsible).isTrue(); - } - } - - @DisplayName("Parse formData") - @Nested - class TestParseFormData { - - private final FormData formData = FormDataTestFactory.create(); - private final FormData mappedFormData = FormDataTestFactory.create(); - - @BeforeEach - void mock() { - doReturn(formData).when(adapter).addFormDataDataMap(any()); - - ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper)); - - when(mapper.parseFormData(any())).thenReturn(mappedFormData); - } - - @Test - void shouldCallAddFormDataDataMap() { - adapter.parseFormData(formData); - - verify(adapter).addFormDataDataMap(formData); - } - - @Test - void shouldCallMapper() { - adapter.parseFormData(formData); - - verify(mapper).parseFormData(formData); - } - - @Test - void shouldReturnFormData() { - var parsedFormData = adapter.parseFormData(formData); - - assertThat(parsedFormData).isEqualTo(mappedFormData); - } - } - - @DisplayName("Add formData dataMap") - @Nested - class TestAddFormDataDataMap { - - private final FormData formData = FormDataTestFactory.createBuilder().formData(null).build(); - - @BeforeEach - void mock() { - when(service.parseRequestData(any())).thenReturn(FormDataTestFactory.FORM_DATA); - } - - @Test - void shouldCallService() { - adapter.addFormDataDataMap(formData); - - verify(service).parseRequestData(formData); - } - - @Test - void shouldReturnFormDataWithDataMap() { - var enrichedFormData = adapter.addFormDataDataMap(formData); - - assertThat(enrichedFormData.getFormData()).isNotNull().isEqualTo(FormDataTestFactory.FORM_DATA); - } - } -} diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java index 683abc75602b2c494f016ad5508eab40cfcdc9de..e32906bc408d40d53b0fc8969f6aa0fa5fd63bf3 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterITCase.java @@ -22,6 +22,8 @@ import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; import de.ozgcloud.eingang.common.formdata.FormData.Representations; import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.IncomingFile; +import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; +import lombok.SneakyThrows; @ITCase @ActiveProfiles({ "itcase", "test" }) @@ -127,8 +129,8 @@ class FimBasedAdapterITCase { private Antragsteller createExpectedAntragsteller() { return Antragsteller.builder() - .vorname("Jörg").nachname("Bolay") - .email("joerg.bolay@dataport.de") + .vorname("Jörg").nachname("Smith") + .email("example@email.de") .strasse("Muster") .hausnummer("1") .plz("12345") @@ -136,4 +138,39 @@ class FimBasedAdapterITCase { .build(); } } + + @DisplayName("Process data") + @Nested + class TestDoParse { + + @SneakyThrows + @Test + void shouldTransformSimpleDocument() { + var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test2.xml")).build(); + + var formData = fimBasedAdapter.doParse(file); + + assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest2AsMap()); + } + + @SneakyThrows + @Test + void shouldTransformSimpleDocumentWithoutNamespace() { + var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test3.xml")).build(); + + var formData = fimBasedAdapter.doParse(file); + + assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest3AsMap()); + } + + @SneakyThrows + @Test + void shouldTransformDocument() { + var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/S17000652V1.4_test01.xml")).build(); + + var formData = fimBasedAdapter.doParse(file); + + assertThat(formData).isNotEmpty().isEqualTo(FimDocumentTestHelper.getVersammlungsAnzeigeAsMap()); + } + } } \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java index 07b9477b9d469b8392cc5b7eceac6bde9e98cb5c..39767e81d0c8def5bc9686d0809b60d892b3a204 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java @@ -1,24 +1,42 @@ package de.ozgcloud.eingang.fim; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; +import java.io.InputStream; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Spy; +import org.w3c.dom.Document; +import de.ozgcloud.common.test.ReflectionTestUtils; +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.IncomingFileTestFactory; +import de.ozgcloud.eingang.fim.FimDocumentHelper.FimDocumentProcessor; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; class FimBasedAdapterTest { + @Spy @InjectMocks private FimBasedAdapter adapter; @Mock private FimService service; - @Mock - private FimEngineBasedMapper mapper; @DisplayName("Is responsible") @Nested @@ -34,4 +52,242 @@ class FimBasedAdapterTest { assertThat(isResponsible).isTrue(); } } + + @DisplayName("Parse formData") + @Nested + class TestParseFormData { + + private final FormData formData = FormDataTestFactory.create(); + private final FormData enrichedFormData = FormDataTestFactory.create(); + private final FormData processedFormData = FormDataTestFactory.create(); + + @Mock + private FimEngineBasedMapper mapper; + + @BeforeEach + void initMocks() { + ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper)); + + doReturn(enrichedFormData).when(adapter).addFormDataDataMap(any()); + doReturn(processedFormData).when(mapper).parseFormData(any()); + } + + @Test + void shouldCallAddFormDataDataMap() { + adapter.parseFormData(formData); + + verify(adapter).addFormDataDataMap(formData); + } + + @Test + void shouldCallMapper() { + adapter.parseFormData(formData); + + verify(mapper).parseFormData(enrichedFormData); + } + + @Test + void shouldReturnProcessedData() { + var parsedFormData = adapter.parseFormData(formData); + + assertThat(parsedFormData).isEqualTo(processedFormData); + } + } + + @DisplayName("Add formData dataMap") + @Nested + class TestAddFormDataDataMap { + + private final FormData formData = FormDataTestFactory.createBuilder().formData(null).build(); + private final Map<String, Object> parsedFormDataDataMap = Collections.emptyMap(); + + @BeforeEach + void initMocks() { + doReturn(parsedFormDataDataMap).when(adapter).parseRequestData(any()); + } + + @Test + void shouldCallParseRequestData() { + adapter.addFormDataDataMap(formData); + + verify(adapter).parseRequestData(formData); + } + + @Test + void shouldHaveAddFormData() { + var enrichedFormData = adapter.addFormDataDataMap(formData); + + assertThat(enrichedFormData.getFormData()).isEqualTo(parsedFormDataDataMap); + } + } + + @DisplayName("Parse requestData") + @Nested + class TestParseRequestData { + + private final FormData formData = FormDataTestFactory.create(); + + @DisplayName("on existing primary representation") + @Nested + class TestOnExistingPrimaryRepresentation { + + private final IncomingFile representation = IncomingFileTestFactory.create(); + private final Map<String, Object> parsedData = Collections.emptyMap(); + + @BeforeEach + void initMocks() { + when(service.findPrimaryRepresentation(any())).thenReturn(Optional.of(representation)); + doReturn(parsedData).when(adapter).doParse(any()); + } + + @Test + void shouldCallServiceToFindPrimaryRepresentation() { + adapter.parseRequestData(formData); + + verify(service).findPrimaryRepresentation(formData); + } + + @Test + void shouldCallDoParse() { + adapter.parseRequestData(formData); + + verify(adapter).doParse(representation); + } + + @Test + void shouldReturnParsedData() { + var parsedRequestData = adapter.parseRequestData(formData); + + assertThat(parsedRequestData).isEqualTo(parsedData); + } + } + + @Test + void shouldReturnEmptyMapOnMissingPrimaryRepresentation() { + when(service.findPrimaryRepresentation(any())).thenReturn(Optional.empty()); + + var parsedRequestData = adapter.parseRequestData(formData); + + assertThat(parsedRequestData).isEmpty(); + } + } + + @DisplayName("Do parse") + @Nested + class TestDoParse { + + @Mock + private IncomingFile file; + + private final InputStream inputStream = InputStream.nullInputStream(); + + @BeforeEach + void initMocks() { + when(file.getContentStream()).thenReturn(inputStream); + } + + @Test + void shouldCallDocumentHelperParse() { + try (var helper = mockStatic(DocumentHelper.class)) { + adapter.doParse(file); + + helper.verify(() -> DocumentHelper.parse(inputStream)); + } + } + + @Test + void shouldCallProcessData() { + try (var helper = mockStatic(DocumentHelper.class)) { + var parsedContent = mock(Document.class); + helper.when(() -> DocumentHelper.parse(any(InputStream.class))).thenReturn(parsedContent); + + adapter.doParse(file); + + verify(adapter).processData(parsedContent); + } + } + + @Test + void shouldReturnProcessedContent() { + try (var helper = mockStatic(DocumentHelper.class)) { + var parsedContent = mock(Document.class); + helper.when(() -> DocumentHelper.parse(any(InputStream.class))).thenReturn(parsedContent); + var processedMap = Collections.emptyMap(); + doReturn(processedMap).when(adapter).processData(any()); + + var parsedData = adapter.doParse(file); + + assertThat(parsedData).isEqualTo(processedMap); + } + } + + @Test + void shouldReturnEmptyMapOnException() { + try (var helper = mockStatic(DocumentHelper.class)) { + helper.when(() -> DocumentHelper.parse(any(InputStream.class))).thenThrow(new RuntimeException()); + + var parsedData = adapter.doParse(file); + + assertThat(parsedData).isEmpty(); + } + } + } + + @DisplayName("Process data") + @Nested + class TestProcessData { + + @Mock + private Document content; + @Mock + private FimScheme scheme; + + @Mock + private FimDocumentProcessor processor; + + private MockedStatic<FimDocumentHelper> helper; + private final Map<String, Object> dataMap = Collections.<String, Object>emptyMap(); + + @BeforeEach + void initMocks() { + helper = mockStatic(FimDocumentHelper.class); + helper.when(() -> FimDocumentHelper.createProcessor(any(), any())).thenReturn(processor); + + when(processor.process()).thenReturn(dataMap); + when(service.getScheme(any())).thenReturn(scheme); + } + + @AfterEach + void tearDown() { + helper.close(); + } + + @Test + void shouldCallServiceToGetScheme() { + adapter.processData(content); + + verify(service).getScheme(content); + } + + @Test + void shouldCreateFimDocumentHelperProcessor() { + adapter.processData(content); + + helper.verify(() -> FimDocumentHelper.createProcessor(content, scheme)); + } + + @Test + void shouldProcess() { + adapter.processData(content); + + verify(processor).process(); + } + + @Test + void shouldReturnProcessedData() { + var processedData = adapter.processData(content); + + assertThat(processedData).isEqualTo(dataMap); + } + } } diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java deleted file mode 100644 index 9ca64413f8399857126bbbc64e590968a2acdf57..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -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 org.w3c.dom.Document; -import org.w3c.dom.Element; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; - -class FimDataMapperTest { - - @Spy - @InjectMocks - private FimDataMapper mapper; - - @DisplayName("Apply") - @Nested - class TestApply { - - @Mock - private Document document; - @Mock - private Element element; - @Mock - private FimScheme fimScheme; - @Mock - private Map<String, Object> extractedDocumentData; - - private final FormData formData = FormDataTestFactory.create(); - - @BeforeEach - void mock() { - when(document.getDocumentElement()).thenReturn(element); - - doReturn(extractedDocumentData).when(mapper).extractDocumentData(any(), any()); - } - - @Test - void shouldCallExtractDocumentData() { - apply(); - - verify(mapper).extractDocumentData(element, fimScheme); - } - - @Test - void shouldReturnFormDataMap() { - var appliedFormData = apply(); - - assertThat(appliedFormData).isEqualTo(extractedDocumentData); - } - - private Map<String, Object> apply() { - return mapper.apply(document, fimScheme); - } - } - - @DisplayName("Extract document data") - @Nested - class TestExtractDocumentData { - - @Mock - private Element root; - @Mock - private FimScheme fimScheme; - - @BeforeEach - void mock() { - doNothing().when(mapper).processNode(any(), any(), any(), anyInt()); - } - - @Test - void shouldCallProcessElement() { - mapper.extractDocumentData(root, fimScheme); - - verify(mapper).processNode(eq(root), eq(fimScheme), any(), eq(0)); - } - - @Test - void shouldReturnCreatedMap() { - var dataMap = mapper.extractDocumentData(root, fimScheme); - - assertThat(dataMap).isNotNull(); - } - } - - @DisplayName("Process element") - @Nested - class TestProcessElement { - - } -} \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java index 41b9adca742b71b37d57bd78a9feb9d3806379c5..610263cc895893fd2abe162e469b405df679b7da 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDocumentTestHelper.java @@ -1,24 +1,23 @@ package de.ozgcloud.eingang.fim; import java.io.File; -import java.io.IOException; import java.util.Map; import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; -import org.xml.sax.SAXException; + +import lombok.SneakyThrows; public class FimDocumentTestHelper { private static final String RESOURCE_PATH = "src/test/resources/"; - public static Document getTest1Document() throws ParserConfigurationException, IOException, SAXException { + public static Document getTest1Document() { return loadDocument("test1.xml"); } - public static Document getTest2Document() throws ParserConfigurationException, IOException, SAXException { + public static Document getTest2Document() { return loadDocument("test2.xml"); } @@ -28,7 +27,7 @@ public class FimDocumentTestHelper { "fim.S1236", Map.of("label", "fim.S1236", "value", "Testvalue 2")); } - public static Document getTest3Document() throws ParserConfigurationException, IOException, SAXException { + public static Document getTest3Document() { return loadDocument("test3.xml"); } @@ -38,7 +37,7 @@ public class FimDocumentTestHelper { "fim.S1236", Map.of("label", "fim.S1236", "value", "Testvalue 2")); } - public static Document getVersammlungsAnzeigeDocument() throws ParserConfigurationException, IOException, SAXException { + public static Document getVersammlungsAnzeigeDocument() { return loadDocument("S17000652V1.4_test01.xml"); } @@ -85,11 +84,12 @@ public class FimDocumentTestHelper { "F17003371", Map.of("label", "Anzeigenart", "value", "String")); } - public static Document getAntragDocument() throws ParserConfigurationException, IOException, SAXException { + public static Document getAntragDocument() { return loadDocument("antrag.xml"); } - private static Document loadDocument(String fileName) throws ParserConfigurationException, IOException, SAXException { + @SneakyThrows + private static Document loadDocument(String fileName) { return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(RESOURCE_PATH + fileName)); } } \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java deleted file mode 100644 index 1830c32f8e77c4c928b51c4aedcf899a72c815d1..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java +++ /dev/null @@ -1,85 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import static org.assertj.core.api.Assertions.*; - -import java.io.File; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import lombok.SneakyThrows; - -@ITCase -@ActiveProfiles({ "itcase", "test" }) -@ImportAutoConfiguration -@SpringBootTest(classes = FimTestConfig.class) -class FimServiceITCase { - - @Autowired // NOSONAR - private FimService service; - - @Nested - class TestGetSchemeForIdentifier { - - @Test - void shouldNoFindInvalidScheme() { - var scheme = service.getSchemeForIdentifier("test"); - - assertThat(scheme.getIdentifier()).isEqualTo(FimSchemeIdentifier.fromString("unknown")); - } - - @Test - void shouldFindVersammlungsScheme() { - var scheme = service.getSchemeForIdentifier("urn:xoev-de:xfall:standard:fim-s17000652_1.4"); - - assertThat(scheme).isNotNull(); - } - - @Test - void shouldFindTest2Scheme() { - var scheme = service.getSchemeForIdentifier("test2"); - - assertThat(scheme).isNotNull(); - } - } - - @Nested - class TestDoParse { - - @SneakyThrows - @Test - void shouldTransformSimpleDocument() { - var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test2.xml")).build(); - - var formData = service.doParse(file); - - assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest2AsMap()); - } - - @SneakyThrows - @Test - void shouldTransformSimpleDocumentWithoutNamespace() { - var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test3.xml")).build(); - - var formData = service.doParse(file); - - assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest3AsMap()); - } - - @SneakyThrows - @Test - void shouldTransformDocument() { - var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/S17000652V1.4_test01.xml")).build(); - - var formData = service.doParse(file); - - assertThat(formData).isNotEmpty().isEqualTo(FimDocumentTestHelper.getVersammlungsAnzeigeAsMap()); - } - } -} \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java index f94ad5635e9066f8b899aa622310fe651202415b..4d090842c766264a4886e3251acf72358d0d6152 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.List; import java.util.Optional; import org.apache.commons.lang3.StringUtils; @@ -13,31 +14,77 @@ 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 org.w3c.dom.Document; import com.thedeanda.lorem.LoremIpsum; +import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormData.Representations; import de.ozgcloud.eingang.common.formdata.FormDataControlTestFactory; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import de.ozgcloud.eingang.common.formdata.IncomingFile; +import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; import de.ozgcloud.eingang.fim.common.errorhandling.FimException; import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; class FimServiceTest { + @Spy @InjectMocks private FimService service; @Mock private FimSchemeHelper schemeHelper; - @Mock - private DocumentHelper documentHelper; - @DisplayName("Get entry point") + @DisplayName("Find primary representation") + @Nested + class TestFindPrimaryRepresentation { + + private final String representationName = LoremIpsum.getInstance().getName(); + private final IncomingFile representationFile = IncomingFileTestFactory.createBuilder() + .name(representationName) + .build(); + private final IncomingFile file = IncomingFileTestFactory.create(); + private final FormData formData = FormDataTestFactory.createBuilder() + .clearRepresentations().representations(List.of(representationFile, file)) + .build(); + + @BeforeEach + void initMocks() { + doReturn(representationName).when(service).getRepresentationName(any()); + } + + @Test + void shouldCallGetRepresentationName() { + service.findPrimaryRepresentation(formData); + + verify(service).getRepresentationName(FormDataTestFactory.FORM_DATA_CONTROL); + } + + @Test + void shouldReturnPrimaryRepresentationIfExists() { + var primaryRepresentation = service.findPrimaryRepresentation(formData); + + assertThat(primaryRepresentation).hasValue(representationFile); + } + + @Test + void shouldReturnEmptyIfMissing() { + var formDataWithoutMatchingRepresentation = FormDataTestFactory.createBuilder().clearRepresentations().representation(file).build(); + + var primaryRepresentation = service.findPrimaryRepresentation(formDataWithoutMatchingRepresentation); + + assertThat(primaryRepresentation).isEmpty(); + } + } + + @DisplayName("Get representation name") @Nested - class TestGetEntryPoint { + class TestGetRepresentationName { @Test void shouldReturnPrimaryRepresentationName() { - var result = service.getPrimaryRepresentationName(FormDataControlTestFactory.create()); + var result = service.getRepresentationName(FormDataControlTestFactory.create()); assertThat(result).isEqualTo(FormDataControlTestFactory.PRIMARY_FORM_DATA_REPRESENTATION); } @@ -46,7 +93,7 @@ class FimServiceTest { void shouldReturnDefaultNameOnMissingRepresentations() { var formDataControl = FormDataControlTestFactory.createBuilder().representations(Optional.empty()).build(); - var result = service.getPrimaryRepresentationName(formDataControl); + var result = service.getRepresentationName(formDataControl); assertThat(result).isEqualTo(FimService.DEFAULT_FORMDATA_REPRESENTATION_NAME); } @@ -57,55 +104,34 @@ class FimServiceTest { .representations(Optional.of(Representations.builder().build())) .build(); - var result = service.getPrimaryRepresentationName(formDataControl); + var result = service.getRepresentationName(formDataControl); assertThat(result).isEqualTo(FimService.DEFAULT_FORMDATA_REPRESENTATION_NAME); } } - @DisplayName("Get scheme name") + @DisplayName("Get scheme") @Nested - class TestGetSchemeName { + class TestGetScheme { @Mock private Document doc; + @Mock + private FimScheme fimScheme; private final String schemeName = LoremIpsum.getInstance().getName(); - @Test - void shouldCallExtractSchemeName() { - doReturn(schemeName).when(documentHelper).extractSchemeName(any()); - - service.getSchemeName(doc); - - verify(documentHelper).extractSchemeName(doc); - } - - @Test - void shouldThrowExceptionOnEmptyName() { - doReturn(StringUtils.EMPTY).when(documentHelper).extractSchemeName(any()); - - assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class); + @BeforeEach + void initMocks() { + doReturn(schemeName).when(service).getSchemeName(any()); } @Test - void shouldReturnValue() { - doReturn(schemeName).when(documentHelper).extractSchemeName(any()); + void shouldCallGetSchemeName() { + service.getScheme(doc); - var schemeName = service.getSchemeName(doc); - - assertThat(schemeName).isEqualTo(schemeName); + verify(service).getScheme(doc); } - } - - @DisplayName("Get scheme for identifier") - @Nested - class TestGetSchemeForIdentifier { - - @Mock - private FimScheme fimScheme; - - private final String schemeName = LoremIpsum.getInstance().getName(); @DisplayName("on existing scheme") @Nested @@ -118,14 +144,14 @@ class FimServiceTest { @Test void shouldCallSchemeHelper() { - service.getSchemeForIdentifier(schemeName); + service.getScheme(doc); verify(schemeHelper).getScheme(schemeName); } @Test void shouldReturnScheme() { - var scheme = service.getSchemeForIdentifier(schemeName); + var scheme = service.getScheme(doc); assertThat(scheme).isEqualTo(fimScheme); } @@ -143,17 +169,58 @@ class FimServiceTest { @Test void shouldCallSchemeHelperToGetDefaultScheme() { - service.getSchemeForIdentifier(schemeName); + service.getScheme(doc); verify(schemeHelper).getDefaultScheme(); } @Test void shouldReturnDefaultScheme() { - var scheme = service.getSchemeForIdentifier(schemeName); + var scheme = service.getScheme(doc); assertThat(scheme).isEqualTo(fimScheme); } } } + + @DisplayName("Get scheme name") + @Nested + class TestGetSchemeName { + + @Mock + private Document doc; + + private final String schemeName = LoremIpsum.getInstance().getName(); + + @Test + void shouldCallExtractSchemeName() { + try (var helper = mockStatic(DocumentHelper.class)) { + helper.when(() -> DocumentHelper.extractSchemeName(doc)).thenReturn(schemeName); + + service.getSchemeName(doc); + + helper.verify(() -> DocumentHelper.extractSchemeName(doc)); + } + } + + @Test + void shouldThrowExceptionOnEmptyName() { + try (var helper = mockStatic(DocumentHelper.class)) { + helper.when(() -> DocumentHelper.extractSchemeName(doc)).thenReturn(StringUtils.EMPTY); + + assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class); + } + } + + @Test + void shouldReturnValue() { + try (var helper = mockStatic(DocumentHelper.class)) { + helper.when(() -> DocumentHelper.extractSchemeName(doc)).thenReturn(schemeName); + + var name = service.getSchemeName(doc); + + assertThat(name).isEqualTo(schemeName); + } + } + } } \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/HeaderMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/HeaderMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f44c281882ae7a26d33fa4690e42c22fe801950b --- /dev/null +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/HeaderMapperTest.java @@ -0,0 +1,100 @@ +package de.ozgcloud.eingang.fim; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; + +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; + +class HeaderMapperTest { + + @Spy + @InjectMocks + private HeaderMapper mapper; + + @DisplayName("Parse formData") + @Nested + class TestParseFormData { + + private final FormData formData = FormDataTestFactory.createBuilder().header(FormHeader.builder().build()).build(); + + @DisplayName("on existing formName") + @Nested + class TestOnExistingFormName { + + @BeforeEach + void initMocks() { + doReturn(Optional.of(FormHeaderTestFactory.FORM_NAME)).when(mapper).getFormName(any()); + } + + @Test + void shouldCallBuildHeader() { + mapper.parseFormData(formData); + + verify(mapper).getFormName(FormDataTestFactory.FORM_DATA); + } + + @Test + void shouldReturnFormDataWithHeader() { + var mappedFormData = mapper.parseFormData(formData); + + assertThat(mappedFormData.getHeader().getFormName()).isEqualTo(FormHeaderTestFactory.FORM_NAME); + } + } + + @DisplayName("on missing formName") + @Nested + class TestOnMissingFormName { + + @BeforeEach + void initMocks() { + doReturn(Optional.empty()).when(mapper).getFormName(any()); + } + + @Test + void shouldReturnOriginFormData() { + var mappedFormData = mapper.parseFormData(formData); + + assertThat(mappedFormData).isEqualTo(formData); + } + } + } + + @DisplayName("Get formName") + @Nested + class TestGetFormName { + + @Test + void shouldCallFimDataUtilToGetValue() { + try (var helper = mockStatic(FimDataUtil.class)) { + mapper.getFormName(FormDataTestFactory.FORM_DATA); + + helper.verify( + () -> FimDataUtil.getValue(FormDataTestFactory.FORM_DATA, HeaderMapper.FORM_NAME_KEY, "G17003529", "G05001479", "G05001480")); + } + } + + @Test + void shouldReturnValue() { + try (var helper = mockStatic(FimDataUtil.class)) { + helper.when(() -> FimDataUtil.getValue(any(), any(), any(), any(), any())).thenReturn(Optional.of(FormHeaderTestFactory.FORM_NAME)); + + var formNameOpt = mapper.getFormName(FormDataTestFactory.FORM_DATA); + + assertThat(formNameOpt).hasValue(FormHeaderTestFactory.FORM_NAME); + } + } + } +} \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java index 1821e0bf46530736df3fec0d9df5a0558b6f01e6..16ef2e4f9e4ef0b794c8a3e85dda9ded0130ca4c 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java @@ -1,23 +1,22 @@ package de.ozgcloud.eingang.fim; -import org.springframework.stereotype.Service; +import java.util.Optional; + +import org.springframework.stereotype.Component; import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import java.util.Optional; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; -@Service +@Component public class TestNonStandardAdapter extends FimSchemeAdapter { - public FimSchemeIdentifier getIdentifier() { - return FimSchemeIdentifier.fromString("test2"); - } + @Override + public FimSchemeIdentifier getIdentifier() { + return FimSchemeIdentifier.fromString("test2"); + } - public Optional<String> getNameForElement(final Element element) { - final NodeList nameTags = element.getElementsByTagName("non-standard-name"); - if (nameTags.getLength() != 1) { - return Optional.empty(); - } - return Optional.ofNullable(nameTags.item(0).getTextContent()); - } + @Override + public Optional<String> getNameForElement(Element element) { + return DocumentHelper.getChildElement(element, "non-standard-name"); + } } diff --git a/fim-adapter/src/test/resources/antrag.xml b/fim-adapter/src/test/resources/antrag.xml index 530dc7313da0eada0f7e819023f95913d1f73d30..7b77f0d570d7aa4f484a6a0ec70532f5f627f35b 100644 --- a/fim-adapter/src/test/resources/antrag.xml +++ b/fim-adapter/src/test/resources/antrag.xml @@ -27,14 +27,14 @@ <F17009191>false</F17009191> <G17002112> <F60000228>Jörg</F60000228> - <F60000227>Bolay</F60000227> + <F60000227>Smith</F60000227> <G60000086> <F60000243>Muster</F60000243> <F60000244>1</F60000244> <F60000246>12345</F60000246> <F60000247>Muster</F60000247> </G60000086> - <F60000242>joerg.bolay@dataport.de</F60000242> + <F60000242>example@email.de</F60000242> <F17009011>false</F17009011> </G17002112> <F17003371>Anzeigen einer ortsfesten Versammlung (Kundgebung / Demonstration)</F17003371>