From 0a0ff1609fe6e424596862835aed36bb9c3f06b6 Mon Sep 17 00:00:00 2001 From: OZG-Cloud Team <noreply@ozg-sh.de> Date: Wed, 22 May 2024 15:28:50 +0200 Subject: [PATCH] OZG-5412 common: Resolve XTAHelper --- .../intelliform/DepositDataMapper.java | 43 +++++++++++++++++-- .../ozgcloud/eingang/xdomea}/XMLHelper.java | 2 +- .../eingang/xdomea/XdomeaXMLValueReader.java | 3 +- 3 files changed, 41 insertions(+), 7 deletions(-) rename {common/src/main/java/de/ozgcloud/eingang/common/xml => xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea}/XMLHelper.java (98%) diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java index dd8a74b7..61150c38 100644 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java +++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java @@ -23,6 +23,7 @@ */ package de.ozgcloud.eingang.intelliform; +import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -32,29 +33,55 @@ import java.util.stream.Collectors; 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.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; import de.ozgcloud.common.binaryfile.TempFileUtils; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.xml.XMLHelper; import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor class DepositDataMapper { + // TODO Resolve code duplication (xta-adapter: de.ozgcloud.eingang.xdomea.XMLHelper) + private static final DocumentBuilder DOCUMENT_BUILDER = createDocumentBuilder(); + + private static DocumentBuilder createDocumentBuilder() { + var documentBuilderFactory = DocumentBuilderFactory.newInstance(); + try { + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + return documentBuilderFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new TechnicalException("Failed to configure document builder", e); + } + } + public FormData mapToFormData(DepositData depositData) { Map<String, IncomingFile> incomingFileMap = mapDepositAttachmentsToIncomingFiles(depositData); Document document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); List<String> attachmentFileIds = findAttachmentFileIds(document); - var attachments = getAttachmentFileGroups(attachmentFileIds, incomingFileMap); - var representations = getRepresentations(incomingFileMap, attachmentFileIds); + + return mapToFormDataWithRepresentationsAndAttachments( + getRepresentations(incomingFileMap, attachmentFileIds), + getAttachmentFileGroups(attachmentFileIds, incomingFileMap) + ); + } + + private FormData mapToFormDataWithRepresentationsAndAttachments( + List<IncomingFile> representations, + List<IncomingFileGroup> attachments + ) { return FormData.builder() .attachments(attachments) .numberOfAttachments(attachments.size()) @@ -85,11 +112,19 @@ class DepositDataMapper { private Document parsePrimaryXmlRepresentation(DepositData depositData, Map<String, IncomingFile> incomingFileMap) { // Expect that the <primaryDataAttachmentId> refers to the XML file - return XMLHelper.parseDocument( + return parseDocument( getIncomingFileById(depositData.getPrimaryDataAttachmentId(), incomingFileMap) ); } + private static Document parseDocument(IncomingFile incomingFile) { + try (var inputStream = incomingFile.getContentStream()) { + return DOCUMENT_BUILDER.parse(inputStream); + } catch (SAXException | IOException e) { + throw new TechnicalException("Failed to parse xml document!", e); + } + } + private List<String> findAttachmentFileIds(Document document) { return streamElements(document.getElementsByTagName("file")) .map(element -> element.getAttribute("id")) diff --git a/common/src/main/java/de/ozgcloud/eingang/common/xml/XMLHelper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XMLHelper.java similarity index 98% rename from common/src/main/java/de/ozgcloud/eingang/common/xml/XMLHelper.java rename to xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XMLHelper.java index ba8d6587..1eb09f2e 100644 --- a/common/src/main/java/de/ozgcloud/eingang/common/xml/XMLHelper.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XMLHelper.java @@ -1,4 +1,4 @@ -package de.ozgcloud.eingang.common.xml; +package de.ozgcloud.eingang.xdomea; import java.io.IOException; diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java index f0fc982a..8408c70c 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java @@ -1,6 +1,6 @@ package de.ozgcloud.eingang.xdomea; -import static de.ozgcloud.eingang.common.xml.XMLHelper.*; +import static de.ozgcloud.eingang.xdomea.XMLHelper.*; import java.util.List; import java.util.stream.IntStream; @@ -17,7 +17,6 @@ import org.w3c.dom.NodeList; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.xml.XMLHelper; @Component public class XdomeaXMLValueReader { -- GitLab