From 207e24ef9d413be2c1324896b70bdbce1fe103b9 Mon Sep 17 00:00:00 2001
From: Lukas Malte Monnerjahn <lukasmalte.monnerjahn@dataport.de>
Date: Wed, 4 Sep 2024 16:26:36 +0200
Subject: [PATCH] OZG-6239 KOP-2607 xta error codes in exceptions

---
 .../xta/test/app/model/XtaConstants.java      | 12 ++++++
 .../xta/test/app/server/MsgBoxPortImpl.java   | 38 ++++++++++++++-----
 .../xta/test/app/server/SendXtaPortImpl.java  | 24 +++++++-----
 .../test/app/mapper/RequestMapperTest.java    | 18 ++++-----
 .../test/app/server/MsgBoxPortImplTest.java   | 34 +++++++++++++----
 .../test/app/server/SendXtaPortImplTest.java  | 10 ++++-
 6 files changed, 97 insertions(+), 39 deletions(-)

diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
index a5af977..5ca37d7 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
@@ -65,6 +65,18 @@ public class XtaConstants {
 	public static final String SEND_MESSAGE_ACTION = XTA_ACTION_BASE + "SendMessage";
 	public static final String SEND_MESSAGE_SYNC_ACTION = XTA_ACTION_BASE + "SendMessageSync";
 
+	/*
+	 * Fehlercodes
+	 */
+	public static final String ERROR_CODE_LIST_URN = "urn:de:xta:webservice:codeliste:fehlernummer";
+	public static final String ERROR_CODE_LIST_VERSION = "2.0.0";
+	public static final String ERROR_CODE_PARAMETER_MISSING = "9020";
+	public static final String ERROR_CODE_PARAMETER_MISSING_DESCRIPTION = "Keine Parameter vorhanden";
+	public static final String ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM = "9030";
+	public static final String ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM_DESCRIPTION = "Interner Fehler beim XTA-Server bzw. XTA-Dienstleister";
+	public static final String ERROR_CODE_MESSAGE_ID_UNKNOWN = "9070";
+	public static final String ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION = "MessageID für den Account nicht bekannt";
+
 	public enum ConnectionPortType {
 		SEND, MSGBOX, MANAGEMENT
 	}
diff --git a/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java b/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java
index 38a80a5..6fd3857 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java
@@ -1,7 +1,10 @@
 package de.ozgcloud.xta.test.app.server;
 
+import static de.ozgcloud.xta.test.app.model.XtaConstants.*;
+
 import java.util.Optional;
 
+import genv3.de.xoev.transport.xta.x211.*;
 import jakarta.jws.WebService;
 
 import org.apache.cxf.annotations.SchemaValidation;
@@ -16,10 +19,7 @@ import de.ozgcloud.xta.test.app.mapper.ResponseMapper;
 import de.ozgcloud.xta.test.app.service.XtaMessageService;
 import de.ozgcloud.xta.test.app.service.XtaParameter;
 import de.ozgcloud.xta.test.app.util.XtaIdGenerator;
-import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
-import genv3.de.xoev.transport.xta.x211.MsgBoxPortType;
-import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
-import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType;
@@ -72,7 +72,7 @@ public class MsgBoxPortImpl implements MsgBoxPortType {
 	private void validateFetchRequest(MsgBoxFetchRequest fetchRequest) throws XTAWSTechnicalProblemException {
 		if (!(checkMessageSelectionSupported(fetchRequest.getMsgSelector())
 				&& validator.isListSizeEquals(fetchRequest.getMsgSelector().getMessageID(), 1, "MessageID"))) {
-			throw new XTAWSTechnicalProblemException("Invalid fetch request");
+			throw buildTechnicalProblemException("Invalid fetch request");
 		}
 	}
 
@@ -90,7 +90,7 @@ public class MsgBoxPortImpl implements MsgBoxPortType {
 	private XtaMessage getXtaMessageOrThrow(String messageId) throws InvalidMessageIDException {
 		Optional<XtaMessage> message = messageService.getMessage(messageId);
 		if (message.isEmpty()) {
-			throw new InvalidMessageIDException("No message with messageID \"" + messageId + "\" available.");
+			throw buildInvalidMessageIDException("No message with messageID \"" + messageId + "\" available.");
 		}
 		return message.get();
 	}
@@ -133,7 +133,7 @@ public class MsgBoxPortImpl implements MsgBoxPortType {
 				validator.isNotNull(statusListRequest.getListForm(), "listForm")
 				&& statusListRequest.getListForm().equalsIgnoreCase("MessageMetaData")
 				&& validator.isNotNull(statusListRequest.getMaxListItems(), "maxListItems"))) {
-			throw new XTAWSTechnicalProblemException("Invalid getStatusList request");
+			throw buildTechnicalProblemException("Invalid getStatusList request");
 		}
 	}
 
@@ -141,11 +141,11 @@ public class MsgBoxPortImpl implements MsgBoxPortType {
 		try {
 			int maxListItems = statusListRequest.getMaxListItems().intValueExact();
 			if (maxListItems <= 0) {
-				throw new XTAWSTechnicalProblemException("Invalid maxListItems value");
+				throw buildTechnicalProblemException("Invalid maxListItems value");
 			}
 			return maxListItems;
 		} catch (ArithmeticException e) {
-			throw new XTAWSTechnicalProblemException("Invalid maxListItems value");
+			throw buildTechnicalProblemException("Invalid maxListItems value");
 		}
 	}
 
@@ -209,8 +209,26 @@ public class MsgBoxPortImpl implements MsgBoxPortType {
 			messageIdsValid &= messageService.closeMessage(messageId.getValue());
 		}
 		if( ! messageIdsValid ) {
-			throw new InvalidMessageIDException("One or more message IDs are invalid.");
+			throw buildInvalidMessageIDException("One or more message IDs are invalid.");
 		}
 	}
 
