From fda719d0ca243cd3cbacf8eb928ae6e238fbb6af Mon Sep 17 00:00:00 2001 From: Jimmy Praet Date: Mon, 9 Feb 2026 11:56:54 +0100 Subject: [PATCH] Fix concurrency issue in InputValidationIssues.BELGIF_ISSUE_TYPE_HREFS cache --- .../problem/api/InputValidationIssues.java | 4 +-- .../api/InputValidationIssuesTest.java | 30 +++++++++++++++++++ src/main/asciidoc/release-notes.adoc | 6 ++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java b/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java index 23e74171..b3d6a3c5 100644 --- a/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java +++ b/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java @@ -3,9 +3,9 @@ import java.net.URI; import java.time.temporal.Temporal; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import io.github.belgif.rest.problem.config.ProblemConfig; @@ -61,7 +61,7 @@ public class InputValidationIssues { public static final String DETAIL_JSON_SYNTAX_ERROR = "JSON syntax error"; - private static final Map BELGIF_ISSUE_TYPE_HREFS = new HashMap<>(); + private static final Map BELGIF_ISSUE_TYPE_HREFS = new ConcurrentHashMap<>(); private InputValidationIssues() { } diff --git a/belgif-rest-problem/src/test/java/io/github/belgif/rest/problem/api/InputValidationIssuesTest.java b/belgif-rest-problem/src/test/java/io/github/belgif/rest/problem/api/InputValidationIssuesTest.java index edda833a..bb42165a 100644 --- a/belgif-rest-problem/src/test/java/io/github/belgif/rest/problem/api/InputValidationIssuesTest.java +++ b/belgif-rest-problem/src/test/java/io/github/belgif/rest/problem/api/InputValidationIssuesTest.java @@ -2,13 +2,19 @@ import static org.assertj.core.api.Assertions.*; +import java.lang.reflect.Field; import java.net.URI; import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.OffsetTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; @@ -765,6 +771,30 @@ void equalExpected(boolean extIssueTypes, boolean extInputsArray) { .allMatch(this::isEmpty); } + @Test + @SuppressWarnings("unchecked") + void getHrefConcurrently() throws Exception { + Field field = InputValidationIssues.class.getDeclaredField("BELGIF_ISSUE_TYPE_HREFS"); + field.setAccessible(true); + ((Map) field.get(null)).clear(); + int threads = 16; + ExecutorService executorService = Executors.newFixedThreadPool(threads); + List> results = new ArrayList<>(threads); + for (int i = 0; i < threads; i++) { + results.add(executorService.submit(() -> { + assertThat(InputValidationIssues.schemaViolation(InEnum.BODY, "name", "value", "detail").getHref()) + .hasToString("https://www.belgif.be/specification/rest/api-guide/issues/schemaViolation.html"); + assertThat(InputValidationIssues.invalidInput(InEnum.BODY, "name", "value", "detail").getHref()) + .hasToString("https://www.belgif.be/specification/rest/api-guide/issues/invalidInput.html"); + return null; + })); + } + executorService.shutdown(); + for (Future future : results) { + future.get(); + } + } + public boolean isEmpty(Object value) { return value == null || Integer.valueOf(0).equals(value) || Collections.emptyList().equals(value) || Collections.emptyMap().equals(value); diff --git a/src/main/asciidoc/release-notes.adoc b/src/main/asciidoc/release-notes.adoc index a98575d1..f533ab63 100644 --- a/src/main/asciidoc/release-notes.adoc +++ b/src/main/asciidoc/release-notes.adoc @@ -12,6 +12,12 @@ // tag::recent-versions[] +== Version 0.21 + +*belgif-rest-problem:* + +* Fix concurrency issue in InputValidationIssues.BELGIF_ISSUE_TYPE_HREFS cache + == Version 0.20 *belgif-rest-problem:*