From a37500bada1f997261c5a7dedce4efffe578894c Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Tue, 1 Oct 2024 16:50:07 +0200
Subject: [PATCH] OZG-6754 KOP-2717 xdomea: Refine xpath for author and reader
 id

---
 .../client/xdomea/reader/XdomeaValueReader.java  |  9 ++++++---
 .../xdomea/XdomeaXtaMessageCreatorITCase.java    | 16 ++++++++++------
 .../dfoerdermittel/invalid-Kennung-missing.patch | 14 ++++++++++++++
 3 files changed, 30 insertions(+), 9 deletions(-)
 create mode 100644 src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch

diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java
index 8ffa131..90dcbeb 100644
--- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java
@@ -16,16 +16,19 @@ import lombok.RequiredArgsConstructor;
 public class XdomeaValueReader {
 
 	static final String PROCESS_ID_XPATH = getXpath("Kopf", "ProzessID");
-	static final String AUTHOR_ID_SUFFIX_XPATH = getXpath("Kopf", "Absender", "code");
+	static final String AUTHOR_ID_SUFFIX_XPATH = getXpath("Kopf", "Absender", "Behoerdenschluessel|Kennung", "code");
 	static final String AUTHOR_ID_PREFIX_XPATH = getXpath("Kopf", "Absender", "Praefix", "code");
-	static final String READER_ID_SUFFIX_XPATH = getXpath("Kopf", "Empfaenger", "code");
+	static final String READER_ID_SUFFIX_XPATH = getXpath("Kopf", "Empfaenger", "Behoerdenschluessel|Kennung", "code");
 	static final String READER_ID_PREFIX_XPATH = getXpath("Kopf", "Empfaenger", "Praefix", "code");
 	static final String MESSAGE_TYPE_ID_SUFFIX_XPATH = getXpath("Kopf", "Nachrichtentyp", "code");
 	static final String PRIMARY_DOCUMENT_NAME_XPATH = getXpath("Primaerdokument", "Dateiname");
 
 	static String getXpath(String... hierarchy) {
 		return Arrays.stream(hierarchy)
-				.map(h -> "//*[local-name() = '" + h + "']")
+				.map(localNames -> Arrays.stream(localNames.split("\\|"))
+						.map(localName -> "local-name() = '" + localName + "'")
+						.collect(Collectors.joining(" or ")))
+				.map(predicate -> "//*[" + predicate + "]")
 				.collect(Collectors.joining());
 	}
 
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java
index 4098c50..6256c85 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java
@@ -65,12 +65,16 @@ class XdomeaXtaMessageCreatorITCase {
 		}
 
 		@DisplayName("should throw client exception for invalid message 0201")
-		@Test
-		void shouldThrowClientExceptionForInvalidMessage0201() {
-			var invalidMessageZipFile = XtaMessageExampleLoader.load(createExampleConfigBuilder()
-					.messageLabel("dfoerdermittel")
-					.patchLabel("invalid-behoerdenkennung-order.patch")
-					.build()).messageFile();
+		@ParameterizedTest
+		@ValueSource(strings = {
+				"invalid-behoerdenkennung-order.patch",
+				"invalid-Kennung-missing.patch",
+		})
+		void shouldThrowClientExceptionForInvalidMessage0201(String patchName) {
+			var invalidMessageZipFile = loadMessageFileWithPatch(
+					"dfoerdermittel",
+					patchName
+			);
 
 			assertThatThrownBy(() -> creator.createMessage(invalidMessageZipFile))
 					.isInstanceOf(ClientException.class);
diff --git a/src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch b/src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch
new file mode 100644
index 0000000..2fb9562
--- /dev/null
+++ b/src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch
@@ -0,0 +1,14 @@
+diff --git a/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml b/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml
+index 7815e7b..82dd9db 100644
+--- a/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml
++++ b/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml
+@@ -10,9 +10,6 @@
+ 		<Erstellungszeitpunkt>2023-04-04T06:59:15.4231885+02:00</Erstellungszeitpunkt>
+ 		<Absender>
+ 			<Behoerdenkennung>
+-				<Kennung listURI="" listVersionID="">
+-					<code xmlns="">${authorIdentifier.value}</code>
+-				</Kennung>
+ 				<Praefix listURI="" listVersionID="">
+ 					<code xmlns="">${authorIdentifier.prefix}</code>
+ 				</Praefix>
-- 
GitLab