diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java index e95c1e0fccf66519d23c26008a3a145bf562a2ff..17b840b213a6124b4a8ed4247b777f8facc8f529 100644 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java +++ b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java @@ -7,7 +7,7 @@ import de.ozgcloud.eingang.common.formdata.FormData.Representations; public class FormDataControlTestFactory { - public static String PRIMARY_FORM_DATA_REPRESENTATION = "Antrag.xml"; + public static final String PRIMARY_FORM_DATA_REPRESENTATION = "Antrag.xml"; public static FormDataControl create() { return createBuilder().build(); 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 100eefcfe1c6629650fcaaca896ccdabc973a84c..0ad23b9e4e08d54aa7e356c3ea2cde213d0fc7f4 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,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class FormDataTestFactory { public static final String SIMPLE_VALUE_KEY = "kontaktsystemtypid"; @@ -57,6 +61,12 @@ public class FormDataTestFactory { IncomingFileGroupTestFactory.createBuilder().name(ATTACHMENT_GROUP_2).build()); public static final List<IncomingFile> REPRESENTATIONS = List.of(IncomingFileTestFactory.create()); + public static final Map<String, Object> FORM_DATA = Map.of( + SIMPLE_VALUE_KEY, SIMPLE_VALUE, + SUBFORM_KEY, SUBFORM_VALUE, + NESTED_LIST_WITH_STRINGS_KEY, NESTED_LIST_WITH_STRINGS, + NESTED_LIST_WITH_OBJECTS_KEY, NESTED_LIST_WITH_OBJECTS); + public static FormData create() { return createBuilder().build(); } @@ -67,11 +77,7 @@ public class FormDataTestFactory { .antragsteller(AntragstellerTestFactory.create()) .zustaendigeStelle(ZustaendigeStelleTestFactory.create()) .control(FormDataControlTestFactory.create()) - .formData(Map.of( - SIMPLE_VALUE_KEY, SIMPLE_VALUE, - SUBFORM_KEY, SUBFORM_VALUE, - NESTED_LIST_WITH_STRINGS_KEY, NESTED_LIST_WITH_STRINGS, - NESTED_LIST_WITH_OBJECTS_KEY, NESTED_LIST_WITH_OBJECTS)) + .formData(FORM_DATA) // TODO nach entfernen des zweiten Attachments den Wert auf 1 setzen .numberOfAttachments(2) // TODO zweites Attachment aus der TestFactory entfernen und die entsprechenden 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 17653d91cb1dbdb75c8dc4533e8075ce005faef0..f64fee934e5fd263903ce5a0143a05b80f4b051b 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 @@ -5,9 +5,10 @@ import java.util.Map; import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.Antragsteller; +import de.ozgcloud.eingang.common.formdata.FormData; @Component -class AntragstellerMapper { +class AntragstellerMapper implements FimEngineBasedMapper { static final String ANTRAGSTELLER_KEY = "G17002112"; @@ -21,7 +22,14 @@ class AntragstellerMapper { static final String PLZ_KEY = "F60000246"; static final String ORT_KEY = "F60000247"; - public Antragsteller map(Map<String, Object> formData) { + @Override + public FormData parseFormData(FormData formData) { + return formData.toBuilder() + .antragsteller(mapAntragsteller(formData.getFormData())) + .build(); + } + + Antragsteller mapAntragsteller(Map<String, Object> formData) { var antragsteller = getAntragsteller(formData); var anschrift = getAnschrift(antragsteller); 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 6af43c73ff3f545deb00f7624d90d7a49a113d17..75487f4b3eba8ddd41ae2856bc557be292ac67ae 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,62 +1,32 @@ package de.ozgcloud.eingang.fim; -import java.io.IOException; -import java.util.Collections; import java.util.List; -import java.util.Optional; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.fim.common.errorhandling.FimException; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import lombok.NonNull; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Log4j2 +@RequiredArgsConstructor @Component public class FimBasedAdapter implements EngineBasedSemantikAdapter { static final String FIM_FORM_ENGINE_NAME = "FIM"; - static final String DEFAULT_FORMDATA_REPRESENTATION_NAME = "Antrag.xml"; - - @Autowired - private FimService fimService; - - @Autowired(required = false) - private List<FimEngineBasedMapper> mappers = Collections.emptyList(); + private final List<FimEngineBasedMapper> mappers; + private final FimService service; @Override - public boolean isResponsible(final FormData formData) { - final String formEngineName = formData.getHeader().getFormEngineName(); - return FIM_FORM_ENGINE_NAME.equals(formEngineName); + public boolean isResponsible(FormData formData) { + return FIM_FORM_ENGINE_NAME.equals(formData.getHeader().getFormEngineName()); } @Override - public FormData parseFormData(final FormData initialFormData) { - var mapped = useMappers(initialFormData); - LOG.info("FIM Mapper running to map formData"); - - return findFile(initialFormData, getEntryPoint(initialFormData.getControl())) - .map(primaryRepresentation -> doParsing(mapped, primaryRepresentation)) - .orElseGet(() -> { - LOG.error("Entry point file not found for fim data mapping"); - return mapped; - }); - } - - private FormData useMappers(FormData inFormData) { - var processedFormData = inFormData; + public FormData parseFormData(FormData formData) { + var processedFormData = addFormDataDataMap(formData); for (var mapper : mappers) { processedFormData = mapper.parseFormData(processedFormData); @@ -65,30 +35,7 @@ public class FimBasedAdapter implements EngineBasedSemantikAdapter { return processedFormData; } - private Optional<IncomingFile> findFile(final FormData formData, final String name) { - return formData.getRepresentations().stream() - .filter(file -> file.getName().endsWith(name)) - .findFirst(); - } - - private FormData doParsing(@NonNull FormData formData, @NonNull IncomingFile formDataPrimaryRepresentation) { - try { - return fimService.transformDocument(loadDocument(formDataPrimaryRepresentation), formData); - } catch (ParserConfigurationException | SAXException | IOException | FimException e) { - LOG.error("Can't transform document into fim formdata.", e); - return formData; - } - } - - String getEntryPoint(FormDataControl formDataControl) { - return formDataControl.getRepresentations().map(Representations::getPrimaryFormDataRepresentation) - .orElseGet(() -> { - LOG.error("No entry point found in metadata file for fim data mapping. Trying default."); - return DEFAULT_FORMDATA_REPRESENTATION_NAME; - }); - } - - private Document loadDocument(IncomingFile incomingFile) throws ParserConfigurationException, IOException, SAXException { - return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(incomingFile.getContentStream()); + FormData addFormDataDataMap(FormData formData) { + return formData.toBuilder().formData(service.parseRequestData(formData)).build(); } -} +} \ 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 index 8b91a29fa41c3489fa8a304423a36d10e1c6194d..b027412baa094ca2e8074eb58b45225cbd772d85 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java @@ -2,26 +2,25 @@ package de.ozgcloud.eingang.fim; import java.util.LinkedHashMap; import java.util.Map; +import java.util.function.BiFunction; -import org.apache.commons.lang3.function.TriFunction; 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 de.ozgcloud.eingang.common.formdata.FormData; import lombok.extern.log4j.Log4j2; @Log4j2 @Service -class FimDataMapper implements TriFunction<Document, FimScheme, FormData, Map<String, Object>> { +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, FormData initialFormData) { + public Map<String, Object> apply(Document document, FimScheme fimScheme) { return extractDocumentData(document.getDocumentElement(), fimScheme); } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java index df67ec1a3468ca2e96a0a63e8edaa27d1f7ba24c..08014480a4c855b4345d1ef338438e39b08b3a88 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java @@ -1,25 +1,26 @@ package de.ozgcloud.eingang.fim; +import java.util.ArrayList; +import java.util.List; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import lombok.Getter; -import org.springframework.validation.annotation.Validated; -import java.util.ArrayList; -import java.util.List; +import lombok.Getter; -@Validated +@Getter @Configuration @ConfigurationProperties(prefix = FimProperties.PROPERTIES_PREFIX) -@Getter public class FimProperties { - static final String PROPERTIES_PREFIX = "fim"; + static final String PROPERTIES_PREFIX = "ozgcloud.eingang.fim"; - /** - * List of paths to fim scheme files which should be processed by the fim-adapter. - * - * Only fim data that is in the namespace and versions of these files will be mapped by the fim-adapter. - * All other fim data will be left untouched by the mapper. - */ - private final List<String> schemeLocations = new ArrayList<>(); + /** + * List of paths to fim scheme files which should be processed by the + * fim-adapter. + * + * Only fim data that is in the namespace and versions of these files will be + * mapped by the fim-adapter. All other fim data will be left untouched by the + * mapper. + */ + private final List<String> schemeLocations = new ArrayList<>(); } 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 e38bd99ba4f4d4ab5586b1d4ae436f533017ecc0..5e7e6ca6e1ceb4ad714be35a289c11fe02333419 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 @@ -1,42 +1,42 @@ package de.ozgcloud.eingang.fim; -import lombok.Getter; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import org.w3c.dom.NodeList; - import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import lombok.Getter; + class FimScheme { - private final Document doc; - @Getter - private final FimSchemeIdentifier identifier; - - @Getter - private final FimSchemeAdapter schemeAdapter; - private final Map<String, Element> fieldIndex = new LinkedHashMap<>(); - - FimScheme(final Document doc, final FimSchemeIdentifier identifier, final FimSchemeAdapter schemeAdapter) { - this.doc = doc; - this.identifier = identifier; - this.schemeAdapter = schemeAdapter; - - buildFieldIndex(); - } - private void buildFieldIndex() { - final NodeList groupList = doc.getElementsByTagName("xs:element"); - for (int i = 0; i < groupList.getLength();i++) { - final Element group = (Element) groupList.item(i); - final String groupName = group.getAttribute("name"); - fieldIndex.put(groupName, group); - } - } - - Optional<String> getFieldName(final String fieldName) { - return schemeAdapter.getFieldName(fieldIndex, fieldName); - } + private final Document doc; + @Getter + private final FimSchemeIdentifier identifier; + + @Getter + private final FimSchemeAdapter schemeAdapter; + private final Map<String, Element> fieldIndex = new LinkedHashMap<>(); + + public FimScheme(Document doc, FimSchemeIdentifier identifier, FimSchemeAdapter schemeAdapter) { + this.doc = doc; + this.identifier = identifier; + this.schemeAdapter = schemeAdapter; + + buildFieldIndex(); + } + + 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); + } + } + + Optional<String> getFieldName(final String fieldName) { + return schemeAdapter.getFieldName(fieldIndex, fieldName); + } } 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 bdf965588c5e53b1da6ce0c81ca10852482d7828..580a3d9a4c70950c200e9f6cccfd40d789221ae2 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 @@ -45,7 +45,7 @@ class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> { initUnknownScheme(); } catch (ParserConfigurationException | IOException | SAXException e) { - throw new TechnicalException("Error on initalising FimSchemes.", e); + throw new TechnicalException("Error on initialising FimSchemes.", e); } } @@ -60,7 +60,7 @@ class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> { } private FimScheme loadFimScheme(String path) throws ParserConfigurationException, IOException, SAXException { - LOG.debug("Load FIM schema: " + path); + LOG.debug(() -> "Load FIM schema: " + path); var doc = createDocumentBuilder().parse(getFile(path)); return createScheme(doc, getTargetNamespace(doc)); } diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeHelper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeHelper.java index 116f35040eec4edf768399357e93314f0fc736df..054589340915925e6aa49ca9da20c88858eb377b 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeHelper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeHelper.java @@ -1,7 +1,6 @@ package de.ozgcloud.eingang.fim; import java.util.List; -import java.util.Objects; import jakarta.annotation.PostConstruct; @@ -29,9 +28,8 @@ class FimSchemeHelper { private void initSchemeAdapterCatalogue() { schemeAdapterCatalogue = new FimSchemeAdapterCatalogue(); - if (Objects.nonNull(fimSchemeAdapters)) { - fimSchemeAdapters.forEach(adapter -> schemeAdapterCatalogue.put(adapter.getIdentifier(), adapter)); - } + + fimSchemeAdapters.forEach(adapter -> schemeAdapterCatalogue.put(adapter.getIdentifier(), adapter)); } private void initSchemeCatalogue() { 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 f6b4bbb019ecd8807209cca4952cb63082f0e2da..689bfae8147f7b103c53fca26eb5d1bfa271d404 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,5 +1,6 @@ package de.ozgcloud.eingang.fim; +import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -9,8 +10,11 @@ import org.springframework.stereotype.Service; import org.w3c.dom.Document; import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; +import de.ozgcloud.eingang.common.formdata.FormData.Representations; +import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.fim.common.errorhandling.FimException; +import de.ozgcloud.eingang.fim.common.xml.DocumentHelper; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -19,35 +23,45 @@ import lombok.extern.log4j.Log4j2; @Service public class FimService { + static final String DEFAULT_FORMDATA_REPRESENTATION_NAME = "Antrag.xml"; + private final FimDataMapper fimDataMapper; - private final AntragstellerMapper antragstellerMapper; private final FimSchemeHelper schemeHelper; + private final DocumentHelper documentHelper; - public FormData transformDocument(Document document, FormData formData) { - var formDataMap = getFormDataMap(document, formData); - return formData.toBuilder() - .formData(formDataMap) - .antragsteller(antragstellerMapper.map(formDataMap)) - .header(buildFormHeader(formData, formDataMap)) - .build(); + public Map<String, Object> parseRequestData(FormData formData) { + return findRequestFile(formData).map(this::doParse).orElseGet(Collections::emptyMap); } - private Map<String, Object> getFormDataMap(Document document, FormData formData) { - return fimDataMapper.apply(document, getSchemeForIdentifier(getSchemeName(document)), formData); + 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(); + } } - String getSchemeName(Document doc) { - var schemeName = extractSchemeName(doc); - if (StringUtils.isEmpty(schemeName)) { - throw new FimException("XML Document does not provide a scheme."); - } - return schemeName; + Optional<IncomingFile> findRequestFile(FormData formData) { + var primaryFormDataRepresentationName = getPrimaryRepresentationName(formData.getControl()); + return formData.getRepresentations().stream() + .filter(file -> file.getName().endsWith(primaryFormDataRepresentationName)) + .findFirst(); } - String extractSchemeName(Document doc) { - var tagParts = doc.getDocumentElement().getTagName().split(":"); - var namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]); - return doc.getDocumentElement().getAttribute("xmlns" + namespacePrefix); + String getPrimaryRepresentationName(FormDataControl formDataControl) { + return formDataControl.getRepresentations().map(Representations::getPrimaryFormDataRepresentation) + .orElseGet(() -> { + LOG.warn("No entry point found in metadata file for fim data mapping. Trying default."); + return DEFAULT_FORMDATA_REPRESENTATION_NAME; + }); + } + + 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) { @@ -59,14 +73,4 @@ public class FimService { } return fimScheme; } - - FormHeader buildFormHeader(FormData formData, Map<String, Object> formDataMap) { - return formData.getHeader().toBuilder() - .formName(getVorgangsName(formDataMap).orElse(null)) - .build(); - } - - Optional<String> getVorgangsName(Map<String, Object> formData) { - return FimDataUtil.getValue(formData, "G17003529", "G05001479", "G05001480", "F05002753"); - } } \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..31e45366490cf6bcd1c54fcba2e81b45ccd8355e --- /dev/null +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/HeaderMapper.java @@ -0,0 +1,34 @@ +package de.ozgcloud.eingang.fim; + +import java.util.Map; +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; + +@Log4j2 +@RequiredArgsConstructor +@Component +class HeaderMapper implements FimEngineBasedMapper { + + @Override + public FormData parseFormData(FormData formData) { + return formData.toBuilder() + .header(buildHeader(formData)) + .build(); + } + + 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, "G17003529", "G05001479", "G05001480", "F05002753"); + } +} \ No newline at end of file diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java index 72146cb778999343ef393a5d78365c1801893a0d..14804c92f35056b153c42e5a72202eafb3f4dac3 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java @@ -22,19 +22,19 @@ class ZustaendigeStelleMapper implements FimEngineBasedMapper { return formData.getControl().getMetaData() .map(metaData -> metaData.getEntry(XTA_IDENTIFIER_ENTRY_NAME)) .filter(Objects::nonNull) - .map(oeId -> setOrganisationsEinheitId(formData.getZustaendigeStelles(), oeId)) + .map(id -> setOrganisationEinheitId(formData.getZustaendigeStelles(), id)) .map(zustStelle -> formData.toBuilder().zustaendigeStelle(zustStelle).build()) .orElse(formData); } - private ZustaendigeStelle setOrganisationsEinheitId(List<ZustaendigeStelle> stelles, @NonNull String oeid) { - var builder = stelles.isEmpty() ? ZustaendigeStelle.builder() : stelles.getFirst().toBuilder(); + private ZustaendigeStelle setOrganisationEinheitId(List<ZustaendigeStelle> stellen, @NonNull String organisationEinheitId) { + var builder = stellen.isEmpty() ? ZustaendigeStelle.builder() : stellen.getFirst().toBuilder(); - extractOrganisationsEinheitId(oeid).ifPresent(builder::organisationseinheitenId); + extractOrganisationEinheitId(organisationEinheitId).ifPresent(builder::organisationseinheitenId); return builder.build(); } - Optional<String> extractOrganisationsEinheitId(@NonNull String xtaIdentifier) { + Optional<String> extractOrganisationEinheitId(@NonNull String xtaIdentifier) { var idx = xtaIdentifier.indexOf(":"); if (idx < 0) { return Optional.empty(); diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/errorhandling/FimException.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/errorhandling/FimException.java index 56b6c09343ebdd2783ab7854745a77a87746e1ba..68be9eb443298ed45cafcbe646f73b85de9c6519 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/errorhandling/FimException.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/errorhandling/FimException.java @@ -6,7 +6,7 @@ public class FimException extends TechnicalException { private static final long serialVersionUID = 1L; - public FimException(final String ex) { - super(ex); + public FimException(String message) { + super(message); } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..6b31ebfc85afe8082d52a47b433235410adfa50e --- /dev/null +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/common/xml/DocumentHelper.java @@ -0,0 +1,26 @@ +package de.ozgcloud.eingang.fim.common.xml; + +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import de.ozgcloud.eingang.common.formdata.IncomingFile; + +@Component +public class DocumentHelper { + + public Document parse(IncomingFile incomingFile) throws ParserConfigurationException, IOException, SAXException { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(incomingFile.getContentStream()); + } + + public String extractSchemeName(Document doc) { + var tagParts = doc.getDocumentElement().getTagName().split(":"); + var namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]); + return doc.getDocumentElement().getAttribute("xmlns" + namespacePrefix); + } +} 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 142f8c2a5f701c9196b42fd1e90728d0f8877847..fe829d0ef1416d982a3644476b46cd3965a1bca2 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 @@ -1,32 +1,65 @@ 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.Collections; 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.Spy; import de.ozgcloud.eingang.common.formdata.Antragsteller; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; class AntragstellerMapperTest { + @Spy @InjectMocks private AntragstellerMapper mapper; - @DisplayName("Map") + @DisplayName("Parse formData") @Nested - class TestMap { + class TestParseFormData { + + private final FormData formData = FormDataTestFactory.createBuilder().antragsteller(null).build(); + + @BeforeEach + void mock() { + doReturn(AntragstellerTestFactory.create()).when(mapper).mapAntragsteller(any()); + } + + @Test + void shouldCallMapAntragsteller() { + mapper.parseFormData(formData); + + verify(mapper).mapAntragsteller(FormDataTestFactory.FORM_DATA); + } + + @Test + void shouldReturnFormDataWithAntragsteller() { + var mappedFormData = mapper.parseFormData(formData); + + assertThat(mappedFormData.getAntragsteller()).isNotNull(); + } + } + + @DisplayName("Map antragsteller") + @Nested + class TestMapAntragsteller { @Test void shouldMap() { var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap(); var formData = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap); - var antragsteller = mapper.map(formData); + var antragsteller = mapper.mapAntragsteller(formData); assertThat(antragsteller).usingRecursiveComparison().isEqualTo(AntragstellerTestFactory.create()); } @@ -35,7 +68,7 @@ class AntragstellerMapperTest { void shouldMapEmpty() { var formData = Collections.<String, Object>emptyMap(); - var antragsteller = mapper.map(formData); + var antragsteller = mapper.mapAntragsteller(formData); assertThat(antragsteller).usingRecursiveComparison().isEqualTo(Antragsteller.builder().build()); } 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 e3e3e8cd45a3eb196ca21e80a4189c8e0ba025dc..2dc6ad5a0c7493e50cb4a5e2e02a363b94adfbbc 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 @@ -6,7 +6,10 @@ import java.util.Map; import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.eingang.common.formdata.Antragsteller; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class AntragstellerTestFactory { public static final String VORNAME = LoremIpsum.getInstance().getWords(1); 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 new file mode 100644 index 0000000000000000000000000000000000000000..4d228a09a8129974a542414e66b7158c231ae9a0 --- /dev/null +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBaseAdapterTest.java @@ -0,0 +1,113 @@ +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 348acd4003c8f0cfd9cd6d2b5c766451df4e7cf1..683abc75602b2c494f016ad5508eab40cfcdc9de 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 @@ -5,7 +5,10 @@ import static org.assertj.core.api.Assertions.*; import java.io.File; import java.util.List; import java.util.Map; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +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; @@ -13,7 +16,10 @@ 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.Antragsteller; import de.ozgcloud.eingang.common.formdata.FormData; +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; @@ -23,59 +29,111 @@ import de.ozgcloud.eingang.common.formdata.IncomingFile; @SpringBootTest(classes = FimTestConfig.class) class FimBasedAdapterITCase { - @Autowired + @Autowired // NOSONAR private FimBasedAdapter fimBasedAdapter; - @Test - void shouldFallbackUnknownScheme() { - var incomingFile = IncomingFile.builder().name("src/test/resources/test3/Antrag.xml").file(new File("src/test/resources/test3/Antrag.xml")) - .build(); - var incomingFile2 = IncomingFile.builder().name("src/test/resources/test3/fim_xtaMetadata.xml").build(); - var initialFormData = FormData.builder() - .header(FormHeader.builder().channel("XTA").formEngineName("FIM").build()) - .representations(List.of(incomingFile, incomingFile2)).build(); + @Nested + class TestFallback { + + @Test + void shouldWithFallbackUnknownScheme() { + var incomingFile = IncomingFile.builder().name("src/test/resources/test3/Antrag.xml") + .file(new File("src/test/resources/test3/Antrag.xml")) + .build(); + var incomingFile2 = IncomingFile.builder().name("src/test/resources/test3/fim_xtaMetadata.xml").build(); + var initialFormData = FormData.builder() + .header(FormHeader.builder().channel("XTA").formEngineName("FIM").build()) + .representations(List.of(incomingFile, incomingFile2)).build(); + + var formData = fimBasedAdapter.parseFormData(initialFormData); - var formData = fimBasedAdapter.parseFormData(initialFormData); + assertThat(formData).isNotNull(); + assertThat(formData.getFormData()).isEqualTo(getParsedDocumentMap()); + } - assertThat(formData).isNotNull(); - assertThat(formData.getFormData()).isEqualTo(getParsedDocumentMap()); + private Map<String, Object> getParsedDocumentMap() { + return Map.of( + "G17003529", Map.of( + "label", "G17003529", + "value", Map.of( + "G05001479", Map.of( + "label", "G05001479", + "value", Map.of( + "G05001480", Map.of( + "label", "G05001480", + "value", Map.of( + "F05002750", + Map.of("label", "F05002750", "value", "d447e43a-5723-4821-a170-cb44d2dbf143"), + "F05002751", Map.of("label", "F05002751", "value", "2022-08-15T09:30:47"), + "F05002752", + Map.of("label", "F05002752", "value", "fim.S17000652.17000652001004"), + "F05002753", + Map.of("label", "F05002753", "value", "urn:fim:Versammlungsanzeige:1.4"))), + "G05001481", Map.of( + "label", "G05001481", + "value", Map.of( + "F05002754", Map.of("label", "F05002754", "value", "Celle"), + "F05002755", Map.of("label", "F05002755", "value", "vbe:010550120100"), + "F05002756", Map.of("label", "F05002756", "value", "Versammlungsbehörde"))), + "G05001482", Map.of( + "label", "G05001482", + "value", Map.of( + "F05002754", + Map.of("label", "F05002754", "value", + "OSI-Onlinedienst Niedersachsen Versammlungsanzeige"), + "F05002755", Map.of("label", "F05002755", "value", "vbe:010550120100"), + "F05002756", + Map.of("label", "F05002756", "value", "Engagement- und Hobbyportal"))))), + "F17005454", Map.of("label", "F17005454", "value", "true"), + "F17005455", Map.of("label", "F17005455", "value", "true"), + "F17005533", Map.of("label", "F17005533", "value", "String"))), + "F17009191", Map.of("label", "F17009191", "value", "true"), + "F17003371", Map.of("label", "F17003371", "value", "String")); + } } - private Map<String, Object> getParsedDocumentMap() { - return Map.of( - "G17003529", Map.of( - "label", "G17003529", - "value", Map.of( - "G05001479", Map.of( - "label", "G05001479", - "value", Map.of( - "G05001480", Map.of( - "label", "G05001480", - "value", Map.of( - "F05002750", - Map.of("label", "F05002750", "value", "d447e43a-5723-4821-a170-cb44d2dbf143"), - "F05002751", Map.of("label", "F05002751", "value", "2022-08-15T09:30:47"), - "F05002752", Map.of("label", "F05002752", "value", "fim.S17000652.17000652001004"), - "F05002753", - Map.of("label", "F05002753", "value", "urn:fim:Versammlungsanzeige:1.4"))), - "G05001481", Map.of( - "label", "G05001481", - "value", Map.of( - "F05002754", Map.of("label", "F05002754", "value", "Celle"), - "F05002755", Map.of("label", "F05002755", "value", "vbe:010550120100"), - "F05002756", Map.of("label", "F05002756", "value", "Versammlungsbehörde"))), - "G05001482", Map.of( - "label", "G05001482", - "value", Map.of( - "F05002754", - Map.of("label", "F05002754", "value", - "OSI-Onlinedienst Niedersachsen Versammlungsanzeige"), - "F05002755", Map.of("label", "F05002755", "value", "vbe:010550120100"), - "F05002756", Map.of("label", "F05002756", "value", "Engagement- und Hobbyportal"))))), - "F17005454", Map.of("label", "F17005454", "value", "true"), - "F17005455", Map.of("label", "F17005455", "value", "true"), - "F17005533", Map.of("label", "F17005533", "value", "String"))), - "F17009191", Map.of("label", "F17009191", "value", "true"), - "F17003371", Map.of("label", "F17003371", "value", "String")); + @DisplayName("Parse formData") + @Nested + class TestParseFormData { + + private final String fileName = "antrag.xml"; + private final FormData emptyFormData = FormData.builder() + .control(FormDataControl.builder() + .representations(Optional.of(Representations.builder() + .primaryFormDataRepresentation(fileName) + .build())) + .build()) + .representation(IncomingFile.builder() + .name(fileName) + .file(new File("src/test/resources/" + fileName)) + .build()) + .build(); + + @Test + void shouldHaveHeaderFormName() { + var formData = fimBasedAdapter.parseFormData(emptyFormData); + + assertThat(formData).isNotNull(); + assertThat(formData.getHeader().getFormName()).isEqualTo("urn:fim:Versammlungsanzeige:1.4"); + } + + @Test + void shouldHaveAntragsteller() { + var formData = fimBasedAdapter.parseFormData(emptyFormData); + + assertThat(formData).isNotNull(); + assertThat(formData.getAntragsteller()).usingRecursiveComparison().isEqualTo(createExpectedAntragsteller()); + } + + private Antragsteller createExpectedAntragsteller() { + return Antragsteller.builder() + .vorname("Jörg").nachname("Bolay") + .email("joerg.bolay@dataport.de") + .strasse("Muster") + .hausnummer("1") + .plz("12345") + .ort("Muster") + .build(); + } } } \ 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 1a09b6a2ef3428543a3981d71f8aa8d38aaf5235..07b9477b9d469b8392cc5b7eceac6bde9e98cb5c 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 @@ -2,45 +2,36 @@ package de.ozgcloud.eingang.fim; import static org.assertj.core.api.Assertions.*; -import java.util.Optional; - +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 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.FormHeaderTestFactory; class FimBasedAdapterTest { @InjectMocks private FimBasedAdapter adapter; + @Mock + private FimService service; + @Mock + private FimEngineBasedMapper mapper; + @DisplayName("Is responsible") @Nested - class TestGetEntryPoint { - - @Test - void shouldReturnPrimaryRepresentation() { - var result = adapter.getEntryPoint(FormDataControlTestFactory.create()); - - assertThat(result).isEqualTo(FormDataControlTestFactory.PRIMARY_FORM_DATA_REPRESENTATION); - } + class TestIsResponsible { @Test - void shouldReturnDefaultOnMissingRepresentations() { - var result = adapter.getEntryPoint(FormDataControlTestFactory.createBuilder().representations(Optional.empty()).build()); + void shouldBeTrueOnFimFormEngine() { + var formData = FormDataTestFactory.createBuilder() + .header(FormHeaderTestFactory.createBuilder().formEngineName(FimBasedAdapter.FIM_FORM_ENGINE_NAME).build()).build(); - assertThat(result).isEqualTo(FimBasedAdapter.DEFAULT_FORMDATA_REPRESENTATION_NAME); - } - - @Test - void shouldReturnDefaultOnMissingPrimary() { - var control = FormDataControlTestFactory.createBuilder().representations(Optional.of(Representations.builder().build())).build(); + var isResponsible = adapter.isResponsible(formData); - var result = adapter.getEntryPoint(control); - - assertThat(result).isEqualTo(FimBasedAdapter.DEFAULT_FORMDATA_REPRESENTATION_NAME); + assertThat(isResponsible).isTrue(); } } - } 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 index 0ea6ec2b100bdc89d16f78b8b253e4fe17639090..9ca64413f8399857126bbbc64e590968a2acdf57 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java @@ -62,7 +62,7 @@ class FimDataMapperTest { } private Map<String, Object> apply() { - return mapper.apply(document, fimScheme, formData); + return mapper.apply(document, fimScheme); } } diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimSchemeHelperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimSchemeHelperTest.java index 9978e286bb6205d6bc7d1662a93a5ee5667e7fbe..7553fefb39eecae195f94a9fa79706efad3d5d52 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimSchemeHelperTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimSchemeHelperTest.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.Collections; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -29,6 +30,11 @@ class FimSchemeHelperTest { @Nested class TestInit { + @BeforeEach + void initMocks() { + setFimSchemeAdapter(Collections.emptyList()); + } + @DisplayName("scheme adapter catalogue") @Nested class TestInitSchemeAdapterCatalogue { @@ -38,7 +44,7 @@ class FimSchemeHelperTest { @Test void shouldInitByAdapter() { - setFimSchemeAdapter(); + setFimSchemeAdapter(List.of(adapter)); helper.init(); @@ -52,15 +58,15 @@ class FimSchemeHelperTest { assertThat(getSchemeAdapterCatalogue()).isNotNull().isEmpty(); } - private void setFimSchemeAdapter() { - ReflectionTestUtils.setField(helper, "fimSchemeAdapters", List.of(adapter)); - } - private FimSchemeAdapterCatalogue getSchemeAdapterCatalogue() { return ReflectionTestUtils.getField(helper, "schemeAdapterCatalogue", FimSchemeAdapterCatalogue.class); } } + private void setFimSchemeAdapter(List<FimSchemeAdapter> adapterList) { + ReflectionTestUtils.setField(helper, "fimSchemeAdapters", adapterList); + } + @Test void shouldInitSchemeCatalogue() { helper.init(); 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 index 45526808759630241f1b178221947fbe44982093..1830c32f8e77c4c928b51c4aedcf899a72c815d1 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java @@ -2,20 +2,18 @@ package de.ozgcloud.eingang.fim; import static org.assertj.core.api.Assertions.*; -import java.io.IOException; - -import javax.xml.parsers.ParserConfigurationException; +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 org.xml.sax.SAXException; import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.fim.common.errorhandling.FimException; +import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; +import lombok.SneakyThrows; @ITCase @ActiveProfiles({ "itcase", "test" }) @@ -23,89 +21,65 @@ import de.ozgcloud.eingang.fim.common.errorhandling.FimException; @SpringBootTest(classes = FimTestConfig.class) class FimServiceITCase { - @Autowired - private FimService fimService; - - private final FormData emptyFormData = FormData.builder().build(); - - @Test - void shouldFailOnEmptyScheme() throws ParserConfigurationException, IOException, SAXException { - var document = FimDocumentTestHelper.getTest1Document(); - var formData = emptyFormData; + @Autowired // NOSONAR + private FimService service; - assertThatThrownBy(() -> fimService.transformDocument(document, formData)).isInstanceOf(FimException.class) - .hasMessage("XML Document does not provide a scheme."); - } + @Nested + class TestGetSchemeForIdentifier { - @Test - void shouldNoFindInvalidScheme() { - var scheme = fimService.getSchemeForIdentifier("test"); + @Test + void shouldNoFindInvalidScheme() { + var scheme = service.getSchemeForIdentifier("test"); - assertThat(FimSchemeIdentifier.fromString("unknown")).isEqualTo(scheme.getIdentifier()); - } + assertThat(scheme.getIdentifier()).isEqualTo(FimSchemeIdentifier.fromString("unknown")); + } - @Test - void shouldFindVersammlungsScheme() { - var scheme = fimService.getSchemeForIdentifier("urn:xoev-de:xfall:standard:fim-s17000652_1.4"); + @Test + void shouldFindVersammlungsScheme() { + var scheme = service.getSchemeForIdentifier("urn:xoev-de:xfall:standard:fim-s17000652_1.4"); - assertThat(scheme).isNotNull(); - } + assertThat(scheme).isNotNull(); + } - @Test - void shouldFindTest2Scheme() { - var scheme = fimService.getSchemeForIdentifier("test2"); + @Test + void shouldFindTest2Scheme() { + var scheme = service.getSchemeForIdentifier("test2"); - assertThat(scheme).isNotNull(); + assertThat(scheme).isNotNull(); + } } - @Test - void shouldTransformSimpleDocument() throws ParserConfigurationException, IOException, SAXException { - var formData = fimService.transformDocument(FimDocumentTestHelper.getTest2Document(), emptyFormData); + @Nested + class TestDoParse { - assertThat(FimDocumentTestHelper.getTest2AsMap()).isEqualTo(formData.getFormData()); - } - - @Test - void shouldTransformSimpleDocumentWithoutNamespace() throws ParserConfigurationException, IOException, SAXException { - var formData = fimService.transformDocument(FimDocumentTestHelper.getTest3Document(), emptyFormData); + @SneakyThrows + @Test + void shouldTransformSimpleDocument() { + var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test2.xml")).build(); - assertThat(FimDocumentTestHelper.getTest3AsMap()).isEqualTo(formData.getFormData()); - } + var formData = service.doParse(file); - @Test - void shouldTransformDocument() throws ParserConfigurationException, IOException, SAXException { - var formData = fimService.transformDocument(FimDocumentTestHelper.getVersammlungsAnzeigeDocument(), emptyFormData); + assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest2AsMap()); + } - assertThat(formData).isNotNull(); - assertThat(formData.getFormData()).isEqualTo(FimDocumentTestHelper.getVersammlungsAnzeigeAsMap()); - } + @SneakyThrows + @Test + void shouldTransformSimpleDocumentWithoutNamespace() { + var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/test3.xml")).build(); - @Test - void shouldHaveNameInHeader() throws ParserConfigurationException, IOException, SAXException { - var formData = fimService.transformDocument(FimDocumentTestHelper.getAntragDocument(), emptyFormData); + var formData = service.doParse(file); - assertThat(formData).isNotNull(); - assertThat(formData.getHeader().getFormName()).isEqualTo("urn:fim:Versammlungsanzeige:1.4"); - } + assertThat(formData).isEqualTo(FimDocumentTestHelper.getTest3AsMap()); + } - @Test - void shouldHaveAntragsteller() throws ParserConfigurationException, IOException, SAXException { - var formData = fimService.transformDocument(FimDocumentTestHelper.getAntragDocument(), emptyFormData); + @SneakyThrows + @Test + void shouldTransformDocument() { + var file = IncomingFileTestFactory.createBuilder().file(new File("src/test/resources/S17000652V1.4_test01.xml")).build(); - assertThat(formData).isNotNull(); - assertThat(formData.getAntragsteller()).isNotNull(); - } + var formData = service.doParse(file); - @Test - void shouldHaveAntragstellerAntragstellerData() throws ParserConfigurationException, IOException, SAXException { - var formData = fimService.transformDocument(FimDocumentTestHelper.getAntragDocument(), emptyFormData); - - assertThat(formData).isNotNull(); - assertThat(formData.getAntragsteller().getVorname()).isEqualTo("Jörg"); - assertThat(formData.getAntragsteller().getNachname()).isEqualTo("Bolay"); - assertThat(formData.getAntragsteller().getStrasse()).isEqualTo("Muster"); - assertThat(formData.getAntragsteller().getHausnummer()).isEqualTo("1"); - assertThat(formData.getAntragsteller().getPlz()).isEqualTo("12345"); - assertThat(formData.getAntragsteller().getOrt()).isEqualTo("Muster"); + 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 1c4cb152a7e4e117bea59eda5fcf700029bbb51c..f94ad5635e9066f8b899aa622310fe651202415b 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,8 +4,6 @@ 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 java.util.Optional; import org.apache.commons.lang3.StringUtils; @@ -15,111 +13,53 @@ 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.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; +import de.ozgcloud.eingang.common.formdata.FormData.Representations; +import de.ozgcloud.eingang.common.formdata.FormDataControlTestFactory; 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 FimDataMapper mapper; - @Mock - private AntragstellerMapper antragstellerMapper; - @Mock private FimSchemeHelper schemeHelper; + @Mock + private DocumentHelper documentHelper; - @DisplayName("Transform document") + @DisplayName("Get entry point") @Nested - class TestTransformDocument { - - @Mock - private Document doc; - @Mock - private FimScheme fimScheme; - - private final FormData formData = FormDataTestFactory.create(); - private final String schemeName = LoremIpsum.getInstance().getName(); - private final Map<String, Object> formDataMap = Collections.emptyMap(); - private final FormHeader formHeader = FormHeaderTestFactory.create(); - - @BeforeEach - void mock() { - doReturn(schemeName).when(service).getSchemeName(any()); - doReturn(fimScheme).when(service).getSchemeForIdentifier(any()); - doReturn(formHeader).when(service).buildFormHeader(any(), any()); - - when(mapper.apply(any(), any(), any())).thenReturn(formDataMap); - when(antragstellerMapper.map(any())).thenReturn(AntragstellerTestFactory.create()); - } + class TestGetEntryPoint { @Test - void shouldCallGetSchemeName() { - transformDocument(); + void shouldReturnPrimaryRepresentationName() { + var result = service.getPrimaryRepresentationName(FormDataControlTestFactory.create()); - verify(service).getSchemeName(doc); + assertThat(result).isEqualTo(FormDataControlTestFactory.PRIMARY_FORM_DATA_REPRESENTATION); } @Test - void shouldCallGetSchemeForIdentifier() { - transformDocument(); + void shouldReturnDefaultNameOnMissingRepresentations() { + var formDataControl = FormDataControlTestFactory.createBuilder().representations(Optional.empty()).build(); - verify(service).getSchemeForIdentifier(schemeName); - } + var result = service.getPrimaryRepresentationName(formDataControl); - @Test - void shouldCallFimDataMapper() { - transformDocument(); - - verify(mapper).apply(doc, fimScheme, formData); + assertThat(result).isEqualTo(FimService.DEFAULT_FORMDATA_REPRESENTATION_NAME); } @Test - void shouldCallAntragstellerMapper() { - transformDocument(); - - verify(antragstellerMapper).map(formDataMap); - } - - @Test - void shouldCallBuildFormHeader() { - transformDocument(); - - verify(service).buildFormHeader(formData, formDataMap); - } - - @DisplayName("should return formdata contains") - @Nested - class TestShouldReturn { - - @DisplayName("antragsteller") - @Test - void shouldReturnAntragsteller() { - var transformedFormData = transformDocument(); - - assertThat(transformedFormData.getAntragsteller()).usingRecursiveComparison().isEqualTo(AntragstellerTestFactory.create()); - } - - @DisplayName("form header") - @Test - void shouldReturnFormHeader() { - var transformedFormData = transformDocument(); + void shouldReturnDefaultOnMissingPrimaryRepresentation() { + var formDataControl = FormDataControlTestFactory.createBuilder() + .representations(Optional.of(Representations.builder().build())) + .build(); - assertThat(transformedFormData.getHeader()).isEqualTo(formHeader); - } - } + var result = service.getPrimaryRepresentationName(formDataControl); - private FormData transformDocument() { - return service.transformDocument(doc, formData); + assertThat(result).isEqualTo(FimService.DEFAULT_FORMDATA_REPRESENTATION_NAME); } } @@ -134,27 +74,27 @@ class FimServiceTest { @Test void shouldCallExtractSchemeName() { - doReturn(schemeName).when(service).extractSchemeName(any()); + doReturn(schemeName).when(documentHelper).extractSchemeName(any()); service.getSchemeName(doc); - verify(service).extractSchemeName(doc); + verify(documentHelper).extractSchemeName(doc); } @Test void shouldThrowExceptionOnEmptyName() { - doReturn(StringUtils.EMPTY).when(service).extractSchemeName(any()); + doReturn(StringUtils.EMPTY).when(documentHelper).extractSchemeName(any()); assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class); } @Test void shouldReturnValue() { - doReturn(schemeName).when(service).extractSchemeName(any()); + doReturn(schemeName).when(documentHelper).extractSchemeName(any()); - var name = service.getSchemeName(doc); + var schemeName = service.getSchemeName(doc); - assertThat(name).isEqualTo(schemeName); + assertThat(schemeName).isEqualTo(schemeName); } } @@ -216,52 +156,4 @@ class FimServiceTest { } } } - - @DisplayName("Build form header") - @Nested - class TestBuildFormHeader { - - private final Map<String, Object> formDataMap = Collections.emptyMap(); - private final FormData formData = FormDataTestFactory.createBuilder() - .header(FormHeaderTestFactory.createBuilder().formName(null).build()) - .build(); - private final String vorgangName = LoremIpsum.getInstance().getName(); - - @Test - void shouldCallGetVorgangName() { - service.buildFormHeader(formData, formDataMap); - - verify(service).getVorgangsName(formDataMap); - } - - @DisplayName("form name") - @Nested - class TestFormName { - - @Test - void shouldSetIfVorgangNameExists() { - doReturn(Optional.of(vorgangName)).when(service).getVorgangsName(any()); - - var formHeader = service.buildFormHeader(formData, formDataMap); - - assertThat(formHeader.getFormName()).isEqualTo(vorgangName); - } - - @Test - void shouldBeNullIfVorgangNameNotExist() { - doReturn(Optional.empty()).when(service).getVorgangsName(any()); - - var formHeader = service.buildFormHeader(formData, formDataMap); - - assertThat(formHeader.getFormName()).isNull(); - } - } - - @Test - void shouldReturnValue() { - var formHeader = service.buildFormHeader(formData, formDataMap); - - assertThat(formHeader).usingRecursiveComparison().isEqualTo(formData.getHeader()); - } - } } \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java index 23fa26757fccee0f45863f256e9f34522ccae81c..871e7010f31af9bb23bd4b9b8b8c74871f9ec54e 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java @@ -21,7 +21,7 @@ class ZustaendigeStelleMapperTest { assertThat(parsed.getZustaendigeStelles()).hasSize(1).first().extracting(ZustaendigeStelle::getOrganisationseinheitenId) .isEqualTo(FormMetaDataTestFactory.OE_ID); -// assertThat(parsed.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(FormMetaDataTestFactory.OE_ID); + assertThat(parsed.getZustaendigeStelles().get(0).getOrganisationseinheitenId()).isEqualTo(FormMetaDataTestFactory.OE_ID); } @Test @@ -31,12 +31,12 @@ class ZustaendigeStelleMapperTest { assertThat(parsed.getZustaendigeStelles()).hasSize(1).first().extracting(ZustaendigeStelle::getOrganisationseinheitenId) .isNotNull(); -// assertThat(parsed.getZustaendigeStelle()).isNotNull(); + assertThat(parsed.getZustaendigeStelles().get(0)).isNotNull(); } @Test void shouldIgnoreMalformedDestinationId() { - var oeid = mapper.extractOrganisationsEinheitId("quatsch"); + var oeid = mapper.extractOrganisationEinheitId("quatsch"); assertThat(oeid).isEmpty(); } diff --git a/fim-adapter/src/test/resources/application-test.yml b/fim-adapter/src/test/resources/application-test.yml index 148c1af75dbdac7d1dff1c5632d01cf06dae9a83..48cef7b0de1443abb0fe6f7b59d660c95704dae8 100644 --- a/fim-adapter/src/test/resources/application-test.yml +++ b/fim-adapter/src/test/resources/application-test.yml @@ -1,4 +1,6 @@ -fim: - schemeLocations: - - fim-s17000652_1.4/S17000652V1.4_xfall.xsd - - test2/test2.xsd \ No newline at end of file +ozgcloud: + eingang: + fim: + schemeLocations: + - fim-s17000652_1.4/S17000652V1.4_xfall.xsd + - test2/test2.xsd \ No newline at end of file diff --git a/pom.xml b/pom.xml index 065dc6a05b19957b9f766f2a823c33875e5df10e..ac4581018bf79d08f27a2c220b20419480ca2c25 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.7.0</version> + <version>4.9.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java index d96052447475590512a9ac5cd2280ebe22d0715f..092e2a631b3da1cd8394e2ffbe3228cd53e7ea8b 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -26,6 +27,8 @@ import lombok.extern.log4j.Log4j2; @Log4j2 public class IntelliFormRepresentationAdapter { + private static final Predicate<IncomingFile> HAS_XML_CONTENT_TYPE = file -> file.getContentType().contains("xml"); + static final String INTELLIFORM_TYPENAME = "http://xmlns.cit.de/intelliform/transaction"; static final String FILE = "file"; @@ -41,8 +44,7 @@ public class IntelliFormRepresentationAdapter { "t:customer", "t:customer-id", "t:client", - "t:client-id" - ); + "t:client-id"); public static final List<String> CUSTOM_HEADER_ATTRIBUTE_NAMES = List.of( "u:saml_legacypostkorbhandle", "u:saml_givenname", @@ -54,15 +56,13 @@ public class IntelliFormRepresentationAdapter { "u:saml_postaladdress", "u:saml_postalcode", "u:saml_localityname", - ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL - ); + ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL); private static final Collector<Map.Entry<String, ?>, ?, Map<String, Object>> ORDERED_MAP_ENTRY_COLLECTOR = Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (u, v) -> v, - LinkedHashMap::new - ); + LinkedHashMap::new); private final XmlToJavaMapsMapper xmlToJavaMapsMapper; @@ -72,25 +72,23 @@ public class IntelliFormRepresentationAdapter { } Optional<Document> findIntelliFormXMLRepresentation(FormData formData) { - return streamXMLDocumentsFromRepresentations(formData) - .filter(document -> { - var element = document.getDocumentElement(); - var attribute = element.getAttribute("xmlns:t"); - return attribute.equals(INTELLIFORM_TYPENAME); - }) - .findFirst(); + return streamXMLDocumentsFromRepresentations(formData).filter(this::isIntelliFormDocument).findFirst(); + } + + private boolean isIntelliFormDocument(Document document) { + return document.getDocumentElement().getAttribute("xmlns:t").equals(INTELLIFORM_TYPENAME); } Stream<Document> streamXMLDocumentsFromRepresentations(FormData formData) { - return formData.getRepresentations().stream() - .filter(representation -> representation.getContentType().contains("xml")) - .flatMap(xmlRepresentation -> { - try { - return Stream.of(xmlToJavaMapsMapper.parseAsW3cDocument(xmlRepresentation.getContentStream())); - } catch (TechnicalException exception) { - return Stream.empty(); - } - }); + return formData.getRepresentations().stream().filter(HAS_XML_CONTENT_TYPE).flatMap(this::parseDocument); + } + + private Stream<Document> parseDocument(IncomingFile xmlRepresentation) { + try { + return Stream.of(xmlToJavaMapsMapper.parseAsW3cDocument(xmlRepresentation.getContentStream())); + } catch (TechnicalException exception) { + return Stream.empty(); + } } public FormData adaptByRepresentations(FormData formData) { @@ -102,10 +100,8 @@ public class IntelliFormRepresentationAdapter { .attachments(formData.getAttachments()) .formData(Stream.concat( getFormDataEntriesFromDocument(document, formData.getAttachments()), - Map.of( - HEADER_FIELD, createHeaderMap(document) - ).entrySet().stream() - ).collect(ORDERED_MAP_ENTRY_COLLECTOR)) + Map.of(HEADER_FIELD, createHeaderMap(document)).entrySet().stream()) + .collect(ORDERED_MAP_ENTRY_COLLECTOR)) .build(); } @@ -115,8 +111,7 @@ public class IntelliFormRepresentationAdapter { .map(IncomingFile::getVendorId) .collect(Collectors.toSet()); - return xmlToJavaMapsMapper.mapXmlToJavaMaps(document).entrySet() - .stream() + return xmlToJavaMapsMapper.mapXmlToJavaMaps(document).entrySet().stream() .filter(entry -> !isUploadElementWhichRefersToAttachment(entry.getValue(), attachmentVendorIds)); }