+	private XTAWSTechnicalProblemException buildTechnicalProblemException(String message) {
+		var faultInfo = new XTAWSTechnicalProblemExceptionType();
+		faultInfo.getErrorCode().setCode(ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM);
+		faultInfo.getErrorCode().setName(ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM_DESCRIPTION);
+		faultInfo.getErrorCode().setListURI(ERROR_CODE_LIST_URN);
+		faultInfo.getErrorCode().setListVersionID(ERROR_CODE_LIST_VERSION);
+		return new XTAWSTechnicalProblemException(message, faultInfo);
+	}
+
+	private InvalidMessageIDException buildInvalidMessageIDException(String message) {
+		var faultInfo = new InvalidMessageIDExceptionType();
+		faultInfo.getErrorCode().setCode(ERROR_CODE_MESSAGE_ID_UNKNOWN);
+		faultInfo.getErrorCode().setName(ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION);
+		faultInfo.getErrorCode().setListURI(ERROR_CODE_LIST_URN);
+		faultInfo.getErrorCode().setListVersionID(ERROR_CODE_LIST_VERSION);
+		return new InvalidMessageIDException(message, faultInfo);
+	}
+
 }
diff --git a/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java b/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java
index c769881..f2be49e 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java
@@ -1,6 +1,10 @@
 package de.ozgcloud.xta.test.app.server;
 
+import static de.ozgcloud.xta.test.app.model.XtaConstants.*;
+
 import de.ozgcloud.xta.test.app.mapper.RequestMapper;
+
+import genv3.de.xoev.transport.xta.x211.*;
 import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
 import lombok.RequiredArgsConstructor;
 import org.apache.cxf.annotations.SchemaValidation;
@@ -8,14 +12,7 @@ import org.springframework.stereotype.Component;
 
 import de.ozgcloud.xta.test.app.service.ParameterValidatorService;
 import de.ozgcloud.xta.test.app.service.XtaMessageService;
-import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
-import genv3.de.xoev.transport.xta.x211.MessageSchemaViolationException;
-import genv3.de.xoev.transport.xta.x211.MessageVirusDetectionException;
-import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
-import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
-import genv3.de.xoev.transport.xta.x211.SendPortType;
-import genv3.de.xoev.transport.xta.x211.SyncAsyncException;
-import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+
 import jakarta.jws.WebService;
 import lombok.extern.log4j.Log4j2;
 
