From 1fcf99f6579ffd98c2098d22c8f6310217b8d391 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Wed, 8 Apr 2026 21:28:37 +0200 Subject: [PATCH 1/7] docker base image upgrades --- dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile | 4 ++-- dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile b/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile index 82b2b9f33..46b8831cf 100755 --- a/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile +++ b/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM debian:trixie-slim@sha256:1d3c811171a08a5adaa4a163fbafd96b61b87aa871bbc7aa15431ac275d3d430 AS builder +FROM debian:trixie-slim@sha256:4ffb3a1511099754cddc70eb1b12e50ffdb67619aa0ab6c13fcd800a78ef7c7a AS builder WORKDIR /opt/bpe COPY --chown=root:2202 ./ ./ RUN chown root:2202 ./ && \ @@ -23,7 +23,7 @@ RUN chown root:2202 ./ && \ chmod 1775 ./log -FROM azul/zulu-openjdk:25-jre-headless@sha256:c8e35e74e2cfbdeffb4e4850123c41378d3ec0a6d80f17d2f9f3a9293f9236e6 +FROM azul/zulu-openjdk:25-jre-headless@sha256:205a88e67ff7acca2c4452c60fd078a95f6e5a7c9a3bc8bad83dbd3a140c58f4 LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf LABEL org.opencontainers.image.description="DSF BPE Server" LABEL org.opencontainers.image.licenses="Apache License, Version 2.0" diff --git a/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile b/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile index 2219f8a69..72a1801e9 100755 --- a/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile +++ b/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM debian:trixie-slim@sha256:1d3c811171a08a5adaa4a163fbafd96b61b87aa871bbc7aa15431ac275d3d430 AS builder +FROM debian:trixie-slim@sha256:4ffb3a1511099754cddc70eb1b12e50ffdb67619aa0ab6c13fcd800a78ef7c7a AS builder WORKDIR /opt/fhir COPY --chown=root:2101 ./ ./ RUN chown root:2101 ./ && \ @@ -23,7 +23,7 @@ RUN chown root:2101 ./ && \ chmod 1775 ./log -FROM azul/zulu-openjdk:25-jre-headless@sha256:c8e35e74e2cfbdeffb4e4850123c41378d3ec0a6d80f17d2f9f3a9293f9236e6 +FROM azul/zulu-openjdk:25-jre-headless@sha256:205a88e67ff7acca2c4452c60fd078a95f6e5a7c9a3bc8bad83dbd3a140c58f4 LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf LABEL org.opencontainers.image.description="DSF FHIR Server" LABEL org.opencontainers.image.licenses="Apache License, Version 2.0" From 83b873c2f1e6f7f1e3c93cccab976c2148f6bf5a Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Wed, 8 Apr 2026 22:16:52 +0200 Subject: [PATCH 2/7] dependency and maven plugin version upgrades, related code changes --- .../v1/plugin/ProcessPluginFactoryImpl.java | 6 +-- .../v2/plugin/ProcessPluginFactoryImpl.java | 6 +-- .../bpe/api/plugin/ProcessPluginFactory.java | 3 +- pom.xml | 46 +++++++++---------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginFactoryImpl.java b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginFactoryImpl.java index 1e6f88037..7e7d9e483 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginFactoryImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginFactoryImpl.java @@ -56,10 +56,10 @@ protected ProcessPlugin createProcessPlugin(Object processPluginDefinition, bool } @Override - @SuppressWarnings("rawtypes") - public Stream getSerializer() + public Stream> getSerializer() { - return apiApplicationContext.getBeansOfType(TypedValueSerializer.class).values().stream(); + return apiApplicationContext.getBeansOfType(TypedValueSerializer.class).values().stream() + .map(s -> (TypedValueSerializer) s); } @Override diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginFactoryImpl.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginFactoryImpl.java index 84086b56c..da48a4419 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginFactoryImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginFactoryImpl.java @@ -48,10 +48,10 @@ protected ProcessPlugin createProcessPlugin(Object processPluginDefinition, bool } @Override - @SuppressWarnings("rawtypes") - public Stream getSerializer() + public Stream> getSerializer() { - return apiApplicationContext.getBeansOfType(TypedValueSerializer.class).values().stream(); + return apiApplicationContext.getBeansOfType(TypedValueSerializer.class).values().stream() + .map(s -> (TypedValueSerializer) s); } @Override diff --git a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPluginFactory.java b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPluginFactory.java index 8a2976359..f8227819e 100644 --- a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPluginFactory.java +++ b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPluginFactory.java @@ -26,8 +26,7 @@ public interface ProcessPluginFactory { int getApiVersion(); - @SuppressWarnings("rawtypes") - Stream getSerializer(); + Stream> getSerializer(); ListenerFactory getListenerFactory(); diff --git a/pom.xml b/pom.xml index 825c56bba..b824c7007 100755 --- a/pom.xml +++ b/pom.xml @@ -39,13 +39,13 @@ ${project.basedir} 2.0.17 - 2.25.3 - 12.1.6 + 2.25.4 + 12.1.8 3.1.11 2.2.2 - 6.2.15 - 2.21.0 - 1.0.3 + 6.2.17 + 2.21.2 + 1.1.1 5.1.0 8.4.2 6.5.27 @@ -156,7 +156,7 @@ org.mockito mockito-core - 5.21.0 + 5.23.0 org.bouncycastle @@ -183,12 +183,12 @@ org.postgresql postgresql - 42.7.9 + 42.7.10 org.checkerframework checker-qual - 3.53.0 + 3.55.1 com.github.ben-manes.caffeine @@ -205,7 +205,7 @@ com.auth0 java-jwt - 4.5.0 + 4.5.1 @@ -334,7 +334,7 @@ org.glassfish.jaxb jaxb-runtime - 4.0.6 + 4.0.7 @@ -416,7 +416,7 @@ org.tukaani xz - 1.11 + 1.12 @@ -458,7 +458,7 @@ com.nimbusds nimbus-jose-jwt - 10.7 + 10.9 @@ -491,13 +491,13 @@ org.yaml snakeyaml - 2.5 + 2.6 com.fasterxml.uuid java-uuid-generator - 4.3.0 + 5.2.0 @@ -509,19 +509,19 @@ org.apache.tika tika-core - 3.2.3 + 3.3.0 org.apache.maven maven-core - 3.9.12 + 3.9.14 org.apache.maven maven-plugin-api - 3.9.12 + 3.9.14 org.apache.maven.plugin-tools @@ -569,17 +569,17 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.4 + 3.5.5 org.apache.maven.plugins maven-failsafe-plugin - 3.5.4 + 3.5.5 org.apache.maven.plugins maven-resources-plugin - 3.4.0 + 3.5.0 org.apache.maven.plugins @@ -604,7 +604,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.9.0 + 3.10.0 org.codehaus.mojo @@ -629,7 +629,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.9.8.2 + 4.9.8.3 org.apache.maven.plugins @@ -659,7 +659,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.6.1 + 3.6.2 dev.dsf From e586232d722213737cf2d773b7963c5152864be3 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Thu, 9 Apr 2026 01:37:21 +0200 Subject: [PATCH 3/7] javadoc generation also disabled for dsf-bpe-process-api-v1-base reports --- dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml index 4ba06cd2a..e05f860cf 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml @@ -92,4 +92,16 @@ + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + \ No newline at end of file From 3f47760fe68e64f546620630b4c097c8ca6111c9 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Thu, 9 Apr 2026 01:41:26 +0200 Subject: [PATCH 4/7] code cleanup, improved interrupt handling --- ...ctFhirWebserviceClientJerseyWithRetry.java | 10 ++++--- .../dsf/AbstractDsfClientJerseyWithRetry.java | 8 ++++-- ...stractWebserviceClientJerseyWithRetry.java | 8 ++++-- .../plugin/ProcessPluginApiClassLoader.java | 2 +- .../config/FhirClientConnectionsConfig.java | 2 +- .../subscription/LocalFhirConnectorImpl.java | 8 ++++++ .../dsf/common/db/migration/DbMigrator.java | 26 ++++++++++++++----- .../common/jetty/HttpClientWithGetRetry.java | 8 ++++++ .../dev/dsf/fhir/dao/jdbc/BinaryDaoJdbc.java | 1 + .../validation/SnapshotGeneratorImpl.java | 4 +-- .../validation/ValidationSupportRule.java | 2 +- ...ctFhirWebserviceClientJerseyWithRetry.java | 8 ++++-- .../dsf/fhir/client/WebsocketClientTyrus.java | 2 +- 13 files changed, 68 insertions(+), 21 deletions(-) diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java index 0c678ba19..a336cbbb4 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java @@ -64,8 +64,8 @@ else if (nTimes != RetryClient.RETRY_FOREVER) { if (tryNumber < nTimes || nTimes == RetryClient.RETRY_FOREVER) { - logger.warn("Caught {} - {}; trying again in {}s{}", e.getClass(), e.getMessage(), delay, - nTimes == RetryClient.RETRY_FOREVER ? " (retry " + (tryNumber + 1) + ")" : ""); + logger.warn("Caught {} - {}; trying again in {}s{}", e.getClass().getName(), e.getMessage(), + delay, nTimes == RetryClient.RETRY_FOREVER ? " (retry " + (tryNumber + 1) + ")" : ""); try { @@ -73,11 +73,15 @@ else if (nTimes != RetryClient.RETRY_FOREVER) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } } else { - logger.warn("Caught {} - {}; not trying again", e.getClass(), e.getMessage()); + logger.warn("Caught {} - {}; not trying again", e.getClass().getName(), e.getMessage()); } if (caughtException != null) diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/AbstractDsfClientJerseyWithRetry.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/AbstractDsfClientJerseyWithRetry.java index c90ce5115..6f10ecc35 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/AbstractDsfClientJerseyWithRetry.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/AbstractDsfClientJerseyWithRetry.java @@ -68,7 +68,7 @@ else if (nTimes != RetryClient.RETRY_FOREVER) if (tryNumber > 0) delay = delayStrategy.getNextDelay(delay); - logger.warn("Caught {} - {}; trying again in {}{}", e.getClass(), e.getMessage(), + logger.warn("Caught {} - {}; trying again in {}{}", e.getClass().getName(), e.getMessage(), delay.toString(), nTimes == RetryClient.RETRY_FOREVER ? " (retry " + (tryNumber + 1) + ")" : ""); @@ -78,11 +78,15 @@ else if (nTimes != RetryClient.RETRY_FOREVER) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } } else { - logger.warn("Caught {} - {}; not trying again", e.getClass(), e.getMessage()); + logger.warn("Caught {} - {}; not trying again", e.getClass().getName(), e.getMessage()); } if (caughtException != null) diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/AbstractWebserviceClientJerseyWithRetry.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/AbstractWebserviceClientJerseyWithRetry.java index 757e0c909..6ae3bff6a 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/AbstractWebserviceClientJerseyWithRetry.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/AbstractWebserviceClientJerseyWithRetry.java @@ -63,7 +63,7 @@ else if (nTimes != RetryClient.RETRY_FOREVER) { if (tryNumber < nTimes || nTimes == RetryClient.RETRY_FOREVER) { - logger.warn("Caught {} - {}; trying again in {}s{}", e.getClass(), e.getMessage(), + logger.warn("Caught {} - {}; trying again in {}s{}", e.getClass().getName(), e.getMessage(), delay.toSeconds(), nTimes == RetryClient.RETRY_FOREVER ? " (retry " + (tryNumber + 1) + ")" : ""); @@ -73,11 +73,15 @@ else if (nTimes != RetryClient.RETRY_FOREVER) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } } else { - logger.warn("Caught {} - {}; not trying again", e.getClass(), e.getMessage()); + logger.warn("Caught {} - {}; not trying again", e.getClass().getName(), e.getMessage()); } if (caughtException != null) diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginApiClassLoader.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginApiClassLoader.java index ad8932330..1d35ed765 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginApiClassLoader.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginApiClassLoader.java @@ -82,7 +82,7 @@ protected Class loadClass(String className, boolean resolve) throws ClassNotF if (isBpeClassAllowed(bpeClass)) return bpeClass; - logger.debug("Class " + className + " not found or hidden"); + logger.debug("Class {} not found or hidden", className); throw new ClassNotFoundException(className); } } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/spring/config/FhirClientConnectionsConfig.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/spring/config/FhirClientConnectionsConfig.java index 68d8e0a9f..7cd1ca3e0 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/spring/config/FhirClientConnectionsConfig.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/spring/config/FhirClientConnectionsConfig.java @@ -167,7 +167,7 @@ private void testConnection(FhirClientConfig config) } catch (OidcClientException e) { - logger.debug("Testing connection with OIDC provider at {} for '{}' [Failed] -> {}", + logger.debug("Testing connection with OIDC provider at {} for '{}' [Failed]", config.oidcAuthentication().baseUrl(), config.fhirServerId(), e); logger.warn("Testing connection with OIDC provider at {} for '{}' [Failed] -> {}", config.oidcAuthentication().baseUrl(), config.fhirServerId(), e.getMessage()); diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/subscription/LocalFhirConnectorImpl.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/subscription/LocalFhirConnectorImpl.java index c3dd036a4..5c0b90fa0 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/subscription/LocalFhirConnectorImpl.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/subscription/LocalFhirConnectorImpl.java @@ -153,6 +153,10 @@ private Subscription retry(Supplier supplier) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } } @@ -184,6 +188,10 @@ private Subscription retryForever(Supplier supplier) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } } } diff --git a/dsf-common/dsf-common-db/src/main/java/dev/dsf/common/db/migration/DbMigrator.java b/dsf-common/dsf-common-db/src/main/java/dev/dsf/common/db/migration/DbMigrator.java index 43cf5d29f..a5f856930 100644 --- a/dsf-common/dsf-common-db/src/main/java/dev/dsf/common/db/migration/DbMigrator.java +++ b/dsf-common/dsf-common-db/src/main/java/dev/dsf/common/db/migration/DbMigrator.java @@ -18,6 +18,7 @@ import java.io.ByteArrayOutputStream; import java.net.ConnectException; import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.SQLException; import java.util.Arrays; @@ -134,8 +135,8 @@ public void migrate() logger.warn("Unlocking DB for migration ..."); unlockCommand.execute(); - Arrays.stream(output.toString().split("[\r\n]+")).filter(row -> !row.isBlank()) - .forEach(row -> logger.debug("{}", row)); + Arrays.stream(output.toString(StandardCharsets.UTF_8).split("[\r\n]+")) + .filter(row -> !row.isBlank()).forEach(row -> logger.debug("{}", row)); logger.warn("Unlocking DB for migration [Done]"); } @@ -156,8 +157,8 @@ public void migrate() logger.info("Executing DB migration ..."); updateCommand.execute(); - Arrays.stream(output.toString().split("[\r\n]+")).filter(row -> !row.isBlank()) - .forEach(row -> logger.debug("{}", row)); + Arrays.stream(output.toString(StandardCharsets.UTF_8).split("[\r\n]+")) + .filter(row -> !row.isBlank()).forEach(row -> logger.debug("{}", row)); logger.info("Executing DB migration [Done]"); } } @@ -214,6 +215,10 @@ public static void retryOnConnectException(int times, Runnable run) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } retryOnConnectException(--times, run); } @@ -226,19 +231,28 @@ else if (cause instanceof UnknownHostException && times > 1) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } retryOnConnectException(--times, run); } - else if (cause instanceof PSQLException p + else if (cause instanceof PSQLException p && p.getServerErrorMessage() != null && POSTGRES_TRY_AGAIN_ERROR_MESSAGES.contains(p.getServerErrorMessage().getMessage()) && times > 1) { - logger.warn("PSQLException ({}): trying again in 5s", p.getServerErrorMessage().getMessage()); + logger.warn("PSQLException ({}): trying again in 5s", + p.getServerErrorMessage() != null ? p.getServerErrorMessage().getMessage() : "?"); try { Thread.sleep(5_000); } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } retryOnConnectException(--times, run); } diff --git a/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/jetty/HttpClientWithGetRetry.java b/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/jetty/HttpClientWithGetRetry.java index 3793f39f2..07c5a0a48 100644 --- a/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/jetty/HttpClientWithGetRetry.java +++ b/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/jetty/HttpClientWithGetRetry.java @@ -75,6 +75,10 @@ public ContentResponse GETWithRetryOnConnectException(int times, URI uri) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } return GETWithRetryOnConnectException(--times, uri); @@ -90,6 +94,10 @@ else if (cause instanceof UnknownHostException && times > 1) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } return GETWithRetryOnConnectException(--times, uri); diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/BinaryDaoJdbc.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/BinaryDaoJdbc.java index f98aa6fc3..08b5a26a8 100755 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/BinaryDaoJdbc.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/BinaryDaoJdbc.java @@ -272,6 +272,7 @@ public void stopLargeObjectUnlinker() catch (InterruptedException ex) { loUnlinker.shutdownNow(); + Thread.currentThread().interrupt(); } } } diff --git a/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/SnapshotGeneratorImpl.java b/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/SnapshotGeneratorImpl.java index e8fc7db6b..e811c2ef6 100755 --- a/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/SnapshotGeneratorImpl.java +++ b/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/SnapshotGeneratorImpl.java @@ -67,8 +67,8 @@ public SnapshotWithValidationMessages generateSnapshot(StructureDefinition diffe String baseAbsoluteUrlPrefix) { if (differential == null) - return new SnapshotWithValidationMessages(differential, List.of(new ValidationMessage(null, - IssueType.PROCESSING, null, "StructureDefinition is null", IssueSeverity.ERROR))); + return new SnapshotWithValidationMessages(null, List.of(new ValidationMessage(null, IssueType.PROCESSING, + null, "StructureDefinition is null", IssueSeverity.ERROR))); if (!differential.hasBaseDefinition()) return new SnapshotWithValidationMessages(differential, List.of(new ValidationMessage(null, IssueType.PROCESSING, null, "StructureDefinition.baseDefinition missing", IssueSeverity.ERROR))); diff --git a/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/ValidationSupportRule.java b/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/ValidationSupportRule.java index b76ea1631..d36d9f299 100644 --- a/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/ValidationSupportRule.java +++ b/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/ValidationSupportRule.java @@ -151,7 +151,7 @@ private void warnForDeprecatedResources(String resource, List file) } catch (IOException e) { - logger.warn("FHIR resource " + f + " is deprecated, unable to read replacement message: {}", + logger.warn("FHIR resource {} is deprecated, unable to read replacement message: {}", f, e.getMessage()); } }); diff --git a/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java b/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java index 17c547584..bc4dc44ce 100644 --- a/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java +++ b/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractFhirWebserviceClientJerseyWithRetry.java @@ -64,7 +64,7 @@ else if (nTimes != RetryClient.RETRY_FOREVER) { if (tryNumber < nTimes || nTimes == RetryClient.RETRY_FOREVER) { - logger.warn("Caught {} - {}; trying again in {}s{}", e.getClass(), e.getMessage(), + logger.warn("Caught {} - {}; trying again in {}s{}", e.getClass().getName(), e.getMessage(), delay.toSeconds(), nTimes == RetryClient.RETRY_FOREVER ? " (retry " + (tryNumber + 1) + ")" : ""); @@ -74,11 +74,15 @@ else if (nTimes != RetryClient.RETRY_FOREVER) } catch (InterruptedException e1) { + logger.warn("Thread interrupted; not trying again"); + Thread.currentThread().interrupt(); + e.addSuppressed(e1); + throw e; } } else { - logger.warn("Caught {} - {}; not trying again", e.getClass(), e.getMessage()); + logger.warn("Caught {} - {}; not trying again", e.getClass().getName(), e.getMessage()); } if (caughtException != null) diff --git a/dsf-fhir/dsf-fhir-websocket-client/src/main/java/dev/dsf/fhir/client/WebsocketClientTyrus.java b/dsf-fhir/dsf-fhir-websocket-client/src/main/java/dev/dsf/fhir/client/WebsocketClientTyrus.java index f66f58ea1..8e5373077 100755 --- a/dsf-fhir/dsf-fhir-websocket-client/src/main/java/dev/dsf/fhir/client/WebsocketClientTyrus.java +++ b/dsf-fhir/dsf-fhir-websocket-client/src/main/java/dev/dsf/fhir/client/WebsocketClientTyrus.java @@ -187,7 +187,7 @@ private ClientEndpointConfig createConfig(String userAgentValue) ClientEndpointConfig.Configurator configurator = new ClientEndpointConfig.Configurator() { @Override - public void beforeRequest(Map> headers) + public void beforeRequest(Map> headers) { headers.put(HttpHeaders.USER_AGENT, List.of(userAgentValue)); } From 345fc2c3a1d0a065ce614331fce9e7e2601689dd Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Thu, 9 Apr 2026 01:42:36 +0200 Subject: [PATCH 5/7] removed not needed null checks newInputStream throws FileNotFoundException --- .../dev/dsf/fhir/validation/StructureDefinitionReader.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/StructureDefinitionReader.java b/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/StructureDefinitionReader.java index a2b51eb59..3f86f6fd1 100755 --- a/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/StructureDefinitionReader.java +++ b/dsf-fhir/dsf-fhir-validation/src/main/java/dev/dsf/fhir/validation/StructureDefinitionReader.java @@ -112,9 +112,6 @@ private StructureDefinition doReadXml(Path xmlPath) { try (InputStream in = Files.newInputStream(xmlPath)) { - if (in == null) - logger.warn("File {} not found", xmlPath); - return context.newXmlParser().parseResource(StructureDefinition.class, in); } catch (DataFormatException | IOException e) @@ -127,9 +124,6 @@ private StructureDefinition doReadXmlAndReplaceVersion(Path xmlPath, String vers { try (InputStream in = Files.newInputStream(xmlPath)) { - if (in == null) - logger.warn("File {} not found", xmlPath); - String read = IOUtils.toString(in, StandardCharsets.UTF_8); read = replaceVersionAndDate(read, version, date); From 0ac93a03bd254306fc9a4ff152fb96e8d9013450 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Thu, 9 Apr 2026 01:44:47 +0200 Subject: [PATCH 6/7] improved float value comparison --- .../src/main/java/dev/dsf/fhir/adapter/ResourceBinary.java | 2 +- .../src/main/java/dev/dsf/fhir/adapter/SearchSetBinary.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceBinary.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceBinary.java index 3f4bc42b9..d9af98bfd 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceBinary.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceBinary.java @@ -70,7 +70,7 @@ private String toDataSize(Binary resource) unitIndex++; } - if (value == (long) value) + if (Math.abs(value - (long) value) < .0000001) return String.format("%d %s", (long) value, UNITS[unitIndex]); else return String.format("%.2f %s", value, UNITS[unitIndex]); diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchSetBinary.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchSetBinary.java index 3a90c4652..242b33588 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchSetBinary.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchSetBinary.java @@ -66,7 +66,7 @@ private String toDataSize(Binary resource) unitIndex++; } - if (value == (long) value) + if (Math.abs(value - (long) value) < .0000001) return String.format("%d %s", (long) value, UNITS[unitIndex]); else return String.format("%.2f %s", value, UNITS[unitIndex]); From 4fac13a31367afba549b477695e656c021a7e639 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Thu, 9 Apr 2026 01:45:10 +0200 Subject: [PATCH 7/7] added missing expectTrue(...) test case --- .../dev/dsf/bpe/test/service/QuestionnaireTestAnswer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/QuestionnaireTestAnswer.java b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/QuestionnaireTestAnswer.java index 33d4b3758..33e72c403 100644 --- a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/QuestionnaireTestAnswer.java +++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/QuestionnaireTestAnswer.java @@ -162,9 +162,9 @@ else if ("identifiers".equals(type)) expectNotNull(idExts); expectSame(3, idExts.size()); - idExts.stream().filter(Extension::hasValue).filter(e -> e.getValue() instanceof Identifier) + expectTrue(idExts.stream().filter(Extension::hasValue).filter(e -> e.getValue() instanceof Identifier) .map(e -> (Identifier) e.getValue()).map(Identifier::getSystem) - .allMatch(NamingSystems.PractitionerIdentifier.SID::equals); + .allMatch(NamingSystems.PractitionerIdentifier.SID::equals)); List values = idExts.stream().filter(Extension::hasValue) .filter(e -> e.getValue() instanceof Identifier).map(e -> (Identifier) e.getValue())