From 66575ae3cc470d6f76ac750e3e0f8aaa3d0ecb08 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Mon, 22 Jul 2024 17:58:56 +0200
Subject: [PATCH] KOP-2139 KOP-2445 checkAccountActive: Add wrapper around xta
 service

---
 pom.xml                                       |  5 ++
 .../de/ozgcloud/xta/client/XtaClient.java     | 10 ++-
 .../ozgcloud/xta/client/XtaClientFactory.java |  5 +-
 .../xta/client/core/WebServiceTypeMapper.java | 14 ++++
 .../xta/client/core/WrappedXtaService.java    | 27 +++++++
 .../xta/client/core/XTAServiceFactory.java    |  3 +-
 .../client/XtaClientConfigTestFactory.java    |  2 +-
 .../xta/client/XtaClientFactoryTest.java      |  2 +-
 .../de/ozgcloud/xta/client/XtaClientTest.java | 24 +++---
 .../client/core/WebServiceTypeMapperTest.java | 32 ++++++++
 .../client/core/WrappedXtaServiceTest.java    | 73 +++++++++++++++++++
 11 files changed, 175 insertions(+), 22 deletions(-)
 create mode 100644 src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java
 create mode 100644 src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java
 create mode 100644 src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java
 create mode 100644 src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java

diff --git a/pom.xml b/pom.xml
index d46c664..935366a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -86,6 +86,11 @@
 			<version>${jsr305.version}</version>
 		</dependency>
 
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct</artifactId>
+		</dependency>
+
 		<!-- Test -->
 		<dependency>
 			<groupId>org.projectlombok</groupId>
diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClient.java b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
index d9cb840..6cee6c9 100644
--- a/src/main/java/de/ozgcloud/xta/client/XtaClient.java
+++ b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
@@ -3,10 +3,11 @@ package de.ozgcloud.xta.client;
 import org.apache.commons.lang3.NotImplementedException;
 
 import de.ozgcloud.xta.client.config.XtaClientConfig;
+import de.ozgcloud.xta.client.core.WrappedXtaService;
+import de.ozgcloud.xta.client.exception.ClientException;
 import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageId;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDatasAndHeader;
-import genv3.de.xoev.transport.xta.x211.XTAService;
 import lombok.AccessLevel;
 import lombok.Builder;
 import lombok.Getter;
