diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/ProtocolMetadata.java b/src/main/java/de/ozgcloud/xta/test/app/model/ProtocolMetadata.java deleted file mode 100644 index 9fd11cd7bc515e222e1c2df9887fce39383d9ab5..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/model/ProtocolMetadata.java +++ /dev/null @@ -1,51 +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 java.util.Collections; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class ProtocolMetadata { - - private String softwareManufacturer = "Nortal AG"; - private String softwareName = "Dummy Produkt"; - private String softwareVersion = "1.0.0"; - - private String street = "Knesebeckstraße"; - private String streetNo = "1"; - private String zipCode = "10623"; - private String city = "Berlin"; - private String addressAddition; - - @JsonIgnore - public List<String> getAddressAdditionAsList() { - if (addressAddition != null) { - String[] split = addressAddition.split("\r\n|\n|\r"); - return List.of(split); - } - return Collections.emptyList(); - } -} 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 3c1d4c6810e62a672d2f4151986790078fad8c9c..a08804dd283b60d4e3905590c38992bde7375a31 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,12 +1,14 @@ package de.ozgcloud.xta.test.app.model; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId; import lombok.Builder; @Builder public record XtaCloseRequest( - @NotBlank String messageId, - @NotBlank String clientIdentifierValue + @ValidXtaMessageId String messageId, + @NotNull @NotBlank String clientIdentifierValue ) { } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConfigDto.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConfigDto.java deleted file mode 100644 index c74cdcc4c81870abe4e12787eaa2f68adbf9c717..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConfigDto.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Created 2022-12-14 - */ -package de.ozgcloud.xta.test.app.model; - -import de.ozgcloud.xta.test.app.config.ClientProperties; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor - -public class XtaConfigDto { - - private ProtocolMetadata protocolMetadata; - - private ClientProperties clientProperties; -} 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 index 5ca37d7c8fc35f8d38d2882e7e637e1fa6dd2667..7aa512d70ee89ce4cddfe2f379c4c7b85d63c1dd 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java @@ -77,6 +77,8 @@ public class XtaConstants { 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/XtaGetMessageRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java index 6941833de98e232b323c595395284bf11bf7f5f0..41ad56b586791fcdfbd3386190d09ef552b6f547 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 @@ -2,11 +2,12 @@ package de.ozgcloud.xta.test.app.model; import jakarta.validation.constraints.NotBlank; +import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId; import lombok.Builder; @Builder public record XtaGetMessageRequest( - @NotBlank String messageId, + @ValidXtaMessageId String messageId, @NotBlank String clientIdentifierValue ) { } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaIdentifierConfig.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaIdentifierConfig.java deleted file mode 100644 index d8c4c8a4dbf83c86e66b85c1a008094a47713b9a..0000000000000000000000000000000000000000 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaIdentifierConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.xta.test.app.model; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class XtaIdentifierConfig { - - private String identifierScheme; - - private String name; - - private String value; - - private String organizationCategory; - -} diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java index 64e124809cc3702cb45281575046e30b69381a87..3ed26844a4771f2a760458fe864c840c5889f904 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java @@ -1,11 +1,14 @@ package de.ozgcloud.xta.test.app.model; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + import lombok.Builder; @Builder public record XtaLookupServiceRequest( - String service, - String readerIdentifierValue, - String authorIdentifierValue + @NotNull @NotBlank String service, + @NotNull @NotBlank String readerIdentifierValue, + @NotNull @NotBlank String authorIdentifierValue ) { } 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 e48bf9962d1303af0170afcd07cf40cd62bb4349..1ad6668d9a0e317a07f607955bc6e550fd215bc2 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 @@ -8,20 +8,21 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PositiveOrZero; +import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId; import lombok.Builder; @Builder(toBuilder = true) public record XtaMessageMetaData( - @NotBlank String service, + @NotNull @NotBlank String service, @NotNull @NotBlank String businessScenarioCode, @Nullable String businessScenarioName, @Nullable String businessScenarioListUri, @Nullable String businessScenarioListVersionId, @NotBlank String messageTypeCode, @NotBlank String messageTypePayloadSchema, - @NotBlank String messageId, + @ValidXtaMessageId String messageId, @NotNull @Valid Identifier authorIdentifier, @NotNull @Valid Identifier readerIdentifier, - @PositiveOrZero BigInteger messageSize + @NotNull @PositiveOrZero BigInteger messageSize ) { } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java index 279014fb4fe85325d03b34115d211f87eebadc8a..a5c011121b4f57e5f67168bbb8f63c229ed6413c 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java @@ -1,13 +1,14 @@ package de.ozgcloud.xta.test.app.model; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import lombok.Builder; @Builder public record XtaMessageMetaDataListingRequest( - @NotBlank String clientIdentifierValue, - @Positive int maxListItems + @NotNull @NotBlank String clientIdentifierValue, + @NotNull @Positive int maxListItems ) { } 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 b06f871e676bf74f90d129f4a3b4e0a905d401c6..7b1425446fa176af04cdd1d12dcf2c26f6541fef 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 @@ -8,9 +8,9 @@ import org.springframework.stereotype.Component; 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.RequestValidator; 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; import genv3.de.xoev.transport.xta.x211.PermissionDeniedException; diff --git a/src/main/java/de/ozgcloud/xta/test/app/service/RequestValidator.java b/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java similarity index 97% rename from src/main/java/de/ozgcloud/xta/test/app/service/RequestValidator.java rename to src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java index 031980d0156ba5a033f269702079fe2992c4fffd..7d1b71ff8c9faf3a072b566789e10039047a26f5 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/service/RequestValidator.java +++ b/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java @@ -1,4 +1,4 @@ -package de.ozgcloud.xta.test.app.service; +package de.ozgcloud.xta.test.app.validation; import java.util.Collection; import java.util.function.Function; diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java b/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java new file mode 100644 index 0000000000000000000000000000000000000000..72ee404cb14c2e55df32c9c292459b8aa6927922 --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java @@ -0,0 +1,20 @@ +package de.ozgcloud.xta.test.app.validation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +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 +@Retention(RetentionPolicy.RUNTIME) +public @interface ValidXtaMessageId { + String message() default "Invalid message id"; // Default error message + + Class<?>[] groups() default {}; + + Class<? extends Payload>[] payload() default {}; +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..4b6a2e96098169466eda9dbd891aae17d1fbb596 --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java @@ -0,0 +1,17 @@ +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/server/MsgBoxPortImplTest.java b/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java index 3f47332ee59660a42e0b5958595fdd8e36a857c6..12d49137a94ffb93536ff7117159e1fe4dd7dba3 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 @@ -24,9 +24,9 @@ import de.ozgcloud.xta.test.app.model.XtaGetMessageRequest; 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.RequestValidator; 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; import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException; 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 new file mode 100644 index 0000000000000000000000000000000000000000..3a49bf94b4e1b8b0db26e28659b0d7265874f203 --- /dev/null +++ b/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java @@ -0,0 +1,71 @@ +package de.ozgcloud.xta.test.app.validation; + +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.mockito.InjectMocks; +import org.mockito.Mock; + +import de.ozgcloud.xta.test.app.mapper.ExceptionMapper; +import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException; +import lombok.SneakyThrows; + +class RequestValidatorTest { + + @InjectMocks + private RequestValidator validator; + + @Mock + private ExceptionMapper exceptionMapper; + + @Mock + private XTAWSTechnicalProblemException exception; + + @DisplayName("validate xta get message request") + @Nested + class TestValidateXtaGetMessageRequest { + + @DisplayName("should return") + @Test + @SneakyThrows + void shouldReturn() { + validator.validate(XtaGetMessageRequestTestFactory.create()); + } + + @DisplayName("with invalid request") + @Nested + class TestWithInvalidRequest { + + @BeforeEach + void mock() { + when(exceptionMapper.createTechnicalProblemException(any())).thenReturn(exception); + } + + @DisplayName("should throw if message id is null") + @Test + void shouldThrowIfMessageIdIsNull() { + var request = XtaGetMessageRequestTestFactory.createBuilder() + .messageId(null) + .build(); + + assertThatThrownBy(() -> validator.validate(request)).isEqualTo(exception); + } + + @DisplayName("should throw if message id does not match pattern") + @Test + void shouldThrowIfMessageIdDoesNotMatchPattern() { + var request = XtaGetMessageRequestTestFactory.createBuilder() + .messageId("urn:some-invalid-format") + .build(); + + assertThatThrownBy(() -> validator.validate(request)).isEqualTo(exception); + } + } + + } + +} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/test/app/validation/XtaGetMessageRequestTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/validation/XtaGetMessageRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7ec8f61169b244646b5604915e8ef0de51e06b9c --- /dev/null +++ b/src/test/java/de/ozgcloud/xta/test/app/validation/XtaGetMessageRequestTestFactory.java @@ -0,0 +1,18 @@ +package de.ozgcloud.xta.test.app.validation; + +import de.ozgcloud.xta.test.app.model.XtaGetMessageRequest; + +public class XtaGetMessageRequestTestFactory { + public static String VALID_MESSAGE_ID = "urn:de:xta:messageid:application:000ca2fe-f4e1-45c2-8233-3a0eb760bd16"; + public static String VALID_CLIENT_IDENTIFIER_VALUE = "prefix:someValue"; + + public static XtaGetMessageRequest.XtaGetMessageRequestBuilder createBuilder() { + return XtaGetMessageRequest.builder() + .messageId(VALID_MESSAGE_ID) + .clientIdentifierValue(VALID_CLIENT_IDENTIFIER_VALUE); + } + + public static XtaGetMessageRequest create() { + return createBuilder().build(); + } +}