Skip to content
Snippets Groups Projects
Commit 89434183 authored by Jan Zickermann's avatar Jan Zickermann
Browse files

KOP-2149 sendMessage: Implement sending and support undefined businessScenarios

parent 4af09284
No related branches found
No related tags found
No related merge requests found
Showing
with 237 additions and 23 deletions
package de.ozgcloud.xta.client;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import de.ozgcloud.xta.client.config.XtaClientConfig;
import de.ozgcloud.xta.client.core.WrappedXtaService;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import de.ozgcloud.xta.client.model.XtaMessage;
import de.ozgcloud.xta.client.model.XtaMessageAndTransportReport;
import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
import de.ozgcloud.xta.client.model.XtaTransportReport;
import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
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.SyncAsyncException;
import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
import lombok.AccessLevel;
import lombok.Builder;
......@@ -74,6 +81,29 @@ public class XtaClient {
.build();
}
public XtaTransportReport sendMessage(@Valid XtaMessage messageWithoutMessageId)
throws XTAWSTechnicalProblemException, PermissionDeniedException, InvalidMessageIDException, SyncAsyncException,
MessageVirusDetectionException, MessageSchemaViolationException, ParameterIsNotValidException {
var metaData = messageWithoutMessageId.metaData();
var authorIdentifier = metaData.authorIdentifier();
service.checkAccountActive(authorIdentifier);
service.lookupService(metaData.service(), metaData.readerIdentifier(), authorIdentifier);
var messageId = service.createMessageId(authorIdentifier);
service.sendMessage(createXtaMessageWithMessageId(messageWithoutMessageId, messageId));
return service.getTransportReport(messageId, authorIdentifier);
}
XtaMessage createXtaMessageWithMessageId(XtaMessage messageWithoutMessageId, String messageId) {
return messageWithoutMessageId.toBuilder()
.metaData(messageWithoutMessageId.metaData().toBuilder()
.messageId(messageId)
.build())
.build();
}
XtaIdentifier deriveIdentifier(String xtaIdentifier) {
return config.getClientIdentifiers().stream()
.filter(id -> id.value().equals(xtaIdentifier))
......
......@@ -3,10 +3,11 @@ package de.ozgcloud.xta.client.mapper;
import org.apache.cxf.ws.addressing.AttributedURIType;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.mapstruct.ReportingPolicy;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import de.ozgcloud.xta.client.model.XtaFile;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import de.ozgcloud.xta.client.model.XtaMessage;
import de.ozgcloud.xta.client.model.XtaMessageMetaData;
import genv3.de.xoev.transport.xta.x211.ContentType;
......@@ -16,6 +17,7 @@ import genv3.de.xoev.transport.xta.x211.LookupServiceType;
import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxCloseRequestType;
import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest;
import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType;
import genv3.eu.osci.ws.x2014.x10.transport.KeyCodeType;
import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType;
import genv3.eu.osci.ws.x2014.x10.transport.PartyType;
......@@ -25,11 +27,8 @@ import genv3.eu.osci.ws.x2014.x10.transport.QualifierType;
unmappedTargetPolicy = ReportingPolicy.ERROR
)
public interface RequestMapper {
String BUSINESS_SCENARIO_LIST_URI = "urn:de:dataport:codeliste:business.scenario";
String MESSAGE_TYPE_LIST_URI = "urn:de:payloadSchema:elementName";
String MESSAGE_TYPE_LIST_VERSION_ID = "1.0";
String BUSINESS_SCENARIO_LIST_VERSION_ID = "1";
String IDENTIFIER_TYPE = "xoev";
String CLOSE_REQUEST_ID = "1";
......@@ -44,9 +43,7 @@ public interface RequestMapper {
@Mapping(target = "msgSelector", ignore = true)
MsgBoxStatusListRequestType mapMsgBoxStatusListRequestTypeFromMaxListItems(Integer maxListItems);
@Mapping(target = "qualifier.service", source = "service")
@Mapping(target = "qualifier.businessScenario", source = "businessScenarioCode")
@Mapping(target = "qualifier.messageType", source = ".")
@Mapping(target = "qualifier", source = ".")
@Mapping(target = "msgIdentification.messageID.value", source = "messageId")
@Mapping(target = "originators.author.identifier", source = "authorIdentifier")
@Mapping(target = "destinations.reader.identifier", source = "readerIdentifier")
......@@ -56,19 +53,6 @@ public interface RequestMapper {
@Mapping(target = "messageProperties", ignore = true)
MessageMetaData mapMessageMetaDataFromXtaMessageMetaData(XtaMessageMetaData xtaMessageMetaData);
@Mapping(target = "code", source = "messageTypeCode")
@Mapping(target = "name", ignore = true)
@Mapping(target = "payloadSchema", source = "messageTypePayloadSchema")
@Mapping(target = "listURI", constant = MESSAGE_TYPE_LIST_URI)
@Mapping(target = "listVersionID", constant = MESSAGE_TYPE_LIST_VERSION_ID)
QualifierType.MessageType mapMessageTypeQualifierType(XtaMessageMetaData xtaMessageMetaData);
@Mapping(target = "undefined", ignore = true)
@Mapping(target = "defined.code", source = "code")
@Mapping(target = "defined.listURI", constant = BUSINESS_SCENARIO_LIST_URI)
@Mapping(target = "defined.listVersionID", constant = BUSINESS_SCENARIO_LIST_VERSION_ID)
QualifierType.BusinessScenario mapBusinessScenarioQualifierType(String code);
@Mapping(target = "encryptedData", expression = "java(null)")
@Mapping(target = "contentContainer.message", source = "messageFile")
@Mapping(target = "contentContainer.attachment", source = "attachmentFiles")
......@@ -97,4 +81,38 @@ public interface RequestMapper {
@Mapping(target = "msgSelector.messageID", expression = "java( List.of( mapAttributedURIType(string) ) )")
@Mapping(target = "msgPart", ignore = true)
MsgBoxFetchRequest mapMsgBoxFetchRequest(String messageId);
@Mapping(target = "subject", ignore = true)
@Mapping(target = "messageType", source = ".")
@Mapping(target = "businessScenario", source = ".", qualifiedByName = "mapBusinessScenario")
QualifierType mapQualifierType(XtaMessageMetaData messageMetaData);
@Mapping(target = "code", source = "messageTypeCode")
@Mapping(target = "name", ignore = true)
@Mapping(target = "payloadSchema", source = "messageTypePayloadSchema")
@Mapping(target = "listURI", constant = MESSAGE_TYPE_LIST_URI)
@Mapping(target = "listVersionID", constant = MESSAGE_TYPE_LIST_VERSION_ID)
QualifierType.MessageType mapQualifierTypeMessageType(XtaMessageMetaData messageMetaData);
@Named("mapBusinessScenario")
default QualifierType.BusinessScenario mapBusinessScenario(XtaMessageMetaData messageMetaData) {
return messageMetaData.businessScenarioListUri() != null
? mapDefinedBusinessScenario(messageMetaData)
: mapUndefinedBusinessScenario(messageMetaData);
}
@Mapping(target = "defined", expression = "java(null)")
@Mapping(target = "undefined", source = "businessScenarioCode")
QualifierType.BusinessScenario mapUndefinedBusinessScenario(XtaMessageMetaData messageMetaData);
@Mapping(target = "defined", source = ".", qualifiedByName = "mapDefinedBusinessScenarioCode")
@Mapping(target = "undefined", expression = "java(null)")
QualifierType.BusinessScenario mapDefinedBusinessScenario(XtaMessageMetaData messageMetaData);
@Named("mapDefinedBusinessScenarioCode")
@Mapping(target = "code", source = "businessScenarioCode")
@Mapping(target = "name", ignore = true)
@Mapping(target = "listURI", source = "businessScenarioListUri")
@Mapping(target = "listVersionID", source = "businessScenarioListVersionId")
KeyCodeType mapDefinedBusinessScenarioCode(XtaMessageMetaData messageMetaData);
}
......@@ -41,6 +41,8 @@ public interface ResponseMapper {
@Mapping(target = "service", source = "qualifier.service")
@Mapping(target = "businessScenarioCode", source = "qualifier.businessScenario.defined.code")
@Mapping(target = "businessScenarioListUri", source = "qualifier.businessScenario.defined.listURI")
@Mapping(target = "businessScenarioListVersionId", source = "qualifier.businessScenario.defined.listVersionID")
@Mapping(target = "messageTypeCode", source = "qualifier.messageType.code")
@Mapping(target = "messageTypePayloadSchema", source = "qualifier.messageType.payloadSchema")
@Mapping(target = "messageId", source = "msgIdentification.messageID.value")
......
......@@ -2,6 +2,7 @@ package de.ozgcloud.xta.client.model;
import java.math.BigInteger;
import jakarta.annotation.Nullable;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
......@@ -13,9 +14,11 @@ import lombok.Builder;
public record XtaMessageMetaData(
@NotBlank String service,
@NotBlank String businessScenarioCode,
@Nullable String businessScenarioListUri,
@Nullable String businessScenarioListVersionId,
@NotBlank String messageTypeCode,
@NotBlank String messageTypePayloadSchema,
@NotBlank String messageId,
@Nullable String messageId,
@NotNull @Valid XtaIdentifier authorIdentifier,
@NotNull @Valid XtaIdentifier readerIdentifier,
@PositiveOrZero BigInteger messageSize
......
......@@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.api.extension.RegisterExtension;
import de.ozgcloud.xta.client.model.XtaMessage;
import de.ozgcloud.xta.client.model.XtaMessageStatus;
import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
import lombok.SneakyThrows;
......@@ -120,5 +121,27 @@ class XtaClientManualITCase {
}
@DisplayName("send message")
@Nested
class TestSendMessage {
private final XtaMessage xtaMessage = XtaMessageExampleLoader.load(
XtaMessageExampleLoader.MessageExampleConfig.builder()
.messageLabel("dfoerdermittel")
.messageId(null)
.author(CLIENT_IDENTIFIER1)
.reader(CLIENT_IDENTIFIER1)
.build());
@DisplayName("should return with open status")
@Test
@SneakyThrows
void shouldReturn() {
var result = client.sendMessage(xtaMessage);
assertThat(result.status()).isEqualTo(XtaMessageStatus.OPEN);
}
}
}
......@@ -19,7 +19,9 @@ import org.mockito.junit.jupiter.MockitoExtension;
import de.ozgcloud.xta.client.config.XtaClientConfig;
import de.ozgcloud.xta.client.core.WrappedXtaService;
import de.ozgcloud.xta.client.factory.XtaMessageTestFactory;
import de.ozgcloud.xta.client.model.XtaMessage;
import de.ozgcloud.xta.client.model.XtaMessageMetaData;
import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
import de.ozgcloud.xta.client.model.XtaTransportReport;
import lombok.SneakyThrows;
......@@ -168,4 +170,86 @@ class XtaClientTest {
}
}
@DisplayName("send message")
@Nested
class TestSendMessage {
@Mock
XtaMessage xtaMessageWithoutMessageId;
@Mock
XtaMessageMetaData xtaMessageMetaDataWithoutMessageId;
@Mock
XtaMessage xtaMessage;
@Mock
XtaTransportReport xtaTransportReport;
@BeforeEach
@SneakyThrows
void mock() {
when(xtaMessageWithoutMessageId.metaData()).thenReturn(xtaMessageMetaDataWithoutMessageId);
when(xtaMessageMetaDataWithoutMessageId.authorIdentifier()).thenReturn(AUTHOR_IDENTIFIER);
when(xtaMessageMetaDataWithoutMessageId.readerIdentifier()).thenReturn(READER_IDENTIFIER);
when(xtaMessageMetaDataWithoutMessageId.service()).thenReturn(MESSAGE_SERVICE);
when(service.createMessageId(AUTHOR_IDENTIFIER)).thenReturn(MESSAGE_ID);
doReturn(xtaMessage).when(client).createXtaMessageWithMessageId(xtaMessageWithoutMessageId, MESSAGE_ID);
when(service.getTransportReport(MESSAGE_ID, AUTHOR_IDENTIFIER)).thenReturn(xtaTransportReport);
}
@DisplayName("should call checkAccountActive")
@Test
@SneakyThrows
void shouldCallCheckAccountActive() {
client.sendMessage(xtaMessageWithoutMessageId);
verify(service).checkAccountActive(AUTHOR_IDENTIFIER);
}
@DisplayName("should call lookup service")
@Test
@SneakyThrows
void shouldCallLookupService() {
client.sendMessage(xtaMessageWithoutMessageId);
verify(service).lookupService(MESSAGE_SERVICE, READER_IDENTIFIER, AUTHOR_IDENTIFIER);
}
@DisplayName("should call send message")
@Test
@SneakyThrows
void shouldCallSendMessage() {
client.sendMessage(xtaMessageWithoutMessageId);
verify(service).sendMessage(xtaMessage);
}
@DisplayName("should return with transport report")
@Test
@SneakyThrows
void shouldReturnWithTransportReport() {
var result = client.sendMessage(xtaMessageWithoutMessageId);
assertThat(result).isEqualTo(xtaTransportReport);
}
}
@DisplayName("create xta message with message id")
@Nested
class TestCreateXtaMessageWithMessageId {
private final XtaMessage xtaMessage = XtaMessageTestFactory.create();
@DisplayName("should set message id")
@Test
void shouldSetMessageId() {
var NEW_MESSAGE_ID = "newMessageId";
var result = client.createXtaMessageWithMessageId(xtaMessage, NEW_MESSAGE_ID);
assertThat(result.metaData().messageId()).isEqualTo(NEW_MESSAGE_ID);
}
}
}
\ No newline at end of file
......@@ -25,8 +25,8 @@ import org.apache.commons.io.IOUtils;
import org.jetbrains.annotations.NotNull;
import org.yaml.snakeyaml.Yaml;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import de.ozgcloud.xta.client.model.XtaFile;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import de.ozgcloud.xta.client.model.XtaMessage;
import de.ozgcloud.xta.client.model.XtaMessageMetaData;
import lombok.Builder;
......@@ -112,10 +112,12 @@ public class XtaMessageExampleLoader {
return XtaMessageMetaData.builder()
.service(getString.apply("service"))
.businessScenarioCode(getString.apply("businessScenarioCode"))
.businessScenarioListUri(getString.apply("businessScenarioListUri"))
.businessScenarioListVersionId(getString.apply("businessScenarioListVersionId"))
.messageTypeCode(getString.apply("messageTypeCode"))
.messageTypePayloadSchema(getString.apply("messageTypePayloadSchema"))
.messageId(getIfConfigNull(
config.messageId, () -> getString.apply("messageId")))
config.messageId, () -> MapUtils.getString(metaData, "messageId")))
.authorIdentifier(getIfConfigNull(
config.author,
() -> mapIdentifier(getChild(metaData, "authorIdentifier"))))
......
......@@ -183,6 +183,34 @@ class RequestMapperTest {
mapper.mapPartyIdentifierTypeFromIdentifier(READER_IDENTIFIER));
}
@DisplayName("with undefined business scenario")
@Nested
class TestWithUndefinedBusinessScenario {
@DisplayName("should map code")
@Test
void shouldMapCode() {
var result = mapWithUndefinedBusinessScenario();
assertThat(result.getQualifier().getBusinessScenario().getUndefined()).isEqualTo(BUSINESS_SCENARIO_CODE);
}
@DisplayName("should map defined to null")
@Test
void shouldMapDefinedToNull() {
var result = mapWithUndefinedBusinessScenario();
assertThat(result.getQualifier().getBusinessScenario().getDefined()).isNull();
}
private MessageMetaData mapWithUndefinedBusinessScenario() {
var metaData = XtaMessageMetaDataTestFactory.createBuilder()
.businessScenarioListUri(null)
.build();
return mapper.mapMessageMetaDataFromXtaMessageMetaData(metaData);
}
}
private MessageMetaData map() {
return mapper.mapMessageMetaDataFromXtaMessageMetaData(XtaMessageMetaDataTestFactory.create());
}
......
......@@ -134,6 +134,22 @@ class ResponseMapperTest {
assertThat(result.businessScenarioCode()).isEqualTo(BUSINESS_SCENARIO_CODE);
}
@DisplayName("should map business scenario list uri")
@Test
void shouldMapBusinessScenarioListUri() {
var result = doMapping();
assertThat(result.businessScenarioListUri()).isEqualTo(BUSINESS_SCENARIO_LIST_URI);
}
@DisplayName("should map business scenario list version id")
@Test
void shouldMapBusinessScenarioListVersionId() {
var result = doMapping();
assertThat(result.businessScenarioListVersionId()).isEqualTo(BUSINESS_SCENARIO_LIST_VERSION_ID);
}
@DisplayName("should map message type payload schema")
@Test
void shouldMapMessageTypePayloadSchema() {
......
......@@ -14,6 +14,8 @@ public class MessageMetaDataTestFactory {
public static final String MESSAGE_TYPE_PAYLOAD_SCHEMA = "message-type-payload-schema";
public static final String BUSINESS_SCENARIO_CODE = "businessScenarioCode";
public static final String BUSINESS_SCENARIO_LIST_URI = "urn:de:dataport:codeliste:business.scenario";
public static final String BUSINESS_SCENARIO_LIST_VERSION_ID = "1.0";
public static final XtaIdentifier AUTHOR_IDENTIFIER = XtaIdentifier.builder()
.value("authorIdentifier")
......
......@@ -14,6 +14,8 @@ public class XtaMessageMetaDataTestFactory {
return XtaMessageMetaData.builder()
.service(MESSAGE_SERVICE)
.businessScenarioCode(BUSINESS_SCENARIO_CODE)
.businessScenarioListUri(BUSINESS_SCENARIO_LIST_URI)
.businessScenarioListVersionId(BUSINESS_SCENARIO_LIST_VERSION_ID)
.messageTypeCode(MESSAGE_TYPE_CODE)
.messageTypePayloadSchema(MESSAGE_TYPE_PAYLOAD_SCHEMA)
.messageId(MESSAGE_ID)
......
metaData:
service: urn:xoev-de:xdomea:schema:2.4.0/xdomea240Antrag.wsdl
businessScenarioCode: XDOMEAGAD_DATA
businessScenarioListUri: urn:de:dataport:codeliste:business.scenario
businessScenarioListVersionId: 1.0
messageTypeCode: Geschaeftsgang.Geschaeftsgang.0201
messageTypePayloadSchema: urn:xoev-de:xdomea:schema:2.4.0
authorIdentifier:
......
......@@ -3,6 +3,8 @@ metaData:
businessScenarioCode: FIM_DATA
messageTypeCode: fim.S17000652.17000652001004
messageTypePayloadSchema: urn:xoev-de:xfall:standard:fim-s17000652_1.4
businessScenarioListUri: urn:de:dataport:codeliste:business.scenario
businessScenarioListVersionId: 1
authorIdentifier:
name: Dataport
category: Engagement- und Hobbyportal
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment