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 961231e9ad05e5ef208c05f5218493ebddd0b44e..6c816be79c8941dc866628c3b9ee0ebe4f3df79a 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 fdc793156871725f8e9ce415f05b652ae0dcc435..7d126c900c1101df771cc4613dbf82001e407f10 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 28200a104f3cb7ded5851105ad2d9fd80034bc3c..908ab7d4126298d8fc8cf9069a40cda0af1f3e92 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 349a7a5c3a2406981d48091a319a7aa8f63b16f0..bc0d50a388e91dfd1df63a439de364e709d7dfe6 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>