@@ -17,11 +18,12 @@ import lombok.RequiredArgsConstructor;
 @Getter(AccessLevel.PROTECTED)
 public class XtaClient {
 
-	private final XTAService service;
+	private final WrappedXtaService service;
 	private final XtaClientConfig config;
 
-	public XtaMessageMetaDatasAndHeader getMessagesMetadata(String xtaIdentifier) {
-		throw new NotImplementedException("");
+	public XtaMessageMetaDatasAndHeader getMessagesMetadata(String xtaIdentifier) throws ClientException {
+		service.checkAccountActive(xtaIdentifier);
+		return null;
 	}
 
 	public XtaMessageMetaDatasAndHeader getNextMessagesMetadata(String xtaIdentifier, String msgBoxRequestId) {
diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClientFactory.java b/src/main/java/de/ozgcloud/xta/client/XtaClientFactory.java
index fbdb70d..a28ef53 100644
--- a/src/main/java/de/ozgcloud/xta/client/XtaClientFactory.java
+++ b/src/main/java/de/ozgcloud/xta/client/XtaClientFactory.java
@@ -2,6 +2,7 @@ package de.ozgcloud.xta.client;
 
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.config.XtaConfigValidator;
+import de.ozgcloud.xta.client.core.WrappedXtaService;
 import de.ozgcloud.xta.client.core.XTAServiceFactory;
 import de.ozgcloud.xta.client.exception.ClientInitializationException;
 import lombok.Builder;
@@ -26,7 +27,9 @@ public class XtaClientFactory {
 		configValidator.validate(config);
 		return XtaClient.builder()
 				.config(config)
-				.service(xtaServiceFactory.create())
+				.service(WrappedXtaService.builder()
+						.service(xtaServiceFactory.create())
+						.build())
 				.build();
 	}
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java b/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java
new file mode 100644
index 0000000..4a2c298
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.xta.client.core;
+
+import org.mapstruct.Mapper;
+
+import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType;
+import genv3.eu.osci.ws.x2014.x10.transport.PartyType;
+
+@Mapper
+public interface WebServiceTypeMapper {
+
+	PartyType mapPartyTypeFromIdentifierString(String identifier);
+
+	PartyIdentifierType mapPartyIdentifierTypeFromIdentifierString(String value);
+}
diff --git a/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java b/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java
new file mode 100644
index 0000000..1a078be
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java
@@ -0,0 +1,27 @@
+package de.ozgcloud.xta.client.core;
+
+import de.ozgcloud.xta.client.exception.ClientException;
+import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
+import genv3.de.xoev.transport.xta.x211.XTAService;
+import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+@Builder
+@Getter
+public class WrappedXtaService {
+
+	private final XTAService service;
+	private final WebServiceTypeMapper typeMapper;
+
+	public void checkAccountActive(String clientIdentifier) throws ClientException {
+		try {
+			service.getManagementPort().checkAccountActive(typeMapper.mapPartyTypeFromIdentifierString(clientIdentifier));
+		} catch (XTAWSTechnicalProblemException | PermissionDeniedException e) {
+			throw new ClientException("checkAccountActive call failed due to: " + e.getMessage(), e);
+		}
+	}
+
+}
diff --git a/src/main/java/de/ozgcloud/xta/client/core/XTAServiceFactory.java b/src/main/java/de/ozgcloud/xta/client/core/XTAServiceFactory.java
index fbc3ae3..3c1edc7 100644
--- a/src/main/java/de/ozgcloud/xta/client/core/XTAServiceFactory.java
+++ b/src/main/java/de/ozgcloud/xta/client/core/XTAServiceFactory.java
@@ -13,7 +13,6 @@ import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.transport.http.HTTPConduit;
 
-import de.ozgcloud.xta.client.XtaClient;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.exception.ClientInitializationException;
 import genv3.de.xoev.transport.xta.x211.XTAService;
@@ -42,7 +41,7 @@ public class XTAServiceFactory {
 
 	public XTAService create() throws ClientInitializationException {
 		log.debug("[createXtaService] Using config: {}", config);
-		var service = new XTAService(XtaClient.class.getResource("wsdl/XTA.wsdl"));
+		var service = new XTAService();
 		configureServiceBindings(service);
 		return service;
 	}
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java b/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java
index 24c8421..feceef5 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java
@@ -20,7 +20,7 @@ import lombok.SneakyThrows;
 
 public class XtaClientConfigTestFactory {
 
-	static final String SELF_IDENTIFIER = "selfIdentifier";
+	public static final String SELF_IDENTIFIER = "selfIdentifier";
 	static final String SELF_IDENTIFIER2 = "selfIdentifier2";
 
 	public static final String KEYSTORE_ALIAS = "selfSigned";
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/XtaClientFactoryTest.java
index 2c29651..4ddc2fb 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientFactoryTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientFactoryTest.java
@@ -50,7 +50,7 @@ class XtaClientFactoryTest {
 		void shouldHaveService() {
 			var client = factory.create();
 
-			assertThat(client.getService()).isEqualTo(service);
+			assertThat(client.getService().getService()).isEqualTo(service);
 		}
 
 		@DisplayName("should have config")
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
index f61eb01..abac461 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
@@ -1,8 +1,8 @@
 package de.ozgcloud.xta.client;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static de.ozgcloud.xta.client.XtaClientConfigTestFactory.*;
+import static org.mockito.Mockito.*;
 
-import org.apache.commons.lang3.NotImplementedException;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -12,15 +12,14 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import de.ozgcloud.xta.client.config.XtaClientConfig;
-import genv3.de.xoev.transport.xta.x211.XTAService;
-import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType;
-import genv3.eu.osci.ws.x2014.x10.transport.PartyType;
+import de.ozgcloud.xta.client.core.WrappedXtaService;
+import lombok.SneakyThrows;
 
 @ExtendWith(MockitoExtension.class)
 class XtaClientTest {
 
 	@Mock
-	private XTAService service;
+	private WrappedXtaService service;
 
 	@Mock
 	private XtaClientConfig config;
@@ -31,15 +30,14 @@ class XtaClientTest {
 	@DisplayName("get messages metadata")
 	@Nested
 	class TestGetMessagesMetadata {
-		@DisplayName("should something")
+
+		@DisplayName("should call checkAccountActive")
 		@Test
-		void shouldSomething() {
-			var p = new PartyType();
-			var selfIdentifier = new PartyIdentifierType();
-			selfIdentifier.setValue("selfIdentifier");
-			p.setIdentifier(selfIdentifier);
+		@SneakyThrows
+		void shouldCallCheckAccountActive() {
+			client.getMessagesMetadata(SELF_IDENTIFIER);
 
-			assertThrows(NotImplementedException.class, () -> client.getMessagesMetadata("selfIdentifier"));
+			verify(service).checkAccountActive(SELF_IDENTIFIER);
 		}
 
 	}
diff --git a/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java b/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java
new file mode 100644
index 0000000..064e8e9
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.xta.client.core;
+
+import static de.ozgcloud.xta.client.XtaClientConfigTestFactory.*;
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+class WebServiceTypeMapperTest {
+
+	@InjectMocks
+	private WebServiceTypeMapperImpl mapper;
+
+	@DisplayName("map party type from identifier string")
+	@Nested
+	class TestMapPartyTypeFromIdentifierString {
+
+		@DisplayName("should map party type from identifier string")
+		@Test
+		void shouldMapPartyTypeFromIdentifierString() {
+			var result = mapper.mapPartyTypeFromIdentifierString(SELF_IDENTIFIER);
+
+			assertThat(result.getIdentifier().getValue()).isEqualTo(SELF_IDENTIFIER);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java b/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java
new file mode 100644
index 0000000..a2bd9ea
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java
@@ -0,0 +1,73 @@
+package de.ozgcloud.xta.client.core;
+
+import static de.ozgcloud.xta.client.XtaClientConfigTestFactory.*;
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import de.ozgcloud.xta.client.exception.ClientException;
+import genv3.de.xoev.transport.xta.x211.ManagementPortType;
+import genv3.de.xoev.transport.xta.x211.XTAService;
+import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+import genv3.eu.osci.ws.x2014.x10.transport.PartyType;
+import lombok.SneakyThrows;
+
+@ExtendWith(MockitoExtension.class)
+class WrappedXtaServiceTest {
+
+	@Mock
+	private XTAService rawService;
+
+	@Mock
+	private WebServiceTypeMapper typeMapper;
+
+	@InjectMocks
+	private WrappedXtaService service;
+
+	@DisplayName("check account active")
+	@Nested
+	class TestCheckAccountActive {
+
+		@Mock
+		private PartyType partyType;
+
+		@Mock
+		private ManagementPortType managementPortType;
+
+		@BeforeEach
+		void mock() {
+			when(rawService.getManagementPort()).thenReturn(managementPortType);
+			when(typeMapper.mapPartyTypeFromIdentifierString(SELF_IDENTIFIER)).thenReturn(partyType);
+		}
+
+		@DisplayName("should call raw service method")
+		@Test
+		@SneakyThrows
+		void shouldCallRawServiceMethod() {
+			service.checkAccountActive(SELF_IDENTIFIER);
+
+			verify(managementPortType).checkAccountActive(partyType);
+		}
+
+		@DisplayName("should throw client exception on technical problem")
+		@Test
+		@SneakyThrows
+		void shouldThrowClientExceptionOnTechnicalProblem() {
+			var message = "technical problem";
+			doThrow(new XTAWSTechnicalProblemException(message)).when(managementPortType).checkAccountActive(partyType);
+
+			assertThatThrownBy(() -> service.checkAccountActive(SELF_IDENTIFIER))
+					.isInstanceOf(ClientException.class)
+					.hasMessageContaining(message);
+		}
+	}
+
+}
\ No newline at end of file
-- 
GitLab