@@ -56,7 +53,7 @@ public class SendXtaPortImpl implements SendPortType {
 
     public void validateMessageId(MessageMetaData messageMetaData) throws ParameterIsNotValidException {
         if (messageMetaData.getMsgIdentification() == null || messageMetaData.getMsgIdentification().getMessageID() == null) {
-            throw new ParameterIsNotValidException("Message ID is missing");
+            throw buildParameterIsNotValidException("Message ID is missing");
         }
     }
 
@@ -76,4 +73,13 @@ public class SendXtaPortImpl implements SendPortType {
         throw new UnsupportedOperationException("sendMessageSync is not supported");
     }
 
+    private ParameterIsNotValidException buildParameterIsNotValidException(String message) {
+        var faultInfo = new ParameterIsNotValidExceptionType();
+        faultInfo.getErrorCode().setCode(ERROR_CODE_PARAMETER_MISSING);
+        faultInfo.getErrorCode().setName(ERROR_CODE_PARAMETER_MISSING_DESCRIPTION);
+        faultInfo.getErrorCode().setListURI(ERROR_CODE_LIST_URN);
+        faultInfo.getErrorCode().setListVersionID(ERROR_CODE_LIST_VERSION);
+        return new ParameterIsNotValidException(message, faultInfo);
+    }
+
 }
diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java
index 8582b7c..e835fb1 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java
@@ -1,9 +1,16 @@
 package de.ozgcloud.xta.test.app.mapper;
 
-import static org.assertj.core.api.Assertions.*;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import java.nio.file.Files;
 
+import genv3.de.xoev.transport.xta.x211.ContentType;
+import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
+import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest;
+import genv3.eu.osci.ws.x2008.x05.transport.MsgSelector;
+import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
+import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType;
+import lombok.SneakyThrows;
 import org.apache.cxf.ws.addressing.AttributedURIType;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -15,18 +22,9 @@ import de.ozgcloud.xta.test.app.factory.AttributedURITypeTestFactory;
 import de.ozgcloud.xta.test.app.factory.ContentTypeTestFactory;
 import de.ozgcloud.xta.test.app.factory.GenericContentContainerTestFactory;
 import de.ozgcloud.xta.test.app.factory.MessageMetaDataTestFactory;
-import de.ozgcloud.xta.test.app.factory.MsgBoxStatusListRequestTypeTestFactory;
 import de.ozgcloud.xta.test.app.factory.QualifierTypeBusinessScenarioTestFactory;
 import de.ozgcloud.xta.test.app.model.Identifier;
 import de.ozgcloud.xta.test.app.model.XtaFile;
-import genv3.de.xoev.transport.xta.x211.ContentType;
-import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
-import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest;
-import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType;
-import genv3.eu.osci.ws.x2008.x05.transport.MsgSelector;
-import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
-import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType;
-import lombok.SneakyThrows;
 
 public class RequestMapperTest {
 
diff --git a/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java b/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java
index 84ecb15..d658a5f 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java
@@ -21,6 +21,7 @@ import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
 import genv3.eu.osci.ws.x2014.x10.transport.PartyType;
 import jakarta.xml.ws.Holder;
 import lombok.SneakyThrows;
+import org.assertj.core.api.Condition;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -107,8 +108,11 @@ public class MsgBoxPortImplTest {
 		void shouldRejectRequestWithoutMessageId() {
 			fetchRequest.getMsgSelector().getMessageID().clear();
 
+
+
 			assertThatExceptionOfType(XTAWSTechnicalProblemException.class).isThrownBy(
-					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder));
+					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder))
+					.has(technicalProblemErrorCodeCondition());
 		}
 
 		@Test
@@ -116,7 +120,8 @@ public class MsgBoxPortImplTest {
 			fetchRequest.getMsgSelector().getMessageID().add(AttributedURITypeTestFactory.create("urn:de:xta:messageId:extra-id"));
 
 			assertThatExceptionOfType(XTAWSTechnicalProblemException.class).isThrownBy(
-					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder));
+					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder))
+					.has(technicalProblemErrorCodeCondition());
 		}
 
 		@Test
@@ -124,7 +129,8 @@ public class MsgBoxPortImplTest {
 			when(xtaMessageService.getMessage(MsgBoxFetchRequestTestFactory.MESSAGE_ID.getValue())).thenReturn(Optional.empty());
 
 			assertThatExceptionOfType(InvalidMessageIDException.class).isThrownBy(
-					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder));
+					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder))
+					.has(invalidMessageIDExceptionCondition());
 		}
 
 		@Test
