diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java index afcf35c837babee45c7d4bd1c818cad79faed75e..2579d41f3b1eafc5bcb9672cebdcc07147c5a7ae 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java +++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java @@ -1,7 +1,5 @@ package de.ozgcloud.xta.test.app.mapper; -import static de.ozgcloud.xta.test.app.model.XtaConstants.*; - import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; @@ -19,6 +17,15 @@ import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemExceptionType; ) public interface ExceptionMapper { + String ERROR_CODE_LIST_URN = "urn:de:xta:webservice:codeliste:fehlernummer"; + String ERROR_CODE_LIST_VERSION = "2.0.0"; + String ERROR_CODE_PARAMETER_MISSING = "9020"; + String ERROR_CODE_PARAMETER_MISSING_DESCRIPTION = "Notwendige Parameter nicht vorhanden"; + String ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM = "9030"; + String ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM_DESCRIPTION = "Interner Fehler beim XTA-Server bzw. XTA-Dienstleister"; + String ERROR_CODE_MESSAGE_ID_UNKNOWN = "9070"; + String ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION = "MessageID für den Account nicht bekannt"; + default InvalidMessageIDException createInvalidMessageIDException(String message) { return new InvalidMessageIDException( message, diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java index aa8bf819de6770c9b65867e5ac29571409f1e7b1..c7608a297f104f34e079b714b95687f30a91b2c4 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java +++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java @@ -27,7 +27,6 @@ import de.ozgcloud.xta.test.app.model.XtaLookupServiceRequest; import de.ozgcloud.xta.test.app.model.XtaMessage; import de.ozgcloud.xta.test.app.model.XtaMessageMetaData; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; -import de.ozgcloud.xta.test.app.util.XtaIdGenerator; import genv3.de.xoev.transport.xta.x211.ContentType; import genv3.de.xoev.transport.xta.x211.GenericContentContainer; import genv3.de.xoev.transport.xta.x211.LookupServiceResponse; @@ -133,14 +132,10 @@ public interface ResponseMapper { return DatatypeFactory.newInstance().newXMLGregorianCalendar(isoTimeString); } - default MsgBoxResponseType createGetMessageResponseHeader(XtaIdGenerator xtaIdGenerator) { - return mapMsgBoxResponseTypeFromRequestID(xtaIdGenerator.generateRequestId().toString()); - } - @Mapping(target = "itemsPending", expression = "java( BigInteger.ZERO )") @Mapping(target = "msgBoxRequestID", source = "requestId") @Mapping(target = "noMessageAvailable", expression = "java( null )") - MsgBoxResponseType mapMsgBoxResponseTypeFromRequestID(String requestId); + MsgBoxResponseType mapMsgBoxResponseTypeFromRequestId(String requestId); @Mapping(target = "itemsPending", source = "pendingMessageCount") @Mapping(target = "msgBoxRequestID", constant = REQUEST_ID) @@ -182,10 +177,6 @@ public interface ResponseMapper { @Mapping(target = "lookupServiceResultList.lookupServiceResult", expression = "java( List.of( mapLookupServiceResultType(xtaLookupServiceRequest) ) )") LookupServiceResponse mapLookupServiceResponse(XtaLookupServiceRequest xtaLookupServiceRequest); - default AttributedURIType createCreateMessageIdResponse(XtaIdGenerator xtaIdGenerator) { - return mapCreateMessageIdResponse(xtaIdGenerator.generateMessageId().toString()); - } - @Mapping(target = "otherAttributes", ignore = true) AttributedURIType mapCreateMessageIdResponse(String value); } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java index a08804dd283b60d4e3905590c38992bde7375a31..627be8ba0a8bd336a430c316bcc329218901b402 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java @@ -1,14 +1,16 @@ package de.ozgcloud.xta.test.app.model; +import static de.ozgcloud.xta.test.app.validation.ValidXtaId.*; + import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId; +import de.ozgcloud.xta.test.app.validation.ValidXtaId; import lombok.Builder; @Builder public record XtaCloseRequest( - @ValidXtaMessageId String messageId, + @ValidXtaId(namespace = MESSAGE_ID_NAMESPACE) String messageId, @NotNull @NotBlank String clientIdentifierValue ) { } 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 deleted file mode 100644 index ce88d0e36cf52d151fd93b2533e4816348347b64..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * @formatter:off - * - * Copyright 2021-2022 Koordinierungsstelle für IT-Standards (KoSIT) - * - * Licensed under the European Public License, Version 1.2 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/EUPL-1.2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * @formatter:on - */ -package de.ozgcloud.xta.test.app.model; - -import javax.xml.namespace.QName; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class XtaConstants { - - public static final String W3_ORG_2005_08_ADDRESSING = "http://www.w3.org/2005/08/addressing"; - - public static final String XTA_211 = "http://xoev.de/transport/xta/211"; - public static final String XTA_ACTION_BASE = "http://www.xta.de/XTA/"; - - public static final String OSCI_2008_05_TRANSPORT = "http://www.osci.eu/ws/2008/05/transport"; - public static final String OSCI_2014_10_TRANSPORT = "http://www.osci.eu/ws/2014/10/transport"; - - public static final String OSCI_2008_05_ACTION_BASE = OSCI_2008_05_TRANSPORT + "/urn/messageTypes/"; - public static final String OSCI_2014_10_ACTION_BASE = OSCI_2014_10_TRANSPORT + "/urn/messageTypes/"; - - /* - * Xml QNames in alphabetic order - */ - - public static final QName ACTION = new QName(W3_ORG_2005_08_ADDRESSING, "Action"); - public static final QName MSG_BOX_RESPONSE = new QName(OSCI_2008_05_TRANSPORT, "MsgBoxResponse"); - public static final QName MESSAGE_META_DATA = new QName(OSCI_2014_10_TRANSPORT, "MessageMetaData"); - public static final QName TO = new QName(W3_ORG_2005_08_ADDRESSING, "To"); - - /* - * Actions in alphabetic order - */ - - public static final String CANCEL_MESSAGE_ACTION = XTA_ACTION_BASE + "CancelMessage"; - public static final String CHECK_ACCOUNT_ACTIVE_ACTION = XTA_ACTION_BASE + "CheckAccountActive"; - public static final String CLOSE_ACTION = OSCI_2008_05_ACTION_BASE + "MsgBoxCloseRequest"; - public static final String CREATE_MESSAGE_ID_ACTION = XTA_ACTION_BASE + "CreateMessageID"; - - public static final String GET_MESSAGE_ACTION = OSCI_2008_05_ACTION_BASE + "MsgBoxFetchRequest"; - public static final String GET_NEXT_MESSAGE_ACTION = OSCI_2008_05_ACTION_BASE + "MsgBoxGetNextMsgRequest"; - public static final String GET_NEXT_STATUS_LIST_ACTION = OSCI_2008_05_ACTION_BASE + "MsgBoxGetNextListRequest"; - public static final String GET_STATUS_LIST_ACTION = OSCI_2008_05_ACTION_BASE + "MsgBoxStatusListRequest"; - public static final String GET_TRANSPORT_REPORT_ACTION = XTA_ACTION_BASE + "GetTransportReport"; - - public static final String LOOKUP_SERVICE_ACTION = XTA_ACTION_BASE + "IsServiceAvailable"; - - 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 = "Notwendige Parameter nicht 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 static final String MESSAGE_ID_PATTERN = "(\\w+):(.+):([^:]+):([^:]+)"; - - public enum ConnectionPortType { - SEND, MSGBOX, MANAGEMENT - } -} diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaFile.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaFile.java index 0a8319c41688eb9133a12e4b7f905f4c02cdbc62..1a824a7cdd277b6b61ffee04a07ed3159dd45b9c 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaFile.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaFile.java @@ -19,6 +19,6 @@ public record XtaFile( @NotBlank String name, @Nullable String id, @Nullable String language, - @PositiveOrZero BigInteger size + @NotNull @PositiveOrZero BigInteger size ) { } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java index 41ad56b586791fcdfbd3386190d09ef552b6f547..c632b5f934e93aa864c83c85e267263cb79bf1c6 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java @@ -1,13 +1,15 @@ package de.ozgcloud.xta.test.app.model; +import static de.ozgcloud.xta.test.app.validation.ValidXtaId.*; + import jakarta.validation.constraints.NotBlank; -import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId; +import de.ozgcloud.xta.test.app.validation.ValidXtaId; import lombok.Builder; @Builder public record XtaGetMessageRequest( - @ValidXtaMessageId String messageId, + @ValidXtaId(namespace = MESSAGE_ID_NAMESPACE) String messageId, @NotBlank String clientIdentifierValue ) { } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java index 32ec4b6d1b1a6d0e9700abb12ef2c48af4a0b196..167a64d0be7ef786c7c5833a460b7898e8c1a96c 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java @@ -1,5 +1,7 @@ package de.ozgcloud.xta.test.app.model; +import static de.ozgcloud.xta.test.app.validation.ValidXtaId.*; + import java.math.BigInteger; import jakarta.annotation.Nullable; @@ -8,7 +10,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PositiveOrZero; -import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId; +import de.ozgcloud.xta.test.app.validation.ValidXtaId; import lombok.Builder; @Builder(toBuilder = true) @@ -20,7 +22,7 @@ public record XtaMessageMetaData( @Nullable String businessScenarioListVersionId, @NotBlank String messageTypeCode, @NotBlank String messageTypePayloadSchema, - @ValidXtaMessageId String messageId, + @ValidXtaId(namespace = MESSAGE_ID_NAMESPACE) String messageId, @NotNull @Valid XtaIdentifier authorIdentifier, @NotNull @Valid XtaIdentifier readerIdentifier, @NotNull @PositiveOrZero BigInteger messageSize diff --git a/src/main/java/de/ozgcloud/xta/test/app/server/ManagementPortImpl.java b/src/main/java/de/ozgcloud/xta/test/app/server/ManagementPortImpl.java index 364f4201b1babc68f5617467c3e391645d59aed6..f709010c81d7020b89103f6d966071af25a83808 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/server/ManagementPortImpl.java +++ b/src/main/java/de/ozgcloud/xta/test/app/server/ManagementPortImpl.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Component; import de.ozgcloud.xta.test.app.mapper.RequestMapper; import de.ozgcloud.xta.test.app.mapper.ResponseMapper; -import de.ozgcloud.xta.test.app.util.XtaIdGenerator; +import de.ozgcloud.xta.test.app.service.XtaMessageService; import genv3.de.xoev.transport.xta.x211.CancelDeniedException; import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException; import genv3.de.xoev.transport.xta.x211.LookupServiceRequest; @@ -28,9 +28,9 @@ import lombok.extern.log4j.Log4j2; @Log4j2 public class ManagementPortImpl implements ManagementPortType { - private final XtaIdGenerator xtaIdGenerator; private final ResponseMapper responseMapper; private final RequestMapper requestMapper; + private final XtaMessageService xtaMessageService; /* * (non-Javadoc) @@ -43,7 +43,9 @@ public class ManagementPortImpl implements ManagementPortType { throws XTAWSTechnicalProblemException, PermissionDeniedException { log.info("Executing operation createMessageId"); - return responseMapper.createCreateMessageIdResponse(xtaIdGenerator); + return responseMapper.mapCreateMessageIdResponse( + xtaMessageService.createMessageId() + ); } /* 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 7b1425446fa176af04cdd1d12dcf2c26f6541fef..8f24819ad20340a542bd2a80cefdadd24d4b6d7f 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 @@ -9,7 +9,6 @@ import de.ozgcloud.xta.test.app.mapper.ExceptionMapper; import de.ozgcloud.xta.test.app.mapper.RequestMapper; import de.ozgcloud.xta.test.app.mapper.ResponseMapper; import de.ozgcloud.xta.test.app.service.XtaMessageService; -import de.ozgcloud.xta.test.app.util.XtaIdGenerator; import de.ozgcloud.xta.test.app.validation.RequestValidator; import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException; import genv3.de.xoev.transport.xta.x211.MsgBoxPortType; @@ -29,7 +28,6 @@ public class MsgBoxPortImpl implements MsgBoxPortType { private final RequestMapper requestMapper; private final ExceptionMapper exceptionMapper; private final ResponseMapper responseMapper; - private final XtaIdGenerator xtaIdGenerator; private final XtaMessageService messageService; /* @@ -55,7 +53,9 @@ public class MsgBoxPortImpl implements MsgBoxPortType { .orElseThrow(() -> createInvalidMessageIdException(request.messageId(), request.clientIdentifierValue())); messageMetaData.value = responseMapper.mapMessageMetaData(message.metaData()); - fetchResponseHeader.value = responseMapper.createGetMessageResponseHeader(xtaIdGenerator); + fetchResponseHeader.value = responseMapper.mapMsgBoxResponseTypeFromRequestId( + messageService.createRequestId() + ); return responseMapper.mapGenericContentContainerFromXtaMessage(message); } diff --git a/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java b/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java index eca4f2f0f31862a79435223340504987035ccff4..e4cffea58c1ea08992ebf16fad475eac22cddf9d 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java +++ b/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java @@ -2,8 +2,12 @@ package de.ozgcloud.xta.test.app.service; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import de.ozgcloud.xta.test.app.data.XtaMessageRepository; @@ -20,6 +24,8 @@ import lombok.RequiredArgsConstructor; public class XtaMessageService { private final XtaMessageRepository messageRepository; + private final Environment environment; + public boolean sendMessage(XtaMessage message) { messageRepository.save(message); return true; @@ -56,4 +62,21 @@ public class XtaMessageService { request.clientIdentifierValue() ); } + + public String createMessageId() { + return generateXtaIdWithNamespace("de:xta:messageid"); + } + + public String createRequestId() { + return generateXtaIdWithNamespace("de:xta:requestid"); + } + + private String generateXtaIdWithNamespace(String namespace) { + return String.join(":", + "urn", + namespace, + environment.getProperty("spring.application.name"), + UUID.randomUUID().toString() + ); + } } diff --git a/src/main/java/de/ozgcloud/xta/test/app/util/XtaId.java b/src/main/java/de/ozgcloud/xta/test/app/util/XtaId.java deleted file mode 100644 index 7ab923459f48656619562b5f29ba93920e96ec68..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/util/XtaId.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * @formatter:off - * - * Copyright 2021-2022 Koordinierungsstelle für IT-Standards (KoSIT) - * - * Licensed under the European Public License, Version 1.2 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/EUPL-1.2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * @formatter:on - */ -package de.ozgcloud.xta.test.app.util; - -import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import lombok.Data; - -@Data -public class XtaId { - - public static final Pattern PATTERN = Pattern.compile("(\\w+):(.+):([^:]+):([^:]+)"); - private final String schema; - private final String namespace; - private final String application; // prefix - private final String uuid; // identifier - - public XtaId(final String schema, final String namespace, final String application, final String uuid) { - this.schema = schema; - this.namespace = namespace; - this.application = application; - this.uuid = uuid; - } - - @Override - public String toString() { - return schema + ":" + namespace + ":" + application + ":" + uuid; - } - - public static Optional<XtaId> parse(final String messageId) { - // page 119; structure: "urn:de:xta:messageid:<Präfix>:<Identifikator>" - Matcher matcher = PATTERN.matcher(messageId); - if (matcher.matches()) { - return Optional - .of(new XtaId(matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4))); - } - return Optional.empty(); - } -} diff --git a/src/main/java/de/ozgcloud/xta/test/app/util/XtaIdGenerator.java b/src/main/java/de/ozgcloud/xta/test/app/util/XtaIdGenerator.java deleted file mode 100644 index cdedee6b37ccdf8fbf032cd582362967437bd4c1..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/util/XtaIdGenerator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * @formatter:off - * - * Copyright 2021-2022 Koordinierungsstelle für IT-Standards (KoSIT) - * - * Licensed under the European Public License, Version 1.2 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/EUPL-1.2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * @formatter:on - */ -package de.ozgcloud.xta.test.app.util; - -import org.springframework.stereotype.Component; - -import java.util.UUID; - -@Component -public class XtaIdGenerator { - - public static final String MESSAGE_ID_NAMESPACE = "de:xta:messageid"; - public static final String REQUEST_ID_NAMESPACE = "de:xta:requestid"; - - public static final String APPLICATION_NAME = "xta-test-server"; - - public XtaId generateMessageId() { - return generateId(MESSAGE_ID_NAMESPACE); - } - - public XtaId generateRequestId() { - return generateId(REQUEST_ID_NAMESPACE); - } - - public XtaId generateId(final String namespace) { - return new XtaId("urn", namespace, APPLICATION_NAME, UUID.randomUUID().toString()); - } -} diff --git a/src/main/java/de/ozgcloud/xta/test/app/util/YamlPropertySourceFactory.java b/src/main/java/de/ozgcloud/xta/test/app/util/YamlPropertySourceFactory.java deleted file mode 100644 index 3828423a6f600f2189ff0baaeb0843491ab8d352..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/util/YamlPropertySourceFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Created 2023-03-24 - */ -package de.ozgcloud.xta.test.app.util; - -import java.io.IOException; -import java.util.Properties; - -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.env.PropertiesPropertySource; -import org.springframework.core.env.PropertySource; -import org.springframework.core.io.support.EncodedResource; -import org.springframework.core.io.support.PropertySourceFactory; - -public class YamlPropertySourceFactory implements PropertySourceFactory { - - @Override - public PropertySource<?> createPropertySource(final String name, final EncodedResource encodedResource) - throws IOException { - if (encodedResource == null) { - throw new IOException("Resource is null"); - } - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - if (!encodedResource.getResource().exists()) { - return new PropertiesPropertySource(name, null); - } - factory.setResources(encodedResource.getResource()); - - Properties properties = factory.getObject(); - - return new PropertiesPropertySource(name, properties); - } -} diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java b/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaId.java similarity index 57% rename from src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java rename to src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaId.java index 72ee404cb14c2e55df32c9c292459b8aa6927922..94bdd31cc9ab0786a25c13b8d97b2930cc14250a 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java +++ b/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaId.java @@ -8,13 +8,21 @@ import java.lang.annotation.Target; import jakarta.validation.Constraint; import jakarta.validation.Payload; -@Constraint(validatedBy = XtaMessageIdValidator.class) -@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER }) // Specify where the annotation can be applied +@Constraint(validatedBy = XtaIdValidator.class) +@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) -public @interface ValidXtaMessageId { - String message() default "Invalid message id"; // Default error message +public @interface ValidXtaId { + String MESSAGE_ID_NAMESPACE = "de:xta:messageid"; + String REQUEST_ID_NAMESPACE = "de:xta:requestid"; + String ANY_NAMESPACE = ".+"; + + String message() default "Invalid xta id"; + + String namespace() default ANY_NAMESPACE; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } + + diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/XtaIdValidator.java b/src/main/java/de/ozgcloud/xta/test/app/validation/XtaIdValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..e5187cdbc98c355cdbc7fbde5a918598bd04e773 --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/test/app/validation/XtaIdValidator.java @@ -0,0 +1,23 @@ +package de.ozgcloud.xta.test.app.validation; + +import java.util.regex.Pattern; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +public class XtaIdValidator implements ConstraintValidator<ValidXtaId, String> { + + private Pattern pattern; + + @Override + public void initialize(ValidXtaId constraintAnnotation) { + pattern = Pattern.compile( + "(\\w+):(" + constraintAnnotation.namespace() + "):([^:]+):([^:]+)" + ); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + return value != null && pattern.matcher(value).matches(); + } +} diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java b/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java deleted file mode 100644 index 4b6a2e96098169466eda9dbd891aae17d1fbb596..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.ozgcloud.xta.test.app.validation; - -import static de.ozgcloud.xta.test.app.model.XtaConstants.*; - -import java.util.regex.Pattern; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class XtaMessageIdValidator implements ConstraintValidator<ValidXtaMessageId, String> { - public Pattern PATTERN = Pattern.compile(MESSAGE_ID_PATTERN); - - @Override - public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { - return value != null && PATTERN.matcher(value).matches(); - } -} diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java index 573cd77571562dd9581061f335aae23de04726eb..4279ef93590c87f083ba661fcd70e6287c2ff46b 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java @@ -1,6 +1,6 @@ package de.ozgcloud.xta.test.app.mapper; -import static de.ozgcloud.xta.test.app.model.XtaConstants.*; +import static de.ozgcloud.xta.test.app.mapper.ExceptionMapper.*; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java index d65f05c55f5a616d308d94b1c42588ae7a09629b..07d8b77efc8cecbaf3bcf9635eef59d22f7e9ac1 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java @@ -1,14 +1,9 @@ package de.ozgcloud.xta.test.app.mapper; -import static de.ozgcloud.xta.test.app.factory.MessageMetaDataTestFactory.*; -import static de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory.AUTHOR_IDENTIFIER; -import static de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory.MESSAGE_SIZE; -import static de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory.READER_IDENTIFIER; +import static de.ozgcloud.xta.test.app.factory.XtaLookupServiceRequestTestFactory.*; import static de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory.*; import static de.ozgcloud.xta.test.app.mapper.ResponseMapper.*; -import static de.ozgcloud.xta.test.app.factory.XtaLookupServiceRequestTestFactory.*; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; import java.math.BigInteger; import java.nio.charset.StandardCharsets; @@ -19,7 +14,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; -import org.mockito.Mock; import de.ozgcloud.xta.test.app.factory.XtaFileTestFactory; import de.ozgcloud.xta.test.app.factory.XtaLookupServiceRequestTestFactory; @@ -27,8 +21,6 @@ import de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory; import de.ozgcloud.xta.test.app.factory.XtaMessageTestFactory; import de.ozgcloud.xta.test.app.model.XtaFile; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; -import de.ozgcloud.xta.test.app.util.XtaId; -import de.ozgcloud.xta.test.app.util.XtaIdGenerator; import genv3.de.xoev.transport.xta.x211.ContentType; import genv3.de.xoev.transport.xta.x211.LookupServiceResponse; import genv3.de.xoev.transport.xta.x211.LookupServiceResultType; @@ -419,25 +411,14 @@ public class ResponseMapperTest { } } - @DisplayName("create get message response header") + @DisplayName("map MsgBoxResponseType from requestId") @Nested - class TestCreateGetMessageResponseHeader { - @Mock - private XtaIdGenerator xtaIdGenerator; - - @Mock - private XtaId xtaId; - - @BeforeEach - void mock() { - when(xtaIdGenerator.generateRequestId()).thenReturn(xtaId); - when(xtaId.toString()).thenReturn(REQUEST_ID); - } + class TestMapMsgBoxResponseTypeFromRequestId { @DisplayName("should map message box response type from request id") @Test void shouldMapMsgBoxResponseTypeFromRequestId() { - var result = mapper.createGetMessageResponseHeader(xtaIdGenerator); + var result = mapper.mapMsgBoxResponseTypeFromRequestId(REQUEST_ID); assertThat(result.getMsgBoxRequestID()).isEqualTo(REQUEST_ID); } @@ -445,7 +426,7 @@ public class ResponseMapperTest { @DisplayName("should map items pending to zero") @Test void shouldMapItemsPendingToZero() { - var result = mapper.createGetMessageResponseHeader(xtaIdGenerator); + var result = mapper.mapMsgBoxResponseTypeFromRequestId(REQUEST_ID); assertThat(result.getItemsPending()).isEqualTo(BigInteger.ZERO); } @@ -453,7 +434,7 @@ public class ResponseMapperTest { @DisplayName("should set no messages available to null") @Test void shouldSetNoMessagesAvailableToNull() { - var result = mapper.createGetMessageResponseHeader(xtaIdGenerator); + var result = mapper.mapMsgBoxResponseTypeFromRequestId(REQUEST_ID); assertThat(result.getNoMessageAvailable()).isNull(); } @@ -496,27 +477,4 @@ public class ResponseMapperTest { } } - @DisplayName("create create message id response") - @Nested - class TestCreateCreateMessageIdResponse { - @Mock - private XtaIdGenerator xtaIdGenerator; - - @Mock - private XtaId xtaId; - - @BeforeEach - void mock() { - when(xtaIdGenerator.generateMessageId()).thenReturn(xtaId); - when(xtaId.toString()).thenReturn(MESSAGE_ID); - } - - @DisplayName("should map attributed uri type") - @Test - void shouldMapAttributedUriType() { - var result = mapper.createCreateMessageIdResponse(xtaIdGenerator); - - assertThat(result.getValue()).isEqualTo(MESSAGE_ID); - } - } } diff --git a/src/test/java/de/ozgcloud/xta/test/app/server/ManagementPortImplTest.java b/src/test/java/de/ozgcloud/xta/test/app/server/ManagementPortImplTest.java index 29cc41f2192f3ba18b26c6d28be107868ee36033..9e83bfcf56a0720c4ba657cedd96ce55ded176f0 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/server/ManagementPortImplTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/server/ManagementPortImplTest.java @@ -1,5 +1,6 @@ package de.ozgcloud.xta.test.app.server; +import static de.ozgcloud.xta.test.app.factory.MessageMetaDataTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -14,7 +15,7 @@ import org.mockito.Mock; import de.ozgcloud.xta.test.app.mapper.RequestMapper; import de.ozgcloud.xta.test.app.mapper.ResponseMapper; import de.ozgcloud.xta.test.app.model.XtaLookupServiceRequest; -import de.ozgcloud.xta.test.app.util.XtaIdGenerator; +import de.ozgcloud.xta.test.app.service.XtaMessageService; import genv3.de.xoev.transport.xta.x211.LookupServiceRequest; import genv3.de.xoev.transport.xta.x211.LookupServiceResponse; import genv3.eu.osci.ws.x2014.x10.transport.PartyType; @@ -26,7 +27,7 @@ public class ManagementPortImplTest { private ManagementPortImpl managementPortImpl; @Mock - private XtaIdGenerator xtaIdGenerator; + private XtaMessageService xtaMessageService; @Mock private ResponseMapper responseMapper; @Mock @@ -43,7 +44,8 @@ public class ManagementPortImplTest { @BeforeEach void beforeEach() { - when(responseMapper.createCreateMessageIdResponse(xtaIdGenerator)).thenReturn(createdMessageId); + when(xtaMessageService.createMessageId()).thenReturn(MESSAGE_ID); + when(responseMapper.mapCreateMessageIdResponse(MESSAGE_ID)).thenReturn(createdMessageId); } @DisplayName("should return") 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 12d49137a94ffb93536ff7117159e1fe4dd7dba3..96c321e353cf29cd3b58469e10f1d96ddbd71021 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 @@ -1,6 +1,7 @@ package de.ozgcloud.xta.test.app.server; import static de.ozgcloud.xta.test.app.factory.MessageMetaDataTestFactory.*; +import static de.ozgcloud.xta.test.app.mapper.ResponseMapper.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -25,7 +26,6 @@ import de.ozgcloud.xta.test.app.model.XtaMessage; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest; import de.ozgcloud.xta.test.app.service.XtaMessageService; -import de.ozgcloud.xta.test.app.util.XtaIdGenerator; import de.ozgcloud.xta.test.app.validation.RequestValidator; import genv3.de.xoev.transport.xta.x211.GenericContentContainer; import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException; @@ -55,8 +55,6 @@ public class MsgBoxPortImplTest { @Mock private ResponseMapper responseMapper; - @Mock - private XtaIdGenerator xtaIdGenerator; @Mock private XtaMessageService xtaMessageService; @@ -104,7 +102,8 @@ public class MsgBoxPortImplTest { when(xtaMessageService.getMessage(request)).thenReturn(Optional.of(xtaMessage)); when(responseMapper.mapMessageMetaData(xtaMessage.metaData())).thenReturn(mappedMessageMetaData); - when(responseMapper.createGetMessageResponseHeader(xtaIdGenerator)).thenReturn(mappedFetchResponseHeader); + when(xtaMessageService.createRequestId()).thenReturn(REQUEST_ID); + when(responseMapper.mapMsgBoxResponseTypeFromRequestId(REQUEST_ID)).thenReturn(mappedFetchResponseHeader); when(responseMapper.mapGenericContentContainerFromXtaMessage(xtaMessage)).thenReturn(mappedGenericContentContainer); } diff --git a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java index 4841132c2a4e9808882c82b2868cfa322956d7ad..80599eec0ba843241443b26d17bad9c66546e60e 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java @@ -2,6 +2,7 @@ package de.ozgcloud.xta.test.app.service; import static de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory.*; import static de.ozgcloud.xta.test.app.factory.XtaMessageTestFactory.*; +import static de.ozgcloud.xta.test.app.validation.ValidXtaId.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -19,6 +20,7 @@ import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.core.env.Environment; import de.ozgcloud.xta.test.app.data.XtaMessageRepository; import de.ozgcloud.xta.test.app.factory.XtaCloseRequestTestFactory; @@ -31,6 +33,8 @@ import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest; public class XtaMessageServiceTest { @Mock private XtaMessageRepository messageRepository; + @Mock + private Environment environment; @Spy @InjectMocks @@ -200,4 +204,53 @@ public class XtaMessageServiceTest { } } + + @DisplayName("create message id") + @Nested + class TestCreateMessageId { + + @DisplayName("should return unique id") + @Test + void shouldReturnUniqueId() { + var result1 = service.createMessageId(); + var result2 = service.createMessageId(); + + assertThat(result1).isNotEqualTo(result2); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + when(environment.getProperty("spring.application.name")).thenReturn("app"); + + var result = service.createMessageId(); + + assertThat(result).startsWith("urn:" + MESSAGE_ID_NAMESPACE + ":app:"); + } + } + + @DisplayName("create request id") + @Nested + class TestCreateRequestId { + + @DisplayName("should return unique id") + @Test + void shouldReturnUniqueId() { + var result1 = service.createRequestId(); + var result2 = service.createRequestId(); + + assertThat(result1).isNotEqualTo(result2); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + when(environment.getProperty("spring.application.name")).thenReturn("app"); + + var result = service.createRequestId(); + + assertThat(result).startsWith("urn:" + REQUEST_ID_NAMESPACE + ":app:"); + } + } + } diff --git a/src/test/java/de/ozgcloud/xta/test/app/util/XtaIdGeneratorTest.java b/src/test/java/de/ozgcloud/xta/test/app/util/XtaIdGeneratorTest.java deleted file mode 100644 index fd622f3a06eadcd9904f078ddcb7797aa667f9e7..0000000000000000000000000000000000000000 --- a/src/test/java/de/ozgcloud/xta/test/app/util/XtaIdGeneratorTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.ozgcloud.xta.test.app.util; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class XtaIdGeneratorTest { - private XtaIdGenerator xtaIdGenerator; - - @BeforeEach - void beforeEach() { - xtaIdGenerator = new XtaIdGenerator(); - } - - @Test - void generateTest() { - XtaId xtaMessageId1 = xtaIdGenerator.generateMessageId(); - XtaId xtaMessageId2 = xtaIdGenerator.generateMessageId(); - - assertEquals(xtaMessageId1.getSchema(), xtaMessageId2.getSchema()); - assertEquals(xtaMessageId1.getNamespace(), xtaMessageId2.getNamespace()); - assertEquals(xtaMessageId1.getApplication(), xtaMessageId2.getApplication()); - assertNotEquals(xtaMessageId1.getUuid(), xtaMessageId2.getUuid()); - } -} diff --git a/src/test/java/de/ozgcloud/xta/test/app/util/XtaIdTest.java b/src/test/java/de/ozgcloud/xta/test/app/util/XtaIdTest.java deleted file mode 100644 index 6417b1f7f60c785ed6e9fbd9a781f47ab397198a..0000000000000000000000000000000000000000 --- a/src/test/java/de/ozgcloud/xta/test/app/util/XtaIdTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.ozgcloud.xta.test.app.util; - -import static org.junit.jupiter.api.Assertions.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Test; - -public class XtaIdTest { - - @Test - void parseTest_messageIdIsCorrect_returnedOptionalIsPresent() { - // given - String messageId = "urn:de:xta:messageid:application:000ca2fe-f4e1-45c2-8233-3a0eb760bd16"; - - // when - Optional<XtaId> optId = XtaId.parse(messageId); - - // then - assertTrue(optId.isPresent()); - XtaId xtaMessageId = optId.get(); - assertAll( - () -> assertEquals("urn", xtaMessageId.getSchema(), "wrong schema"), - () -> assertEquals("de:xta:messageid", xtaMessageId.getNamespace(), "wrong namespace"), - () -> assertEquals("application", xtaMessageId.getApplication(), "wrong application"), - () -> assertEquals("000ca2fe-f4e1-45c2-8233-3a0eb760bd16", xtaMessageId.getUuid(), "wrong uuid")); - } - - @Test - void parseTest_messageIdIsNotCorrect_returnedOptionalIsEmpty() { - // given - String messageId = "urn:application:000ca2fe-f4e1-45c2-8233-3a0eb760bd16"; - - // when - Optional<XtaId> optId = XtaId.parse(messageId); - - // then - assertTrue(optId.isEmpty()); - } -} diff --git a/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java b/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java index 3a49bf94b4e1b8b0db26e28659b0d7265874f203..cb46fc56d20adac55b181fcc3998b489ae2900a7 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java @@ -36,6 +36,14 @@ class RequestValidatorTest { validator.validate(XtaGetMessageRequestTestFactory.create()); } + @DisplayName("should throw if null") + @Test + void shouldThrowIfNull() { + when(exceptionMapper.createTechnicalProblemException(any())).thenReturn(exception); + + assertThatThrownBy(() -> validator.validate(null)).isEqualTo(exception); + } + @DisplayName("with invalid request") @Nested class TestWithInvalidRequest { @@ -59,7 +67,7 @@ class RequestValidatorTest { @Test void shouldThrowIfMessageIdDoesNotMatchPattern() { var request = XtaGetMessageRequestTestFactory.createBuilder() - .messageId("urn:some-invalid-format") + .messageId("urn:unknown-namespace:application:000ca2fe-f4e1-45c2-8233-3a0eb760bd16") .build(); assertThatThrownBy(() -> validator.validate(request)).isEqualTo(exception);