From fabaafa656cc42f910f4352288a29ddde9f72a24 Mon Sep 17 00:00:00 2001 From: Lukas Malte Monnerjahn <lukasmalte.monnerjahn@dataport.de> Date: Wed, 10 Jul 2024 16:01:30 +0200 Subject: [PATCH] =?UTF-8?q?OZG-5808=20XML-Anh=C3=A4nge=20von=20Eing=C3=A4n?= =?UTF-8?q?gen=20=C3=BCber=20XTA/NB=20immer=20als=20Repr=C3=A4sentation=20?= =?UTF-8?q?behandeln?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eingang/xdomea/XdomeaXMLValueReader.java | 42 +++++++++++++++---- .../xdomea/XdomeaXMLValueReaderTest.java | 10 +++-- ...tel_Geschaeftsgang.Geschaeftsgang.0201.xml | 31 ++++++++++++++ ...rag_Geschaeftsgang.Geschaeftsgang.0201.xml | 33 +++++++++++++++ 4 files changed, 104 insertions(+), 12 deletions(-) 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 961231e9a..6c816be79 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 @@ -24,13 +24,26 @@ public class XdomeaXMLValueReader { private static final String DATEINAME_NODE_QUERY_STRING = "//Hauptobjekt//Dateiname"; private static final XPathExpression DATEINAME_NODE_QUERY = compileXPathExpression(DATEINAME_NODE_QUERY_STRING); + // Query für XML-Dateien in Anlagen + // Siehe auch https://www.xrepository.de/details/urn:xoev-de:xdomea:kosit:standard:xdomea + // und https://www.xrepository.de/details/urn:xoev-de:xdomea:codeliste:dateiformat + public static final String ANLAGE_NODE_QUERY_DFOERDER = "//Anlage//Format/Name[@listURI='urn:xoev-de:xdomea:codeliste:dateiformat']/code[.='030']/../..//Dateiname"; + public static final String ANLAGE_NODE_QUERY_AFM = "//Anlage//Format/Name[substring(., 1, 3)='030']/..//Dateiname"; + public static final String ANLAGE_NODE_QUERY_STRING = ANLAGE_NODE_QUERY_DFOERDER + " | " + ANLAGE_NODE_QUERY_AFM; + private static final XPathExpression ANLAGE_NODE_QUERY = compileXPathExpression(ANLAGE_NODE_QUERY_STRING); + public List<String> readRepresentationFileNames(IncomingFile xdomeaXMLFile) { - return getTextsFromNodes( - queryDateinameNodeList( - XMLHelper.parseDocument(xdomeaXMLFile) - .getDocumentElement() - ) - ); + var parsedXML = XMLHelper.parseDocument(xdomeaXMLFile).getDocumentElement(); + return Stream.concat( + getTextsFromNodes( + queryDateinameNodeList( + parsedXML + )), + getTextsFromNodes( + queryAnlageNodeList( + parsedXML + )) + ).toList(); } private NodeList queryDateinameNodeList(Element contextElement) { @@ -45,11 +58,22 @@ public class XdomeaXMLValueReader { } } - private List<String> getTextsFromNodes(NodeList nodeList) { + private NodeList queryAnlageNodeList(Element contextElement) { + try { + return (NodeList) ANLAGE_NODE_QUERY + .evaluate( + contextElement, + XPathConstants.NODESET + ); + } catch (XPathExpressionException e) { + throw new TechnicalException("Failed to execute xpath search!", e); + } + } + + private Stream<String> getTextsFromNodes(NodeList nodeList) { return streamNodeList(nodeList) .map(Node::getTextContent) - .map(String::trim) - .toList(); + .map(String::trim); } private Stream<Node> streamNodeList(NodeList nodeList) { diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java index fdc793156..7d126c900 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java @@ -22,6 +22,8 @@ import lombok.SneakyThrows; class XdomeaXMLValueReaderTest { private static final String XML_FILE_NAME = "file.xml"; private static final String PDF_FILE_NAME = "file.pdf"; + private static final String XML_ATTACHMENT_FILE_NAME = "saml-attachment-file.xml"; + public static final String PDF_ATTACHMENT_FILE_NAME = "some-attachment-file.pdf"; @Spy @InjectMocks @@ -34,7 +36,7 @@ class XdomeaXMLValueReaderTest { @Mock IncomingFile incomingXmlFile; - @DisplayName("should find 'Dateiname' elements in MSR mantelantrag") + @DisplayName("should find 'Dateiname' elements and all XML-files in MSR mantelantrag") @ParameterizedTest @ValueSource(strings = { "xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml", @@ -45,12 +47,14 @@ class XdomeaXMLValueReaderTest { var xmlString = TestUtils.loadTextFile( antragXMLFilename, XML_FILE_NAME + "\n", - PDF_FILE_NAME); + PDF_FILE_NAME, + XML_ATTACHMENT_FILE_NAME, + PDF_ATTACHMENT_FILE_NAME); when(incomingXmlFile.getContentStream()).thenReturn(IOUtils.toInputStream(xmlString, StandardCharsets.UTF_8)); var names = valueReader.readRepresentationFileNames(incomingXmlFile); - assertThat(names).isEqualTo(List.of(XML_FILE_NAME, PDF_FILE_NAME)); + assertThat(names).isEqualTo(List.of(XML_FILE_NAME, PDF_FILE_NAME, XML_ATTACHMENT_FILE_NAME)); } } diff --git a/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml index 28200a104..908ab7d41 100644 --- a/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml +++ b/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml @@ -104,4 +104,35 @@ </Verfuegung> </Beteiligungsschritt> </ExternerGeschaeftsgang> + <Anlage> + <Dokument> + <Identifikation> + <ID>1d8ca22a-9d20-4507-aa5e-b764bb5642f0</ID> + </Identifikation> + <Typ>Anlage</Typ> + <Version> + <Nummer>1</Nummer> + <Format> + <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> + <code xmlns="">030</code> + <name xmlns="">xml-eXtensible Markup Language</name> + </Name> + <Version>0.0</Version> + <Primaerdokument> + <Dateiname>%s</Dateiname> + </Primaerdokument> + </Format> + <Format> + <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> + <code xmlns="">018</code> + <name xmlns="">pdf-Portable Document Format</name> + </Name> + <Version>0.0</Version> + <Primaerdokument> + <Dateiname>%s</Dateiname> + </Primaerdokument> + </Format> + </Version> + </Dokument> + </Anlage> </Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml index 349a7a5c3..bc0d50a38 100644 --- a/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml +++ b/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml @@ -96,4 +96,37 @@ </xdomea:Verfuegung> </xdomea:Beteiligungsschritt> </xdomea:ExternerGeschaeftsgang> + <xdomea:Anlage> + <xdomea:Dokument> + <xdomea:Identifikation> + <xdomea:ID>1d8ca22a-9d20-4507-aa5e-b764bb5642f0</xdomea:ID> + </xdomea:Identifikation> + <xdomea:Typ>Anlage</xdomea:Typ> + <xdomea:Version> + <xdomea:Nummer>1</xdomea:Nummer> + <xdomea:Format> + <xdomea:Name codeName="xml - eXtensible Markup Language" + codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" + languageCode="de" codelistName="Dateiformat">030 + </xdomea:Name> + <xdomea:Version>0.0</xdomea:Version> + <xdomea:Primaerdokument> + <xdomea:Dateiname>%s</xdomea:Dateiname> + </xdomea:Primaerdokument> + </xdomea:Format> + </xdomea:Version> + <xdomea:Version> + <xdomea:Nummer>1</xdomea:Nummer> + <xdomea:Format> + <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" + codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018 + </xdomea:Name> + <xdomea:Version>0.0</xdomea:Version> + <xdomea:Primaerdokument> + <xdomea:Dateiname>%s</xdomea:Dateiname> + </xdomea:Primaerdokument> + </xdomea:Format> + </xdomea:Version> + </xdomea:Dokument> + </xdomea:Anlage> </xdomea:Geschaeftsgang.Geschaeftsgang.0201> -- GitLab