diff --git a/pom.xml b/pom.xml index d46c6644a47ccd130fc0b384e1cfe163f6b29c23..935366a3ccd1f75db7dfeb8ec60f8986ddfd3388 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 d9cb84096901d40e5dfb12726ade4af37d056184..6cee6c9c4a4bc1df12b79fe1a0adfbdf2f32be59 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 fbdb70d3db717b4907d9353cd6977e510b801c83..a28ef539f289fc5f291209c2ede55c4336fb4f7e 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 0000000000000000000000000000000000000000..4a2c29812a943ed6b22073229c295b1e9da3fe20 --- /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 0000000000000000000000000000000000000000..1a078be9fbbb9e1b19fb87a029bde0f8963c1e9c --- /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 fbc3ae38a8e99b5e6e17a42cefa98dc2720ea62c..3c1edc781fc5fccf6d8be5d170eb9cba1fd6c0b4 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 24c8421446a971642ad9cad746a90db74efae951..feceef55fbf2162712f7d04a89c3ddd743a8bb72 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 2c2965178ecd48076639928420e78fdb53b33bf0..4ddc2fbfab6f9d6dd3a0fb5c5ac64479a1461e43 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 f61eb01fc704b6b277fc4037af57ec9a73e9c5d0..abac4619bcbfbe7c28f3c4422ff76dd19d708e9a 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 0000000000000000000000000000000000000000..064e8e953f7ba0d9cd57c63b5f90e880a774de37 --- /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 0000000000000000000000000000000000000000..a2bd9eae053ac1c47a98df8ad32a8b30e405d03e --- /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