Skip to content

Commit 11b5e68

Browse files
committed
Add validation for contract definition id.
1 parent a671c8e commit 11b5e68

File tree

7 files changed

+130
-5
lines changed

7 files changed

+130
-5
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ in the detailed section referring to by linking pull requests or issues.
3636
* Postgresql end to end test (#1278)
3737
* Add signing/publishing config (#1147)
3838
* Verify OpenAPI definitions (#1312)
39+
* Add validation to contract definition id (#1347)
3940

4041
#### Changed
4142

common/util/build.gradle.kts

+3
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ plugins {
2121
val jupiterVersion: String by project
2222
val mockitoVersion: String by project
2323
val okHttpVersion: String by project
24+
val jakartaValidationApi: String by project
2425

2526
dependencies {
27+
implementation("jakarta.validation:jakarta.validation-api:${jakartaValidationApi}")
28+
2629
testFixturesImplementation("org.mockito:mockito-core:${mockitoVersion}")
2730
testFixturesImplementation("org.junit.jupiter:junit-jupiter-api:${jupiterVersion}")
2831
testFixturesRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${jupiterVersion}")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2022 ZF Friedrichshafen AG
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* ZF Friedrichshafen AG - Initial Implementation
12+
*
13+
*/
14+
15+
package org.eclipse.dataspaceconnector.common.annotations;
16+
17+
import jakarta.validation.Constraint;
18+
import jakarta.validation.Payload;
19+
import org.eclipse.dataspaceconnector.common.validator.UuidValidator;
20+
21+
import java.lang.annotation.Documented;
22+
import java.lang.annotation.ElementType;
23+
import java.lang.annotation.Retention;
24+
import java.lang.annotation.RetentionPolicy;
25+
import java.lang.annotation.Target;
26+
27+
@Documented
28+
@Constraint(validatedBy = UuidValidator.class)
29+
@Target({ ElementType.METHOD, ElementType.FIELD })
30+
@Retention(RetentionPolicy.RUNTIME)
31+
public @interface Uuid {
32+
String message() default "Invalid UUID";
33+
Class<?>[] groups() default {};
34+
Class<? extends Payload>[] payload() default {};
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright (c) 2022 ZF Friedrichshafen AG
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* ZF Friedrichshafen AG - Initial Implementation
12+
*
13+
*/
14+
15+
package org.eclipse.dataspaceconnector.common.validator;
16+
17+
import jakarta.validation.ConstraintValidator;
18+
import jakarta.validation.ConstraintValidatorContext;
19+
import org.eclipse.dataspaceconnector.common.annotations.Uuid;
20+
21+
import java.util.UUID;
22+
23+
public class UuidValidator implements ConstraintValidator<Uuid, String> {
24+
25+
@Override
26+
public void initialize(Uuid contactNumber) {
27+
}
28+
29+
@Override
30+
public boolean isValid(String uuid, ConstraintValidatorContext cxt) {
31+
if (uuid == null) {
32+
return false;
33+
}
34+
35+
try {
36+
UUID.fromString(uuid);
37+
} catch (IllegalArgumentException exception) {
38+
return false;
39+
}
40+
41+
return true;
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.eclipse.dataspaceconnector.common.validator;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.UUID;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class UuidValidatorTest {
10+
11+
UuidValidator uuidValidator = new UuidValidator();
12+
13+
@Test
14+
void isValid_valid_UUID() {
15+
String uuid = UUID.randomUUID().toString();
16+
assertThat(uuidValidator.isValid(uuid, null)).isTrue();
17+
}
18+
19+
@Test
20+
void isValid_invalid_UUID() {
21+
String uuid = "invalid-uuid-string";
22+
assertThat(uuidValidator.isValid(uuid, null)).isFalse();
23+
}
24+
}

extensions/api/data-management/contractdefinition/src/main/java/org/eclipse/dataspaceconnector/api/datamanagement/contractdefinition/model/ContractDefinitionDto.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2020
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
2121
import jakarta.validation.constraints.NotNull;
22+
import org.eclipse.dataspaceconnector.common.annotations.Uuid;
2223
import org.eclipse.dataspaceconnector.spi.query.Criterion;
2324

2425
import java.util.ArrayList;
@@ -32,7 +33,7 @@ public class ContractDefinitionDto {
3233
private String contractPolicyId;
3334
@NotNull
3435
private List<Criterion> criteria = new ArrayList<>();
35-
@NotNull
36+
@Uuid
3637
private String id;
3738

3839
private ContractDefinitionDto() {

extensions/api/data-management/contractdefinition/src/test/java/org/eclipse/dataspaceconnector/api/datamanagement/contractdefinition/ContractDefinitionApiControllerIntegrationTest.java

+22-4
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void getSingleContractDef_notFound() {
104104

105105
@Test
106106
void postContractDefinition(ContractDefinitionStore store) {
107-
var dto = createDto("definitionId");
107+
var dto = createDto(UUID.randomUUID().toString());
108108

109109
baseRequest()
110110
.body(dto)
@@ -118,7 +118,7 @@ void postContractDefinition(ContractDefinitionStore store) {
118118
@Test
119119
void postContractDefinition_invalidBody(ContractDefinitionStore store) {
120120
var dto = ContractDefinitionDto.Builder.newInstance()
121-
.id("test-id")
121+
.id(UUID.randomUUID().toString())
122122
.contractPolicyId(null)
123123
.accessPolicyId(UUID.randomUUID().toString())
124124
.build();
@@ -132,10 +132,28 @@ void postContractDefinition_invalidBody(ContractDefinitionStore store) {
132132
assertThat(store.findAll()).isEmpty();
133133
}
134134

135+
@Test
136+
void postContractDefinition_invalidContractDefinitionId(ContractDefinitionStore store) {
137+
var dto = ContractDefinitionDto.Builder.newInstance()
138+
.id("invalid-id")
139+
.contractPolicyId(UUID.randomUUID().toString())
140+
.accessPolicyId(UUID.randomUUID().toString())
141+
.build();
142+
143+
baseRequest()
144+
.body(dto)
145+
.contentType(JSON)
146+
.post("/contractdefinitions")
147+
.then()
148+
.statusCode(400);
149+
assertThat(store.findAll()).isEmpty();
150+
}
151+
135152
@Test
136153
void postContractDefinition_alreadyExists(ContractDefinitionLoader loader, ContractDefinitionStore store) {
137-
loader.accept(createContractDefinition("definitionId"));
138-
var dto = createDto("definitionId");
154+
String id = UUID.randomUUID().toString();
155+
loader.accept(createContractDefinition(id));
156+
var dto = createDto(id);
139157

140158
baseRequest()
141159
.body(dto)

0 commit comments

Comments
 (0)