From a4d63a3a3e387337ebf606ec76ce687a1b94bd64 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Wed, 24 Jul 2024 09:35:34 +0200 Subject: [PATCH] KOP-2139 KOP-2461 sendMessage: Adjust client model --- .../de/ozgcloud/xta/client/XtaClient.java | 21 +++++---- .../xta/client/core/WebServiceTypeMapper.java | 20 ++++++--- .../xta/client/core/WrappedXtaService.java | 14 ++++-- .../ozgcloud/xta/client/model/Identifier.java | 14 ++++++ .../de/ozgcloud/xta/client/model/XtaFile.java | 8 ++-- .../ozgcloud/xta/client/model/XtaMessage.java | 16 +++---- .../xta/client/model/XtaMessageId.java | 14 ------ .../xta/client/model/XtaMessageMetaData.java | 7 ++- .../client/XtaClientConfigTestFactory.java | 10 ++++- .../de/ozgcloud/xta/client/XtaClientTest.java | 23 ++++++++-- .../client/core/WebServiceTypeMapperTest.java | 45 ++++++++++++++----- .../client/core/WrappedXtaServiceTest.java | 4 +- 12 files changed, 131 insertions(+), 65 deletions(-) create mode 100644 src/main/java/de/ozgcloud/xta/client/model/Identifier.java delete mode 100644 src/main/java/de/ozgcloud/xta/client/model/XtaMessageId.java diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClient.java b/src/main/java/de/ozgcloud/xta/client/XtaClient.java index ddc83b2..36075b3 100644 --- a/src/main/java/de/ozgcloud/xta/client/XtaClient.java +++ b/src/main/java/de/ozgcloud/xta/client/XtaClient.java @@ -4,8 +4,8 @@ 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.model.Identifier; import de.ozgcloud.xta.client.model.XtaMessage; -import de.ozgcloud.xta.client.model.XtaMessageId; import de.ozgcloud.xta.client.model.XtaMessageMetaDataAndHeader; import genv3.de.xoev.transport.xta.x211.PermissionDeniedException; import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException; @@ -24,24 +24,29 @@ public class XtaClient { public XtaMessageMetaDataAndHeader getMessagesMetadata(String xtaIdentifier) throws XTAWSTechnicalProblemException, PermissionDeniedException { - service.checkAccountActive(xtaIdentifier); - return getStatusList(xtaIdentifier); + var clientIdentifier = deriveIdentifier(xtaIdentifier); + service.checkAccountActive(clientIdentifier); + return getStatusList(clientIdentifier); } public XtaMessageMetaDataAndHeader getNextMessagesMetadata(String xtaIdentifier) throws XTAWSTechnicalProblemException, PermissionDeniedException { - return getStatusList(xtaIdentifier); + return getStatusList(deriveIdentifier(xtaIdentifier)); } - private XtaMessageMetaDataAndHeader getStatusList(String xtaIdentifier) throws XTAWSTechnicalProblemException, PermissionDeniedException { - return service.getStatusList(xtaIdentifier, config.getMaxListItems()); + private XtaMessageMetaDataAndHeader getStatusList(Identifier clientIdentifier) throws XTAWSTechnicalProblemException, PermissionDeniedException { + return service.getStatusList(clientIdentifier, config.getMaxListItems()); } - public XtaMessage getMessage(XtaMessageId messageId) { + Identifier deriveIdentifier(String xtaIdentifier) { + return Identifier.builder().value(xtaIdentifier).build(); + } + + public XtaMessage getMessage(String messageId) { throw new NotImplementedException(""); } - public void close(XtaMessageId messageId) { + public void close(String messageId) { throw new NotImplementedException(""); } } diff --git a/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java b/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java index 4c9659d..1421e3d 100644 --- a/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java +++ b/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java @@ -8,6 +8,7 @@ import org.mapstruct.Mapping; import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; +import de.ozgcloud.xta.client.model.Identifier; import de.ozgcloud.xta.client.model.XtaMessageMetaData; import de.ozgcloud.xta.client.model.XtaMessageMetaDataAndHeader; import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType; @@ -22,15 +23,15 @@ import genv3.eu.osci.ws.x2014.x10.transport.PartyType; ) public interface WebServiceTypeMapper { - String IDENTIFIER_CATEGORY = "xoev"; + String IDENTIFIER_TYPE = "xoev"; @Mapping(target = "securityToken", ignore = true) - PartyType mapPartyTypeFromIdentifierString(String identifier); + PartyType mapPartyTypeFromIdentifier(Identifier identifier); - @Mapping(target = "type", ignore = true) - @Mapping(target = "name", ignore = true) - @Mapping(target = "category", constant = IDENTIFIER_CATEGORY) - PartyIdentifierType mapPartyIdentifierTypeFromIdentifierString(String value); + @Mapping(target = "type", constant = IDENTIFIER_TYPE) + PartyIdentifierType mapPartyIdentifierTypeFromIdentifier(Identifier value); + + Identifier mapIdentifierFromPartyIdentifierType(PartyIdentifierType partyIdentifierType); @Mapping(target = "maxListItems", source = "maxListItems") @Mapping(target = "listForm", constant = "MessageMetaData") @@ -41,8 +42,13 @@ public interface WebServiceTypeMapper { @Mapping(target = "messages", source = "msgStatusListType.messageMetaData") XtaMessageMetaDataAndHeader mapXtaMessageMetaDataAndHeader(MsgStatusListType msgStatusListType, MsgBoxResponseType response); + @Mapping(target = "service", source = "qualifier.service") + @Mapping(target = "businessScenarioCode", source = "qualifier.businessScenario.defined.code") + @Mapping(target = "messageTypeCode", source = "qualifier.messageType.code") + @Mapping(target = "messageTypePayloadSchema", source = "qualifier.messageType.payloadSchema") @Mapping(target = "messageId", source = "msgIdentification.messageID.value") - @Mapping(target = "messageType", source = "qualifier.messageType.code") + @Mapping(target = "authorIdentifier", source = "originators.author.identifier") + @Mapping(target = "readerIdentifier", source = "destinations.reader.identifier") XtaMessageMetaData mapXtaMessageMetaData(MessageMetaData messageMetaData); @Named("mapMoreMessagesAvailable") diff --git a/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java b/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java index 09d82e4..cc9338a 100644 --- a/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java +++ b/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java @@ -2,6 +2,8 @@ package de.ozgcloud.xta.client.core; import jakarta.xml.ws.Holder; +import de.ozgcloud.xta.client.model.Identifier; +import de.ozgcloud.xta.client.model.XtaMessage; import de.ozgcloud.xta.client.model.XtaMessageMetaDataAndHeader; import genv3.de.xoev.transport.xta.x211.PermissionDeniedException; import genv3.de.xoev.transport.xta.x211.XTAService; @@ -19,19 +21,23 @@ public class WrappedXtaService { private final XTAService service; private final WebServiceTypeMapper typeMapper; - public void checkAccountActive(String clientIdentifier) throws XTAWSTechnicalProblemException, PermissionDeniedException { - service.getManagementPort().checkAccountActive(typeMapper.mapPartyTypeFromIdentifierString(clientIdentifier)); + public void checkAccountActive(Identifier clientIdentifier) throws XTAWSTechnicalProblemException, PermissionDeniedException { + service.getManagementPort().checkAccountActive(typeMapper.mapPartyTypeFromIdentifier(clientIdentifier)); } - public XtaMessageMetaDataAndHeader getStatusList(String clientIdentifier, int maxListItems) + public XtaMessageMetaDataAndHeader getStatusList(Identifier clientIdentifier, int maxListItems) throws XTAWSTechnicalProblemException, PermissionDeniedException { final Holder<MsgBoxResponseType> fetchResponseHeader = new Holder<>(); var msgStatusListType = service.getMsgBoxPort().getStatusList( typeMapper.mapMsgBoxStatusListRequestTypeFromMaxListItems(maxListItems), - typeMapper.mapPartyTypeFromIdentifierString(clientIdentifier), + typeMapper.mapPartyTypeFromIdentifier(clientIdentifier), fetchResponseHeader ); return typeMapper.mapXtaMessageMetaDataAndHeader(msgStatusListType, fetchResponseHeader.value); } + public void sendMessage(XtaMessage message) { + // service.getSendXtaPort().sendMessage(); + } + } diff --git a/src/main/java/de/ozgcloud/xta/client/model/Identifier.java b/src/main/java/de/ozgcloud/xta/client/model/Identifier.java new file mode 100644 index 0000000..3f7ac42 --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/client/model/Identifier.java @@ -0,0 +1,14 @@ +package de.ozgcloud.xta.client.model; + +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotEmpty; + +import lombok.Builder; + +@Builder +public record Identifier( + @Nullable String name, + @Nullable String category, + @NotEmpty String value +) { +} diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java b/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java index 1469b74..8305627 100644 --- a/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java +++ b/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java @@ -1,14 +1,14 @@ package de.ozgcloud.xta.client.model; -import java.io.File; import java.math.BigInteger; import lombok.Builder; @Builder -public record XtaFile(File file, +public record XtaFile( + byte[] content, String contentType, String name, - BigInteger size) { - + BigInteger size +) { } diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java b/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java index 4d76aac..5fa1865 100644 --- a/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java +++ b/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java @@ -1,15 +1,13 @@ package de.ozgcloud.xta.client.model; -import java.util.Collection; +import java.util.List; import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -@Builder(toBuilder = true) -@Getter -public class XtaMessage { - private XtaMessageMetaData metaData; - @Singular - private Collection<XtaFile> messageFiles; +@Builder +public record XtaMessage( + XtaMessageMetaData metaData, + XtaFile messageFile, + List<XtaFile> attachments +) { } diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaMessageId.java b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageId.java deleted file mode 100644 index 8c65706..0000000 --- a/src/main/java/de/ozgcloud/xta/client/model/XtaMessageId.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.xta.client.model; - -import de.ozgcloud.common.datatype.StringBasedValue; - -public class XtaMessageId extends StringBasedValue { - - public XtaMessageId(String messageId) { - super(messageId); - } - - public static XtaMessageId from(String messageId) { - return new XtaMessageId(messageId); - } -} diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaMessageMetaData.java b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageMetaData.java index 80f87a2..47fd5b0 100644 --- a/src/main/java/de/ozgcloud/xta/client/model/XtaMessageMetaData.java +++ b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageMetaData.java @@ -4,7 +4,12 @@ import lombok.Builder; @Builder public record XtaMessageMetaData( + String service, + String businessScenarioCode, + String messageTypeCode, + String messageTypePayloadSchema, String messageId, - String messageType + Identifier authorIdentifier, + Identifier readerIdentifier ) { } diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java b/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java index 9be6dc7..1a9e692 100644 --- a/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java +++ b/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java @@ -16,11 +16,17 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import de.ozgcloud.xta.client.config.XtaClientConfig; +import de.ozgcloud.xta.client.model.Identifier; import lombok.SneakyThrows; public class XtaClientConfigTestFactory { - public static final String SELF_IDENTIFIER = "selfIdentifier"; + public static final String SELF_IDENTIFIER_VALUE = "selfIdentifier"; + public static final Identifier SELF_IDENTIFIER = Identifier.builder() + .value(SELF_IDENTIFIER_VALUE) + .category("xoev") + .name("Generic Name") + .build(); public static final int MAX_LIST_ITEMS = 10; static final String SELF_IDENTIFIER2 = "selfIdentifier2"; @@ -45,7 +51,7 @@ public class XtaClientConfigTestFactory { .managementServiceUrl(MANAGEMENT_PORT_SVC) .sendServiceUrl(SEND_PORT_SVC) .msgBoxServiceUrl(MSG_BOX_PORT_SVC) - .clientIdentifiers(List.of(SELF_IDENTIFIER, SELF_IDENTIFIER2)) + .clientIdentifiers(List.of(SELF_IDENTIFIER_VALUE, SELF_IDENTIFIER2)) .maxListItems(MAX_LIST_ITEMS) .logSoapRequests(true) .logSoapResponses(true) diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java index 2afffd6..9c96be1 100644 --- a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java +++ b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import de.ozgcloud.xta.client.config.XtaClientConfig; @@ -27,6 +28,7 @@ class XtaClientTest { @Mock private XtaClientConfig config; + @Spy @InjectMocks private XtaClient client; @@ -40,6 +42,7 @@ class XtaClientTest { @BeforeEach @SneakyThrows void mock() { + doReturn(SELF_IDENTIFIER).when(client).deriveIdentifier(SELF_IDENTIFIER_VALUE); when(service.getStatusList(SELF_IDENTIFIER, MAX_LIST_ITEMS)).thenReturn(xtaMessageMetaDataAndHeader); when(config.getMaxListItems()).thenReturn(MAX_LIST_ITEMS); } @@ -48,7 +51,7 @@ class XtaClientTest { @Test @SneakyThrows void shouldCallCheckAccountActive() { - client.getMessagesMetadata(SELF_IDENTIFIER); + client.getMessagesMetadata(SELF_IDENTIFIER_VALUE); verify(service).checkAccountActive(SELF_IDENTIFIER); } @@ -57,7 +60,7 @@ class XtaClientTest { @Test @SneakyThrows void shouldReturnGetStatusListResponse() { - var result = client.getMessagesMetadata(SELF_IDENTIFIER); + var result = client.getMessagesMetadata(SELF_IDENTIFIER_VALUE); assertThat(result).isEqualTo(xtaMessageMetaDataAndHeader); } @@ -74,6 +77,7 @@ class XtaClientTest { @BeforeEach @SneakyThrows void mock() { + doReturn(SELF_IDENTIFIER).when(client).deriveIdentifier(SELF_IDENTIFIER_VALUE); when(service.getStatusList(SELF_IDENTIFIER, MAX_LIST_ITEMS)).thenReturn(xtaMessageMetaDataAndHeader); when(config.getMaxListItems()).thenReturn(MAX_LIST_ITEMS); } @@ -82,10 +86,23 @@ class XtaClientTest { @Test @SneakyThrows void shouldReturnGetStatusListResponse() { - var result = client.getNextMessagesMetadata(SELF_IDENTIFIER); + var result = client.getNextMessagesMetadata(SELF_IDENTIFIER_VALUE); assertThat(result).isEqualTo(xtaMessageMetaDataAndHeader); } } + @DisplayName("derive identifier") + @Nested + class TestDeriveIdentifier { + + @DisplayName("should use value") + @Test + void shouldUseValue() { + var result = client.deriveIdentifier(SELF_IDENTIFIER_VALUE); + + assertThat(result.value()).isEqualTo(SELF_IDENTIFIER_VALUE); + } + } + } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java b/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java index b418715..fb2047f 100644 --- a/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java @@ -16,6 +16,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import de.ozgcloud.xta.client.model.XtaMessageMetaData; import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType; import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType; +import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; @ExtendWith(MockitoExtension.class) class WebServiceTypeMapperTest { @@ -23,24 +24,46 @@ class WebServiceTypeMapperTest { @InjectMocks private WebServiceTypeMapperImpl mapper; - @DisplayName("map party type from identifier string") + @DisplayName("map party type from identifier") @Nested - class TestMapPartyTypeFromIdentifierString { + class TestMapPartyTypeFromIdentifier { - @DisplayName("should use identifier") + @DisplayName("should use value") @Test - void shouldUseIdentifier() { - var result = mapper.mapPartyTypeFromIdentifierString(SELF_IDENTIFIER); + void shouldUseValue() { + var result = mapPartyIdentifier(); - assertThat(result.getIdentifier().getValue()).isEqualTo(SELF_IDENTIFIER); + assertThat(result.getValue()).isEqualTo(SELF_IDENTIFIER.value()); } - @DisplayName("should use xoev category") + @DisplayName("should use category") @Test - void shouldUseXoevCategory() { - var result = mapper.mapPartyTypeFromIdentifierString(SELF_IDENTIFIER); + void shouldUseCategory() { + var result = mapPartyIdentifier(); - assertThat(result.getIdentifier().getCategory()).isEqualTo(IDENTIFIER_CATEGORY); + assertThat(result.getCategory()).isEqualTo(SELF_IDENTIFIER.category()); + } + + @DisplayName("should use name") + @Test + void shouldUseName() { + var result = mapPartyIdentifier(); + + assertThat(result.getName()).isEqualTo(SELF_IDENTIFIER.name()); + } + + @DisplayName("should use type") + @Test + void shouldUseType() { + var result = mapPartyIdentifier(); + + assertThat(result.getType()).isEqualTo(IDENTIFIER_TYPE); + } + + private PartyIdentifierType mapPartyIdentifier() { + var result = mapper.mapPartyTypeFromIdentifier(SELF_IDENTIFIER); + + return result.getIdentifier(); } } @@ -111,7 +134,7 @@ class WebServiceTypeMapperTest { msgStatusListType, msgBoxResponseTypeWithPendingMessages); var messageTypes = result.messages().stream() - .map(XtaMessageMetaData::messageType) + .map(XtaMessageMetaData::messageTypeCode) .toList(); assertThat(messageTypes).containsExactly(MESSAGE_TYPE, MESSAGE_TYPE2, MESSAGE_TYPE3); } diff --git a/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java b/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java index 10e58ea..0d5e8bf 100644 --- a/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java +++ b/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java @@ -50,7 +50,7 @@ class WrappedXtaServiceTest { @BeforeEach void mock() { when(rawService.getManagementPort()).thenReturn(managementPortType); - when(typeMapper.mapPartyTypeFromIdentifierString(SELF_IDENTIFIER)).thenReturn(partyType); + when(typeMapper.mapPartyTypeFromIdentifier(SELF_IDENTIFIER)).thenReturn(partyType); } @DisplayName("should call raw service method") @@ -88,7 +88,7 @@ class WrappedXtaServiceTest { @SneakyThrows void mock() { when(rawService.getMsgBoxPort()).thenReturn(msgBoxPortType); - when(typeMapper.mapPartyTypeFromIdentifierString(SELF_IDENTIFIER)).thenReturn(partyType); + when(typeMapper.mapPartyTypeFromIdentifier(SELF_IDENTIFIER)).thenReturn(partyType); when(typeMapper.mapMsgBoxStatusListRequestTypeFromMaxListItems(MAX_LIST_ITEMS)) .thenReturn(msgBoxStatusListRequestType); when(msgBoxPortType.getStatusList(eq(msgBoxStatusListRequestType), eq(partyType), any())) -- GitLab