@@ -132,7 +138,8 @@ public class MsgBoxPortImplTest {
 			fetchRequest.getMsgSelector().setNewEntry(false);
 
 			assertThatExceptionOfType(XTAWSTechnicalProblemException.class).isThrownBy(
-					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder));
+					() -> msgBoxPortImpl.getMessage(fetchRequest, authorIdentifier, messageMetaDataHolder, responseHeaderHolder))
+					.has(technicalProblemErrorCodeCondition());
 		}
 
 		@Test
@@ -211,7 +218,8 @@ public class MsgBoxPortImplTest {
 			statusListRequest.setListForm(null);
 
 			assertThatExceptionOfType(XTAWSTechnicalProblemException.class).isThrownBy(
-					() -> msgBoxPortImpl.getStatusList(statusListRequest, authorIdentifier, responseHeaderHolder));
+					() -> msgBoxPortImpl.getStatusList(statusListRequest, authorIdentifier, responseHeaderHolder))
+					.has(technicalProblemErrorCodeCondition());
 		}
 
 		@Test
@@ -219,7 +227,8 @@ public class MsgBoxPortImplTest {
 			statusListRequest.setListForm("MsgAttributeListType");
 
 			assertThatExceptionOfType(XTAWSTechnicalProblemException.class).isThrownBy(
-					() -> msgBoxPortImpl.getStatusList(statusListRequest, authorIdentifier, responseHeaderHolder));
+					() -> msgBoxPortImpl.getStatusList(statusListRequest, authorIdentifier, responseHeaderHolder))
+					.has(technicalProblemErrorCodeCondition());
 		}
 
 		@ParameterizedTest
@@ -229,7 +238,8 @@ public class MsgBoxPortImplTest {
 			when(xtaIdGenerator.generateRequestId()).thenReturn(REQUEST_ID);
 
 			assertThatExceptionOfType(XTAWSTechnicalProblemException.class).isThrownBy(
-					() -> msgBoxPortImpl.getStatusList(statusListRequest, authorIdentifier, responseHeaderHolder));
+					() -> msgBoxPortImpl.getStatusList(statusListRequest, authorIdentifier, responseHeaderHolder))
+					.has(technicalProblemErrorCodeCondition());
 		}
 
 		@Test
@@ -303,7 +313,15 @@ public class MsgBoxPortImplTest {
 
 			assertThatExceptionOfType(InvalidMessageIDException.class).isThrownBy(
 					() -> msgBoxPortImpl.close(closeRequest, authorIdentifier)
-			);
+			).has(invalidMessageIDExceptionCondition());
 		}
 	}
+
+	private Condition<XTAWSTechnicalProblemException> technicalProblemErrorCodeCondition() {
+		return new Condition<>(e -> e.getFaultInfo().getErrorCode().getCode().equals("9030"), "error code 9030");
+	}
+
+	private Condition<InvalidMessageIDException> invalidMessageIDExceptionCondition() {
+		return new Condition<>(e -> e.getFaultInfo().getErrorCode().getCode().equals("9070"), "error code 9070 for invalid message ID");
+	}
 }
diff --git a/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java b/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java
index 6696591..4b47d2d 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java
@@ -9,6 +9,7 @@ import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
 import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
 import genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType;
 import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
+import org.assertj.core.api.Condition;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -71,8 +72,13 @@ public class SendXtaPortImplTest {
 			messageMetaData.getMsgIdentification().setMessageID(null);
 
 			assertThatExceptionOfType(ParameterIsNotValidException.class).isThrownBy(
-					() -> sendXtaPortImpl.sendMessage(genericContainer, messageMetaData, x509TokenContainer)
-			).withMessage("Message ID is missing");
+					() -> sendXtaPortImpl.sendMessage(genericContainer, messageMetaData, x509TokenContainer))
+					.withMessage("Message ID is missing")
+					.has(parameterIsMissingExceptionCondition());
 		}
 	}
+
+	private Condition<ParameterIsNotValidException> parameterIsMissingExceptionCondition() {
+		return new Condition<>(e -> e.getFaultInfo().getErrorCode().getCode().equals("9020"), "error code 9020 for missing parameter");
+	}
 }
-- 
GitLab