diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 91958b916..4af316c2d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,7 +51,7 @@ jobs: java-version: 25 cache: 'maven' - name: Initialize CodeQL - uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/init@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -60,7 +60,7 @@ jobs: if: ${{ matrix.language == 'java-kotlin' }} run: mvn package $MVN_BATCH_MODE_FAIL_AT_END $MVN_SKIP_MOST -DskipTests - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/analyze@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0 with: category: "/language:${{matrix.language}}" @@ -185,18 +185,18 @@ jobs: name: quick_build path: ./ - name: Set up Buildx - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Build Docker image run: docker build -t ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}:${{ github.sha }} ${{ matrix.image.context }} - name: Scan Docker image with Trivy - uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 + uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 with: image-ref: ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}:${{ github.sha }} format: 'sarif' output: 'trivy-results-${{ matrix.image.name }}.sarif' trivyignores: './.trivyignore' - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/upload-sarif@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4.36.0 if: always() with: sarif_file: 'trivy-results-${{ matrix.image.name }}.sarif' @@ -232,17 +232,17 @@ jobs: name: quick_build path: ./ - name: Set up QEMU - uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 + uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0 - name: Set up Buildx - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Login to GitHub Container Registry - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Docker metadata - uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 + uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 # v6.1.0 id: meta with: images: ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }} @@ -257,7 +257,7 @@ jobs: # latest only for stable releases # develop builds - name: Build and Push - uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0 + uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 id: push with: push: true @@ -273,7 +273,7 @@ jobs: - name: Generate SBOM run: syft ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}@${DIGEST} -o cyclonedx-json > sbom.json - name: Set up cosign - uses: sigstore/cosign-installer@cad07c2e89fa2edd6e2d7bab4c1aa38e53f76003 # v4.1.1 + uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2 - name: Attach SBOM run: cosign attest --yes --predicate sbom.json --type cyclonedx ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}@${DIGEST} - name: Sign image diff --git a/.trivyignore b/.trivyignore index 1e04d74d0..0cd739a94 100644 --- a/.trivyignore +++ b/.trivyignore @@ -1,3 +1,19 @@ +# +# Copyright 2018-2025 Heilbronn University of Applied Sciences +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# 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. +# + # Ignore reason: Vulnerable code not used in DSF # CVE title: FHIR Validator HTTP service has SSRF via /loadIG Chains with startsWith() Credential Leak for Authentication Token Theft CVE-2026-34361 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 a6b2dd82d..c12afea0e 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml @@ -41,6 +41,12 @@ org.springframework spring-context + + + commons-logging + commons-logging + + com.fasterxml.jackson.core @@ -53,6 +59,7 @@ jakarta.ws.rs-api jakarta.ws.rs + ${jakarta.ws.rs.version.v1} diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml index 0b8674b81..c329060b0 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml @@ -45,18 +45,22 @@ org.glassfish.jersey.core jersey-client + ${jersey.version.v1} org.glassfish.jersey.inject jersey-hk2 + ${jersey.version.v1} org.glassfish.jersey.media jersey-media-json-jackson + ${jersey.version.v1} org.glassfish.jersey.connectors jersey-apache-connector + ${jersey.version.v1} commons-logging @@ -125,17 +129,17 @@ ca.uhn.hapi.fhir - hapi-fhir-structures-r4 + hapi-fhir-base ${hapi.fhir.version.v1} ca.uhn.hapi.fhir - org.hl7.fhir.utilities + hapi-fhir-converter ${hapi.fhir.version.v1} ca.uhn.hapi.fhir - org.hl7.fhir.r4 + hapi-fhir-structures-r4 ${hapi.fhir.version.v1} @@ -145,7 +149,7 @@ ca.uhn.hapi.fhir - hapi-fhir-converter + hapi-fhir-validation-resources-r4 ${hapi.fhir.version.v1} @@ -153,76 +157,120 @@ org.hl7.fhir.convertors ${hapi.fhir.version.v1} + + ca.uhn.hapi.fhir + org.hl7.fhir.r4 + ${hapi.fhir.version.v1} + ca.uhn.hapi.fhir org.hl7.fhir.r5 ${hapi.fhir.version.v1} - net.sf.saxon - Saxon-HE - 9.5.1-5 + ca.uhn.hapi.fhir + org.hl7.fhir.utilities + ${hapi.fhir.version.v1} ca.uhn.hapi.fhir org.hl7.fhir.validation ${hapi.fhir.version.v1} - - + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + org.fhir ucum - com.github.ben-manes.caffeine - caffeine - 2.7.0 + org.glassfish.hk2.external + aopalliance-repackaged + 3.0.6 - org.checkerframework - checker-qual - 2.6.0 + org.glassfish.hk2 + hk2-api + 3.0.6 - com.google.errorprone - error_prone_annotations - 2.3.3 + org.glassfish.hk2 + hk2-locator + 3.0.6 - com.google.code.gson - gson + org.glassfish.hk2 + hk2-utils + 3.0.6 - de.hs-heilbronn.mi - crypto-utils - ${crypto-utils.version.v1} + org.glassfish.hk2 + osgi-resource-locator + 1.0.3 - ca.uhn.hapi.fhir - hapi-fhir-validation-resources-r4 + org.glassfish.jersey.connectors + jersey-apache-connector + ${jersey.version.v1} - ca.uhn.hapi.fhir - hapi-fhir-base - ${hapi.fhir.version.v1} + org.glassfish.jersey.core + jersey-client + ${jersey.version.v1} + + + org.glassfish.jersey.core + jersey-common + ${jersey.version.v1} + + + org.glassfish.jersey.ext + jersey-entity-filtering + ${jersey.version.v1} + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version.v1} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version.v1} org.ow2.asm asm + + com.github.ben-manes.caffeine + caffeine + diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/logging/PluginMdcImpl.java b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/context/PluginContextImpl.java similarity index 87% rename from dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/logging/PluginMdcImpl.java rename to dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/context/PluginContextImpl.java index 90e7abaf3..24c778514 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/logging/PluginMdcImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/context/PluginContextImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package dev.dsf.bpe.v1.logging; +package dev.dsf.bpe.v1.context; import java.util.Objects; import java.util.function.Function; @@ -26,11 +26,11 @@ import org.operaton.bpm.engine.delegate.DelegateExecution; import dev.dsf.bpe.api.Constants; -import dev.dsf.bpe.api.logging.AbstractPluginMdc; +import dev.dsf.bpe.api.context.AbstractPluginContext; import dev.dsf.bpe.v1.constants.CodeSystems.BpmnMessage; import dev.dsf.bpe.v1.variables.Variables; -public class PluginMdcImpl extends AbstractPluginMdc +public class PluginContextImpl extends AbstractPluginContext { private final String serverBaseUrl; private final Function variablesFactory; @@ -43,15 +43,17 @@ public class PluginMdcImpl extends AbstractPluginMdc * not null * @param jar * not null + * @param pluginClassLoader + * not null * @param serverBaseUrl * not null * @param variablesFactory * not null */ - public PluginMdcImpl(int apiVersion, String name, String version, String jar, String serverBaseUrl, - Function variablesFactory) + public PluginContextImpl(int apiVersion, String name, String version, String jar, ClassLoader pluginClassLoader, + String serverBaseUrl, Function variablesFactory) { - super(apiVersion, name, version, jar); + super(apiVersion, name, version, jar, pluginClassLoader); this.serverBaseUrl = Objects.requireNonNull(serverBaseUrl, "serverBaseUrl"); this.variablesFactory = Objects.requireNonNull(variablesFactory, "variablesFactory"); diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/listener/EndListener.java b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/listener/EndListener.java index cd8286824..418d5b0d4 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/listener/EndListener.java +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/listener/EndListener.java @@ -27,20 +27,20 @@ import org.slf4j.LoggerFactory; import dev.dsf.bpe.v1.constants.CodeSystems.BpmnMessage; -import dev.dsf.fhir.client.FhirWebserviceClient; +import dev.dsf.bpe.v1.service.FhirWebserviceClientProvider; public class EndListener extends AbstractListener implements ExecutionListener { private static final Logger logger = LoggerFactory.getLogger(EndListener.class); - private final FhirWebserviceClient webserviceClient; + private final FhirWebserviceClientProvider fhirWebserviceClientProvider; public EndListener(String serverBaseUrl, Function variablesFactory, - FhirWebserviceClient fhirWebserviceClient) + FhirWebserviceClientProvider fhirWebserviceClientProvider) { super(serverBaseUrl, variablesFactory); - this.webserviceClient = fhirWebserviceClient; + this.fhirWebserviceClientProvider = fhirWebserviceClientProvider; } @Override @@ -48,7 +48,7 @@ public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); - Objects.requireNonNull(webserviceClient, "webserviceClient"); + Objects.requireNonNull(fhirWebserviceClientProvider, "fhirWebserviceClientProvider"); } @Override @@ -89,7 +89,7 @@ private void updateAndHandleException(Task task) logger.debug("Updating Task {}, new status: {}", getLocalVersionlessAbsoluteUrl(task), task.getStatus().toCode()); - webserviceClient.withMinimalReturn().update(task); + fhirWebserviceClientProvider.getLocalWebserviceClient().withMinimalReturn().update(task); } catch (Exception e) { diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginImpl.java b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginImpl.java index 5f51e6e03..5fbf847b8 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/plugin/ProcessPluginImpl.java @@ -65,7 +65,7 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; -import dev.dsf.bpe.api.logging.PluginMdc; +import dev.dsf.bpe.api.context.PluginContext; import dev.dsf.bpe.api.plugin.AbstractProcessPlugin; import dev.dsf.bpe.api.plugin.FhirResourceModifier; import dev.dsf.bpe.api.plugin.ProcessPlugin; @@ -78,7 +78,7 @@ import dev.dsf.bpe.v1.constants.CodeSystems.BpmnMessage; import dev.dsf.bpe.v1.constants.NamingSystems.OrganizationIdentifier; import dev.dsf.bpe.v1.constants.NamingSystems.TaskIdentifier; -import dev.dsf.bpe.v1.logging.PluginMdcImpl; +import dev.dsf.bpe.v1.context.PluginContextImpl; import dev.dsf.bpe.v1.variables.FhirResourceValues; import dev.dsf.bpe.v1.variables.VariablesImpl; @@ -89,7 +89,7 @@ public class ProcessPluginImpl extends AbstractProcessPlugin imple private final ProcessPluginDefinition processPluginDefinition; private final ProcessPluginApi processPluginApi; - private final PluginMdcImpl pluginMdc; + private final PluginContextImpl pluginContext; public ProcessPluginImpl(ProcessPluginDefinition processPluginDefinition, int processPluginApiVersion, boolean draft, Path jarFile, ClassLoader classLoader, ConfigurableEnvironment environment, @@ -103,14 +103,15 @@ public ProcessPluginImpl(ProcessPluginDefinition processPluginDefinition, int pr this.processPluginDefinition = processPluginDefinition; processPluginApi = apiApplicationContext.getBean(ProcessPluginApi.class); - pluginMdc = new PluginMdcImpl(processPluginApiVersion, processPluginDefinition.getName(), - processPluginDefinition.getVersion(), jarFile.toString(), serverBaseUrl, VariablesImpl::new); + pluginContext = new PluginContextImpl(processPluginApiVersion, processPluginDefinition.getName(), + processPluginDefinition.getVersion(), jarFile.toString(), classLoader, serverBaseUrl, + VariablesImpl::new); } @Override - public PluginMdc getPluginMdc() + public PluginContext getPluginContext() { - return pluginMdc; + return pluginContext; } @Override diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/spring/ApiServiceConfig.java b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/spring/ApiServiceConfig.java index b12b93666..e72907d0f 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/spring/ApiServiceConfig.java +++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/src/main/java/dev/dsf/bpe/v1/spring/ApiServiceConfig.java @@ -193,8 +193,7 @@ public ExecutionListener startListener() @Bean public ExecutionListener endListener() { - return new EndListener(dsfClientConfig.getLocalConfig().getBaseUrl(), VariablesImpl::new, - clientProvider().getLocalWebserviceClient()); + return new EndListener(dsfClientConfig.getLocalConfig().getBaseUrl(), VariablesImpl::new, clientProvider()); } @Bean diff --git a/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml index 95816cf97..a9fdfe244 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml @@ -49,6 +49,12 @@ org.springframework spring-context + + + commons-logging + commons-logging + + com.fasterxml.jackson.core @@ -61,6 +67,7 @@ jakarta.ws.rs-api jakarta.ws.rs + ${jakarta.ws.rs.version.v1} diff --git a/dsf-bpe/dsf-bpe-process-api-v1/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1/pom.xml index 328e41ef5..a71100676 100644 --- a/dsf-bpe/dsf-bpe-process-api-v1/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v1/pom.xml @@ -50,6 +50,12 @@ org.springframework spring-context + + + commons-logging + commons-logging + + com.fasterxml.jackson.core @@ -62,6 +68,7 @@ jakarta.ws.rs-api jakarta.ws.rs + ${jakarta.ws.rs.version.v1} @@ -86,6 +93,18 @@ commons-logging commons-logging + + net.sf.saxon + Saxon-HE + + + xpp3 + xpp3 + + + xpp3 + xpp3_xpath + diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml b/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml index a04f585fb..6718c7892 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml @@ -45,18 +45,22 @@ org.glassfish.jersey.core jersey-client + ${jersey.version.v2} org.glassfish.jersey.inject jersey-hk2 + ${jersey.version.v2} org.glassfish.jersey.media jersey-media-json-jackson + ${jersey.version.v2} org.glassfish.jersey.connectors - jersey-apache-connector + jersey-apache5-connector + ${jersey.version.v2} commons-logging @@ -86,13 +90,14 @@ ca.uhn.hapi.fhir hapi-fhir-validation-resources-r4 ${hapi.fhir.version.v2} + + + io.opentelemetry + opentelemetry-api + + - - com.auth0 - java-jwt - - de.hs-heilbronn.mi crypto-utils @@ -135,173 +140,149 @@ dsf-bpe-process-api-v2-impl - de.hs-heilbronn.mi - crypto-utils - ${crypto-utils.version.v2} + ca.uhn.hapi.fhir + hapi-fhir-base + ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - hapi-fhir-structures-r4 + hapi-fhir-caching-api ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - org.hl7.fhir.utilities - ${hapi.fhir.org.hl7.version.v2} + hapi-fhir-caching-api + ${hapi.fhir.version.v2} - com.ibm.icu - icu4j - 77.1 + ca.uhn.hapi.fhir + hapi-fhir-caching-caffeine + ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - org.hl7.fhir.r4 - ${hapi.fhir.org.hl7.version.v2} + hapi-fhir-client + ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - hapi-fhir-caching-api + hapi-fhir-converter ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - hapi-fhir-validation + hapi-fhir-structures-r4 ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - hapi-fhir-converter + hapi-fhir-structures-r5 ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - org.hl7.fhir.convertors - ${hapi.fhir.org.hl7.version.v2} + hapi-fhir-validation + ${hapi.fhir.version.v2} - org.xerial - sqlite-jdbc - 3.50.3.0 + ca.uhn.hapi.fhir + hapi-fhir-validation-resources-r4 + ${hapi.fhir.version.v2} ca.uhn.hapi.fhir - org.hl7.fhir.validation + org.hl7.fhir.convertors ${hapi.fhir.org.hl7.version.v2} ca.uhn.hapi.fhir - org.hl7.fhir.r5 + org.hl7.fhir.model ${hapi.fhir.org.hl7.version.v2} - com.nimbusds - nimbus-jose-jwt - 10.0.2 - - - net.sourceforge.plantuml - plantuml-mit - 1.2023.9 - - - net.sf.saxon - Saxon-HE - 11.6 - - - - jakarta-regexp - jakarta-regexp - 1.4 + ca.uhn.hapi.fhir + org.hl7.fhir.r4 + ${hapi.fhir.org.hl7.version.v2} - org.apache.commons - commons-compress + ca.uhn.hapi.fhir + org.hl7.fhir.r5 + ${hapi.fhir.org.hl7.version.v2} - org.tukaani - xz + ca.uhn.hapi.fhir + org.hl7.fhir.support + ${hapi.fhir.org.hl7.version.v2} - org.fhir - ucum + ca.uhn.hapi.fhir + org.hl7.fhir.utilities + ${hapi.fhir.org.hl7.version.v2} - - com.google.errorprone - error_prone_annotations - 2.41.0 + ca.uhn.hapi.fhir + org.hl7.fhir.validation + ${hapi.fhir.org.hl7.version.v2} - ca.uhn.hapi.fhir - hapi-fhir-structures-r5 - ${hapi.fhir.version.v2} + com.fasterxml.woodstox + woodstox-core + 7.1.0 - ca.uhn.hapi.fhir - hapi-fhir-client - ${hapi.fhir.version.v2} + com.nimbusds + nimbus-jose-jwt - ca.uhn.hapi.fhir - hapi-fhir-validation-resources-r4 - ${hapi.fhir.version.v2} + de.hs-heilbronn.mi + crypto-utils + ${crypto-utils.version.v2} - ca.uhn.hapi.fhir - hapi-fhir-base - ${hapi.fhir.version.v2} + io.opentelemetry + opentelemetry-api + 1.44.1 - ca.uhn.hapi.fhir - hapi-fhir-caching-caffeine - ${hapi.fhir.version.v2} + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + 2.10.0 - ca.uhn.hapi.fhir - hapi-fhir-caching-api - ${hapi.fhir.version.v2} + org.apache.commons + commons-compress - com.github.ben-manes.caffeine - caffeine - 3.1.8 + org.apache.httpcomponents + httpclient + 4.5.14 - org.checkerframework - checker-qual + org.apache.httpcomponents + httpcore + 4.4.16 - com.google.j2objc - j2objc-annotations - 3.1 + org.apache.santuario + xmlsec + 4.0.4 - io.opentelemetry - opentelemetry-api - 1.44.1 + org.apache.tika + tika-core - io.opentelemetry - opentelemetry-context - 1.44.1 + org.codehaus.woodstox + stax2-api + 4.2.2 - io.opentelemetry.instrumentation - opentelemetry-instrumentation-annotations - 2.10.0 + org.fhir + ucum - org.apache.tika - tika-core + org.tukaani + xz 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 6f10ecc35..938e80cba 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 @@ -19,8 +19,8 @@ import java.time.Duration; import java.util.function.Supplier; -import org.apache.http.conn.ConnectTimeoutException; -import org.apache.http.conn.HttpHostConnectException; +import org.apache.hc.client5.http.ConnectTimeoutException; +import org.apache.hc.client5.http.HttpHostConnectException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/DsfClientJersey.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/DsfClientJersey.java index db9cc9d4b..e678e05e2 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/DsfClientJersey.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/client/dsf/DsfClientJersey.java @@ -47,7 +47,7 @@ import org.apache.commons.lang3.StringUtils; import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; @@ -227,7 +227,7 @@ else if (trustStore != null && keyStore != null && keyStorePassword != null) builder.sslContext(sslContext); ClientConfig config = new ClientConfig(); - config.connectorProvider(new ApacheConnectorProvider()); + config.connectorProvider(new Apache5ConnectorProvider()); config.property(ClientProperties.PROXY_URI, proxySchemeHostPort); config.property(ClientProperties.PROXY_USERNAME, proxyUserName); config.property(ClientProperties.PROXY_PASSWORD, proxyPassword == null ? null : String.valueOf(proxyPassword)); diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/logging/PluginMdcImpl.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/context/PluginContextImpl.java similarity index 87% rename from dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/logging/PluginMdcImpl.java rename to dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/context/PluginContextImpl.java index 6c537248d..400942b28 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/logging/PluginMdcImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/context/PluginContextImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package dev.dsf.bpe.v2.logging; +package dev.dsf.bpe.v2.context; import java.util.Objects; import java.util.function.Function; @@ -26,11 +26,11 @@ import org.operaton.bpm.engine.delegate.DelegateExecution; import dev.dsf.bpe.api.Constants; -import dev.dsf.bpe.api.logging.AbstractPluginMdc; +import dev.dsf.bpe.api.context.AbstractPluginContext; import dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage; import dev.dsf.bpe.v2.variables.Variables; -public class PluginMdcImpl extends AbstractPluginMdc +public class PluginContextImpl extends AbstractPluginContext { private final String serverBaseUrl; private final Function variablesFactory; @@ -43,15 +43,17 @@ public class PluginMdcImpl extends AbstractPluginMdc * not null * @param jar * not null + * @param pluginClassLoader + * not null * @param serverBaseUrl * not null * @param variablesFactory * not null */ - public PluginMdcImpl(int apiVersion, String name, String version, String jar, String serverBaseUrl, - Function variablesFactory) + public PluginContextImpl(int apiVersion, String name, String version, String jar, ClassLoader pluginClassLoader, + String serverBaseUrl, Function variablesFactory) { - super(apiVersion, name, version, jar); + super(apiVersion, name, version, jar, pluginClassLoader); this.serverBaseUrl = Objects.requireNonNull(serverBaseUrl, "serverBaseUrl"); this.variablesFactory = Objects.requireNonNull(variablesFactory, "variablesFactory"); diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/listener/EndListener.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/listener/EndListener.java index 85c134b34..87039edc7 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/listener/EndListener.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/listener/EndListener.java @@ -26,21 +26,21 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import dev.dsf.bpe.v2.client.dsf.DsfClient; import dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage; +import dev.dsf.bpe.v2.service.DsfClientProvider; public class EndListener extends AbstractListener implements ExecutionListener { private static final Logger logger = LoggerFactory.getLogger(EndListener.class); - private final DsfClient webserviceClient; + private final DsfClientProvider dsfClientProvider; public EndListener(String serverBaseUrl, Function variablesFactory, - DsfClient fhirWebserviceClient) + DsfClientProvider dsfClientProvider) { super(serverBaseUrl, variablesFactory); - this.webserviceClient = fhirWebserviceClient; + this.dsfClientProvider = dsfClientProvider; } @Override @@ -48,7 +48,7 @@ public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); - Objects.requireNonNull(webserviceClient, "webserviceClient"); + Objects.requireNonNull(dsfClientProvider, "dsfClientProvider"); } @Override @@ -89,7 +89,7 @@ private void updateAndHandleException(Task task) logger.debug("Updating Task {}, new status: {}", getLocalVersionlessAbsoluteUrl(task), task.getStatus().toCode()); - webserviceClient.withMinimalReturn().update(task); + dsfClientProvider.getLocal().withMinimalReturn().update(task); } catch (Exception e) { diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginImpl.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginImpl.java index 364e22367..494f878e0 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginImpl.java @@ -75,7 +75,7 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; -import dev.dsf.bpe.api.logging.PluginMdc; +import dev.dsf.bpe.api.context.PluginContext; import dev.dsf.bpe.api.plugin.AbstractProcessPlugin; import dev.dsf.bpe.api.plugin.FhirResourceModifier; import dev.dsf.bpe.api.plugin.FhirResourceModifiers; @@ -103,8 +103,8 @@ import dev.dsf.bpe.v2.constants.CodeSystems.BpmnMessage; import dev.dsf.bpe.v2.constants.NamingSystems.OrganizationIdentifier; import dev.dsf.bpe.v2.constants.NamingSystems.TaskIdentifier; +import dev.dsf.bpe.v2.context.PluginContextImpl; import dev.dsf.bpe.v2.fhir.FhirResourceModifierDelegate; -import dev.dsf.bpe.v2.logging.PluginMdcImpl; import dev.dsf.bpe.v2.variables.FhirResourceValues; import dev.dsf.bpe.v2.variables.Variables; import dev.dsf.bpe.v2.variables.VariablesImpl; @@ -116,7 +116,7 @@ public class ProcessPluginImpl extends AbstractProcessPlugin i private final ProcessPluginDefinition processPluginDefinition; private final Function variablesFactory; - private final PluginMdc pluginMdc; + private final PluginContext pluginContext; private final AtomicReference processPluginApi = new AtomicReference<>(); private final AtomicReference fhirContext = new AtomicReference<>(); @@ -134,9 +134,9 @@ public ProcessPluginImpl(ProcessPluginDefinition processPluginDefinition, int pr this.processPluginDefinition = processPluginDefinition; variablesFactory = delegateExecution -> new VariablesImpl(delegateExecution, getObjectMapper(), - getProcessPluginApi().getDsfClientProvider().getLocal()); - pluginMdc = new PluginMdcImpl(processPluginApiVersion, processPluginDefinition.getName(), - processPluginDefinition.getVersion(), jarFile.toString(), serverBaseUrl, variablesFactory); + getProcessPluginApi().getDsfClientProvider()); + pluginContext = new PluginContextImpl(processPluginApiVersion, processPluginDefinition.getName(), + processPluginDefinition.getVersion(), jarFile.toString(), classLoader, serverBaseUrl, variablesFactory); } @Override @@ -185,9 +185,9 @@ private ObjectMapper getObjectMapper() } @Override - public PluginMdc getPluginMdc() + public PluginContext getPluginContext() { - return pluginMdc; + return pluginContext; } @Override diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/service/StartTaskUpdaterImpl.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/service/StartTaskUpdaterImpl.java index 70f6523b1..3672cfebb 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/service/StartTaskUpdaterImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/service/StartTaskUpdaterImpl.java @@ -27,18 +27,17 @@ import org.hl7.fhir.r4.model.Task.TaskOutputComponent; import org.hl7.fhir.r4.model.Type; -import dev.dsf.bpe.v2.client.dsf.DsfClient; - public class StartTaskUpdaterImpl implements StartTaskUpdater { - private final DsfClient client; + private final DsfClientProvider dsfClientProvider; private final Supplier getStartTask; private final Consumer updateTask; - public StartTaskUpdaterImpl(DsfClient client, Supplier getStartTask, Consumer updateTask) + public StartTaskUpdaterImpl(DsfClientProvider dsfClientProvider, Supplier getStartTask, + Consumer updateTask) { - this.client = Objects.requireNonNull(client, "client"); + this.dsfClientProvider = Objects.requireNonNull(dsfClientProvider, "dsfClientProvider"); this.getStartTask = Objects.requireNonNull(getStartTask, "getStartTask"); this.updateTask = Objects.requireNonNull(updateTask, "updateTask"); @@ -50,7 +49,7 @@ public void addOutput(Coding outputType, Type outputValue) Task task = getStartTask.get(); task.addOutput().setValue(outputValue).getType().addCoding(outputType); - Task updated = client.update(task); + Task updated = dsfClientProvider.getLocal().update(task); updateTask.accept(updated); } @@ -90,7 +89,7 @@ public void modifyOutput(Coding outputType, Type outputValue) + (outputType.hasVersion() ? " (version: " + outputType.getVersion() + ") not found" : ""))) .setValue(outputValue); - Task updated = client.update(task); + Task updated = dsfClientProvider.getLocal().update(task); updateTask.accept(updated); } @@ -110,7 +109,7 @@ public void removeOutput(Coding outputType) task.setOutput(filtered); - Task updated = client.update(task); + Task updated = dsfClientProvider.getLocal().update(task); updateTask.accept(updated); } diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/spring/ApiServiceConfig.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/spring/ApiServiceConfig.java index 66e76bad0..113633a14 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/spring/ApiServiceConfig.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/spring/ApiServiceConfig.java @@ -286,7 +286,7 @@ public JsonHolderSerializer jsonVariableSerializer() @Bean public Function listenerVariablesFactory() { - return execution -> new VariablesImpl(execution, objectMapper(), dsfClientProvider().getLocal()); + return execution -> new VariablesImpl(execution, objectMapper(), dsfClientProvider()); } @Bean @@ -299,7 +299,7 @@ public ExecutionListener startListener() public ExecutionListener endListener() { return new EndListener(dsfClientConfig.getLocalConfig().getBaseUrl(), listenerVariablesFactory(), - dsfClientProvider().getLocal()); + dsfClientProvider()); } @Bean diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java index 39b56d71c..65278619f 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java +++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java @@ -38,9 +38,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import dev.dsf.bpe.api.Constants; -import dev.dsf.bpe.v2.client.dsf.DsfClient; import dev.dsf.bpe.v2.constants.BpmnExecutionVariables; import dev.dsf.bpe.v2.listener.ListenerVariables; +import dev.dsf.bpe.v2.service.DsfClientProvider; import dev.dsf.bpe.v2.service.StartTaskUpdater; import dev.dsf.bpe.v2.service.StartTaskUpdaterImpl; import dev.dsf.bpe.v2.variables.FhirResourceValues.FhirResourceValue; @@ -94,15 +94,15 @@ public int hashCode() * not null * @param objectMapper * not null - * @param client + * @param dsfClientProvider * not null */ - public VariablesImpl(DelegateExecution execution, ObjectMapper objectMapper, DsfClient client) + public VariablesImpl(DelegateExecution execution, ObjectMapper objectMapper, DsfClientProvider dsfClientProvider) { this.execution = Objects.requireNonNull(execution, "execution"); this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper"); - startTaskUpdater = new StartTaskUpdaterImpl(client, this::getStartTask, this::updateTask); + startTaskUpdater = new StartTaskUpdaterImpl(dsfClientProvider, this::getStartTask, this::updateTask); } private JsonHolder toJsonHolder(Object json) diff --git a/dsf-bpe/dsf-bpe-process-api-v2/pom.xml b/dsf-bpe/dsf-bpe-process-api-v2/pom.xml index 0fc973937..bc4a8dfff 100644 --- a/dsf-bpe/dsf-bpe-process-api-v2/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api-v2/pom.xml @@ -37,6 +37,16 @@ ca.uhn.hapi.fhir hapi-fhir-structures-r4 ${hapi.fhir.version.v2} + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + ca.uhn.hapi.fhir @@ -47,16 +57,51 @@ commons-logging commons-logging + + net.sf.saxon + Saxon-HE + + + org.ogce + xpp3 + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + + org.xerial + sqlite-jdbc + + + net.sourceforge.plantuml + plantuml-mit + + + org.commonmark + commonmark + + + org.commonmark + commonmark-ext-gfm-tables + ca.uhn.hapi.fhir hapi-fhir-client ${hapi.fhir.version.v2} + org.springframework spring-context + + + commons-logging + commons-logging + + com.fasterxml.jackson.core @@ -69,6 +114,7 @@ jakarta.ws.rs-api jakarta.ws.rs + ${jakarta.ws.rs.version.v2} \ No newline at end of file diff --git a/dsf-bpe/dsf-bpe-process-api/pom.xml b/dsf-bpe/dsf-bpe-process-api/pom.xml index 0205d2748..f8352bfa5 100644 --- a/dsf-bpe/dsf-bpe-process-api/pom.xml +++ b/dsf-bpe/dsf-bpe-process-api/pom.xml @@ -46,10 +46,12 @@ org.springframework spring-context - - - com.auth0 - java-jwt + + + commons-logging + commons-logging + + \ No newline at end of file diff --git a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/logging/AbstractPluginMdc.java b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/context/AbstractPluginContext.java similarity index 60% rename from dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/logging/AbstractPluginMdc.java rename to dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/context/AbstractPluginContext.java index eb3672d5b..e6a846901 100644 --- a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/logging/AbstractPluginMdc.java +++ b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/context/AbstractPluginContext.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package dev.dsf.bpe.api.logging; +package dev.dsf.bpe.api.context; import java.util.Objects; import java.util.function.Consumer; @@ -23,7 +23,7 @@ import org.operaton.bpm.engine.delegate.DelegateTask; import org.slf4j.MDC; -public abstract class AbstractPluginMdc implements PluginMdc +public abstract class AbstractPluginContext implements PluginContext { public static final String DSF_PLUGIN_API = "dsf.plugin.api"; public static final String DSF_PLUGIN_JAR = "dsf.plugin.jar"; @@ -42,6 +42,7 @@ public abstract class AbstractPluginMdc implements PluginMdc private final String jar; private final String name; private final String version; + private final ClassLoader pluginClassLoader; /** * @param apiVersion @@ -51,13 +52,16 @@ public abstract class AbstractPluginMdc implements PluginMdc * not null * @param jar * not null + * @param pluginClassLoader + * not null */ - public AbstractPluginMdc(int apiVersion, String name, String version, String jar) + public AbstractPluginContext(int apiVersion, String name, String version, String jar, ClassLoader pluginClassLoader) { this.apiVersion = apiVersion; this.name = Objects.requireNonNull(name, "name"); this.version = Objects.requireNonNull(version, "version"); this.jar = Objects.requireNonNull(jar, "jar"); + this.pluginClassLoader = Objects.requireNonNull(pluginClassLoader, "pluginClassLoader"); } private void putPluginMdc() @@ -115,44 +119,81 @@ public static final record ProcessValues(String processUrl, String startTaskUrl, protected abstract ProcessValues getProcessValues(DelegateExecution delegateExecution); @Override - public void executeWithProcessMdc(DelegateTask delegateTask, Consumer executable) + public void executeWithProcessContext(DelegateTask delegateTask, Consumer executable) { - putPluginMdc(); - putProcessMdc(delegateTask.getExecution()); - - try - { - executable.accept(delegateTask); - } - finally - { - removePluginMdc(); - removeProcessMdc(); - } + withPluginClassLoader(withProcessMdc(delegateTask, executable)); } @Override - public void executeWithProcessMdc(DelegateExecution delegateExecution, + public void executeWithProcessContext(DelegateExecution delegateExecution, ConsumerWithException executable) throws Exception { - putPluginMdc(); - putProcessMdc(delegateExecution); + withPluginClassLoader(withProcessMdc(delegateExecution, executable)); + } - try + @Override + public void executeWithPluginContext(Runnable runnable) + { + withPluginClassLoader(withPluginMdc(runnable)); + } + + @Override + public boolean executeWithPluginContext(Supplier supplier) + { + return withPluginClassLoader(withPluginMdc(supplier)); + } + + @FunctionalInterface + private interface RunnableWithException + { + void run() throws Exception; + } + + private Supplier withProcessMdc(DelegateTask delegateTask, Consumer executable) + { + return () -> { - executable.accept(delegateExecution); - } - finally + putPluginMdc(); + putProcessMdc(delegateTask.getExecution()); + + try + { + executable.accept(delegateTask); + } + finally + { + removeProcessMdc(); + removePluginMdc(); + } + + return null; + }; + } + + private RunnableWithException withProcessMdc(DelegateExecution delegateExecution, + ConsumerWithException executable) throws Exception + { + return () -> { - removePluginMdc(); - removeProcessMdc(); - } + putPluginMdc(); + putProcessMdc(delegateExecution); + + try + { + executable.accept(delegateExecution); + } + finally + { + removeProcessMdc(); + removePluginMdc(); + } + }; } - @Override - public void executeWithPluginMdc(Runnable runnable) + private void withPluginClassLoader(RunnableWithException runnable) throws Exception { - putPluginMdc(); + ClassLoader old = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(pluginClassLoader); try { @@ -160,14 +201,50 @@ public void executeWithPluginMdc(Runnable runnable) } finally { - removePluginMdc(); + Thread.currentThread().setContextClassLoader(old); } } - @Override - public boolean executeWithPluginMdc(Supplier supplier) + private Supplier withPluginMdc(Runnable runnable) + { + return () -> + { + putPluginMdc(); + + try + { + runnable.run(); + + return null; + } + finally + { + removePluginMdc(); + } + }; + } + + private Supplier withPluginMdc(Supplier supplier) + { + return () -> + { + putPluginMdc(); + + try + { + return supplier.get(); + } + finally + { + removePluginMdc(); + } + }; + } + + private T withPluginClassLoader(Supplier supplier) { - putPluginMdc(); + ClassLoader old = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(pluginClassLoader); try { @@ -175,7 +252,7 @@ public boolean executeWithPluginMdc(Supplier supplier) } finally { - removePluginMdc(); + Thread.currentThread().setContextClassLoader(old); } } } diff --git a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/logging/PluginMdc.java b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/context/PluginContext.java similarity index 69% rename from dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/logging/PluginMdc.java rename to dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/context/PluginContext.java index 5b1796733..e1c2012e3 100644 --- a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/logging/PluginMdc.java +++ b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/context/PluginContext.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package dev.dsf.bpe.api.logging; +package dev.dsf.bpe.api.context; import java.util.function.Consumer; import java.util.function.Supplier; @@ -21,7 +21,7 @@ import org.operaton.bpm.engine.delegate.DelegateExecution; import org.operaton.bpm.engine.delegate.DelegateTask; -public interface PluginMdc +public interface PluginContext { @FunctionalInterface public interface ConsumerWithException @@ -29,12 +29,12 @@ public interface ConsumerWithException void accept(T t) throws Exception; } - void executeWithProcessMdc(DelegateTask delegateTask, Consumer executable); + void executeWithProcessContext(DelegateTask delegateTask, Consumer executable); - void executeWithProcessMdc(DelegateExecution delegateExecution, ConsumerWithException executable) - throws Exception; + void executeWithProcessContext(DelegateExecution delegateExecution, + ConsumerWithException executable) throws Exception; - void executeWithPluginMdc(Runnable runnable); + void executeWithPluginContext(Runnable runnable); - boolean executeWithPluginMdc(Supplier supplier); + boolean executeWithPluginContext(Supplier supplier); } \ No newline at end of file diff --git a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPlugin.java b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPlugin.java index 6ebd0ac85..9a28db3af 100644 --- a/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPlugin.java +++ b/dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/ProcessPlugin.java @@ -29,7 +29,7 @@ import org.operaton.bpm.engine.variable.value.PrimitiveValue; import org.springframework.context.ApplicationContext; -import dev.dsf.bpe.api.logging.PluginMdc; +import dev.dsf.bpe.api.context.PluginContext; public interface ProcessPlugin { @@ -47,7 +47,7 @@ public interface ProcessPlugin ApplicationContext getApplicationContext(); - PluginMdc getPluginMdc(); + PluginContext getPluginContext(); @SuppressWarnings("rawtypes") Stream getTypedValueSerializers(); diff --git a/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile b/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile index 59dbbc118..dc38732ab 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:4ffb3a1511099754cddc70eb1b12e50ffdb67619aa0ab6c13fcd800a78ef7c7a AS builder +FROM docker.io/library/debian:trixie-slim@sha256:b6e2a152f22a40ff69d92cb397223c906017e1391a73c952b588e51af8883bf8 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:0f843579efd505efb0a0eef1d5a816cc4523ffcad458a54a4e9e52e60c4c030a +FROM docker.io/azul/zulu-openjdk:25-jre-headless@sha256:8cec35879adc3694e3cad2a499f9527c7c788278a923363b09b096a1b28f751c 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-bpe/dsf-bpe-server/pom.xml b/dsf-bpe/dsf-bpe-server/pom.xml index 30c57b695..83fdec40d 100755 --- a/dsf-bpe/dsf-bpe-server/pom.xml +++ b/dsf-bpe/dsf-bpe-server/pom.xml @@ -90,6 +90,7 @@ jakarta.ws.rs jakarta.ws.rs-api + ${jakarta.ws.rs.version} org.glassfish.jaxb @@ -124,7 +125,8 @@ org.glassfish.jersey.connectors - jersey-apache-connector + jersey-apache5-connector + ${jersey.version} commons-logging @@ -136,22 +138,27 @@ org.glassfish.jersey.core jersey-server + ${jersey.version} org.glassfish.jersey.inject jersey-hk2 + ${jersey.version} org.glassfish.jersey.media jersey-media-json-jackson + ${jersey.version} org.glassfish.jersey.media jersey-media-jaxb + ${jersey.version} org.glassfish.jersey.containers jersey-container-servlet + ${jersey.version} @@ -216,6 +223,11 @@ bcmail-jdk18on + + com.auth0 + java-jwt + + com.icegreen greenmail-junit4 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 6ae3bff6a..28eafe155 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 @@ -19,8 +19,8 @@ import java.time.Duration; import java.util.function.Supplier; -import org.apache.http.conn.ConnectTimeoutException; -import org.apache.http.conn.HttpHostConnectException; +import org.apache.hc.client5.http.ConnectTimeoutException; +import org.apache.hc.client5.http.HttpHostConnectException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/WebserviceClientJersey.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/WebserviceClientJersey.java index 99b102af4..f9c531420 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/WebserviceClientJersey.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/dsf/WebserviceClientJersey.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.logging.LoggingFeature; @@ -85,7 +85,7 @@ public WebserviceClientJersey(String baseUrl, KeyStore trustStore, KeyStore keyS .connectTimeout(connectTimeout.toMillis(), TimeUnit.MILLISECONDS); ClientConfig config = new ClientConfig(); - config.connectorProvider(new ApacheConnectorProvider()); + config.connectorProvider(new Apache5ConnectorProvider()); config.property(ClientProperties.PROXY_URI, proxySchemeHostPort); config.property(ClientProperties.PROXY_USERNAME, proxyUserName); config.property(ClientProperties.PROXY_PASSWORD, proxyPassword == null ? null : String.valueOf(proxyPassword)); diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/fhir/FhirConnectionTestClientJersey.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/fhir/FhirConnectionTestClientJersey.java index 6fc28fdd3..2d210c906 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/fhir/FhirConnectionTestClientJersey.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/fhir/FhirConnectionTestClientJersey.java @@ -22,7 +22,7 @@ import java.util.stream.Collectors; import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; @@ -88,7 +88,7 @@ public FhirConnectionTestClientJersey(FhirClientConfig fhirClientConfig, ProxyCo .register((ClientRequestFilter) r -> r.getHeaders().add(HttpHeaders.USER_AGENT, userAgentValue)); ClientConfig config = new ClientConfig(); - config.connectorProvider(new ApacheConnectorProvider()); + config.connectorProvider(new Apache5ConnectorProvider()); if (proxyConfig.isEnabled(fhirClientConfig.baseUrl())) { config.property(ClientProperties.PROXY_URI, proxyConfig.getUrl()); diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/engine/DelegateProviderImpl.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/engine/DelegateProviderImpl.java index c669195c9..bdc262ae5 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/engine/DelegateProviderImpl.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/engine/DelegateProviderImpl.java @@ -155,7 +155,7 @@ private JavaDelegate getJavaDelegate(ProcessIdAndVersion processIdAndVersion, return getPlugin(processIdAndVersion).map(plugin -> { JavaDelegate delegate = getDelegate.apply(plugin); - return (JavaDelegate) e -> plugin.getPluginMdc().executeWithProcessMdc(e, delegate::execute); + return (JavaDelegate) e -> plugin.getPluginContext().executeWithProcessContext(e, delegate::execute); }).orElseGet(() -> e -> stopProcess(processIdAndVersion, e)); } @@ -167,7 +167,7 @@ public ExecutionListener getExecutionListener(ProcessIdAndVersion processIdAndVe return getPlugin(processIdAndVersion).map(plugin -> { ExecutionListener delegate = plugin.getExecutionListener(className, fieldDeclarations, variableScope); - return (ExecutionListener) e -> plugin.getPluginMdc().executeWithProcessMdc(e, delegate::notify); + return (ExecutionListener) e -> plugin.getPluginContext().executeWithProcessContext(e, delegate::notify); }).orElseGet(() -> e -> stopProcess(processIdAndVersion, e)); } @@ -179,7 +179,7 @@ public TaskListener getTaskListener(ProcessIdAndVersion processIdAndVersion, Str return getPlugin(processIdAndVersion). map(plugin -> { TaskListener delegate = plugin.getTaskListener(className, fieldDeclarations, variableScope); - return (TaskListener) e -> plugin.getPluginMdc().executeWithProcessMdc(e, delegate::notify); + return (TaskListener) e -> plugin.getPluginContext().executeWithProcessContext(e, delegate::notify); }).orElseGet(() -> e -> stopProcess(processIdAndVersion, e.getExecution())); } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/listener/DefaultBpmnParseListener.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/listener/DefaultBpmnParseListener.java index a8cd509da..36b26575c 100755 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/listener/DefaultBpmnParseListener.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/listener/DefaultBpmnParseListener.java @@ -150,7 +150,7 @@ public ExecutionListener withMdc(ExecutionListener delegate) ProcessIdAndVersion processKeyAndVersion = new ProcessIdAndVersion(e.getProcessDefinition().getKey(), e.getProcessDefinition().getVersionTag()); - getPlugin(processKeyAndVersion).getPluginMdc().executeWithProcessMdc(execution, delegate::notify); + getPlugin(processKeyAndVersion).getPluginContext().executeWithProcessContext(execution, delegate::notify); }; } } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginManagerImpl.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginManagerImpl.java index ebf7cb61c..2c67ac65b 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginManagerImpl.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/plugin/ProcessPluginManagerImpl.java @@ -118,7 +118,7 @@ public void loadAndDeployPlugins() .forEach(name -> Configurator.setLevel(name, Level.DEBUG)); List plugins = removeDuplicates( - loadedPlugins.stream().filter(p -> p.getPluginMdc().executeWithPluginMdc( + loadedPlugins.stream().filter(p -> p.getPluginContext().executeWithPluginContext( () -> p.initializeAndValidateResources(localOrganizationIdentifierValue.orElse(null))))); if (plugins.isEmpty()) @@ -224,7 +224,7 @@ private void onProcessesDeployed(List changes, List

EnumSet.of(ProcessState.ACTIVE, ProcessState.DRAFT).contains(c.getNewProcessState())) .map(ProcessStateChangeOutcome::getProcessKeyAndVersion).collect(Collectors.toSet()); - plugins.stream().forEach(p -> p.getPluginMdc().executeWithPluginMdc( + plugins.stream().forEach(p -> p.getPluginContext().executeWithPluginContext( () -> p.getProcessPluginDeploymentListener().onProcessesDeployed(activeProcesses))); } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/webservice/ProcessService.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/webservice/ProcessService.java index 940826777..099c08bce 100755 --- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/webservice/ProcessService.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/webservice/ProcessService.java @@ -48,7 +48,6 @@ import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response.Status; import jakarta.ws.rs.core.StreamingOutput; -import net.sf.saxon.lib.FeatureKeys; @RolesAllowed("ADMIN") @Path(ProcessService.PATH) @@ -72,7 +71,6 @@ public ProcessService(ThymeleafTemplateService templateService, RepositoryServic try { transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - transformerFactory.setFeature(FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS, false); } catch (TransformerConfigurationException e) { diff --git a/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v1/allowed-bpe-classes.list b/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v1/allowed-bpe-classes.list index 7424a123d..1e09ee1ee 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v1/allowed-bpe-classes.list +++ b/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v1/allowed-bpe-classes.list @@ -14,15 +14,15 @@ # limitations under the License. # -com.fasterxml.jackson.annotation -com.fasterxml.jackson.core -com.fasterxml.jackson.databind +com.fasterxml.jackson com.google.common dev.dsf.bpe.api -jakarta.ws.rs +jakarta.activation +jakarta.inject org.apache.commons.codec org.apache.commons.io org.apache.commons.lang3 +org.apache.commons.logging org.apache.commons.text org.apache.http org.bouncycastle diff --git a/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v2/allowed-bpe-classes.list b/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v2/allowed-bpe-classes.list index c60656fbb..b3616eafb 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v2/allowed-bpe-classes.list +++ b/dsf-bpe/dsf-bpe-server/src/main/resources/bpe/api/v2/allowed-bpe-classes.list @@ -14,19 +14,19 @@ # limitations under the License. # -com.fasterxml.jackson.annotation -com.fasterxml.jackson.core -com.fasterxml.jackson.databind -com.fasterxml.jackson.datatype +com.fasterxml.jackson com.google.common com.ctc.wstx.stax.WstxInputFactory dev.dsf.bpe.api +jakarta.activation jakarta.annotation.Nonnull jakarta.annotation.Nullable +jakarta.inject jakarta.ws.rs org.apache.commons.codec org.apache.commons.io org.apache.commons.lang3 +org.apache.commons.logging org.apache.commons.text org.apache.http org.bouncycastle diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/DsfClientTest.java b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/DsfClientTest.java index afd92168e..72dad72f6 100644 --- a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/DsfClientTest.java +++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/DsfClientTest.java @@ -172,7 +172,7 @@ public void searchAsyncUrl(ProcessPluginApi api) throws Exception Optional client = api.getDsfClientProvider().getById("test-fhir-data-server"); expectTrue(client.isPresent()); - CompletableFuture fBundle = client.get().searchAsync(client.get().getBaseUrl() + "/Patient"); + CompletableFuture fBundle = client.get().searchAsync(client.get().getBaseUrl() + "Patient"); expectNotNull(fBundle); Bundle bundle = fBundle.get(); @@ -201,7 +201,7 @@ public void searchAsyncUrlStrict(ProcessPluginApi api) throws Exception expectTrue(client.isPresent()); CompletableFuture fBundle = client.get() - .searchAsyncWithStrictHandling(client.get().getBaseUrl() + "/Patient"); + .searchAsyncWithStrictHandling(client.get().getBaseUrl() + "Patient"); expectNotNull(fBundle); Bundle bundle = fBundle.get(); diff --git a/dsf-common/dsf-common-auth/pom.xml b/dsf-common/dsf-common-auth/pom.xml index a7b809b77..d7eb7fcfd 100644 --- a/dsf-common/dsf-common-auth/pom.xml +++ b/dsf-common/dsf-common-auth/pom.xml @@ -37,6 +37,16 @@ ca.uhn.hapi.fhir hapi-fhir-structures-r4 ${hapi.fhir.version} + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + + io.opentelemetry + opentelemetry-api + + org.yaml @@ -55,15 +65,23 @@ jakarta.ws.rs jakarta.ws.rs-api + ${jakarta.ws.rs.version} jakarta.annotation jakarta.annotation-api + ${jakarta.annotation.api.version} org.springframework spring-beans + + + commons-logging + commons-logging + + org.bouncycastle diff --git a/dsf-common/dsf-common-config/pom.xml b/dsf-common/dsf-common-config/pom.xml index 5f5f2b5b4..fbee5a783 100644 --- a/dsf-common/dsf-common-config/pom.xml +++ b/dsf-common/dsf-common-config/pom.xml @@ -36,6 +36,12 @@ org.springframework spring-beans + + + commons-logging + commons-logging + + de.hs-heilbronn.mi diff --git a/dsf-common/dsf-common-docker-secrets-reader/pom.xml b/dsf-common/dsf-common-docker-secrets-reader/pom.xml index 87ac31219..0659f22b7 100644 --- a/dsf-common/dsf-common-docker-secrets-reader/pom.xml +++ b/dsf-common/dsf-common-docker-secrets-reader/pom.xml @@ -36,6 +36,12 @@ org.springframework spring-core + + + commons-logging + commons-logging + + org.slf4j diff --git a/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jConfiguration.java b/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jConfiguration.java index e8c9ca909..3e08ab356 100644 --- a/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jConfiguration.java +++ b/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jConfiguration.java @@ -60,17 +60,17 @@ public Log4jTextLayout(boolean color) public StringLayout consoleLayout(Configuration configuration) { if (color) - return PatternLayout.newBuilder().withPattern( + return PatternLayout.newBuilder().setPattern( "%highlight{%p %t - %C{1}.%M(%L) | %m}{FATAL=red, ERROR=red, WARN=yellow, INFO=white, DEBUG=white, TRACE=white}%n") .build(); else - return PatternLayout.newBuilder().withPattern("%p %t - %C{1}.%M(%L) | %m%n").build(); + return PatternLayout.newBuilder().setPattern("%p %t - %C{1}.%M(%L) | %m%n").build(); } @Override public StringLayout fileLayout(Configuration configuration) { - return PatternLayout.newBuilder().withPattern("%d [%t] %-5p %c - %m%n").build(); + return PatternLayout.newBuilder().setPattern("%d [%t] %-5p %c - %m%n").build(); } } @@ -87,17 +87,17 @@ public Log4jTextMdcLayout(boolean color) public StringLayout consoleLayout(Configuration configuration) { if (color) - return PatternLayout.newBuilder().withPattern( + return PatternLayout.newBuilder().setPattern( "%highlight{%p %t - %C{1}.%M(%L)%notEmpty{ - %X} | %m}{FATAL=red, ERROR=red, WARN=yellow, INFO=white, DEBUG=white, TRACE=white}%n") .build(); else - return PatternLayout.newBuilder().withPattern("%p %t - %C{1}.%M(%L)%notEmpty{ - %X} | %m%n").build(); + return PatternLayout.newBuilder().setPattern("%p %t - %C{1}.%M(%L)%notEmpty{ - %X} | %m%n").build(); } @Override public StringLayout fileLayout(Configuration configuration) { - return PatternLayout.newBuilder().withPattern("%d [%t] %-5p %c%notEmpty{ - %X} - %m%n").build(); + return PatternLayout.newBuilder().setPattern("%d [%t] %-5p %c%notEmpty{ - %X} - %m%n").build(); } } @@ -180,11 +180,10 @@ public Log4jConfiguration(LoggerContext loggerContext, String name, String fileN if (fileEnabled) { - Appender file = RollingFileAppender.newBuilder().setName("FILE") - .withFileName("log/" + fileNamePart + ".log") - .withFilePattern("log/" + fileNamePart + "_%d{yyyy-MM-dd}_%i.log.gz").setIgnoreExceptions(false) + Appender file = RollingFileAppender.newBuilder().setName("FILE").setFileName("log/" + fileNamePart + ".log") + .setFilePattern("log/" + fileNamePart + "_%d{yyyy-MM-dd}_%i.log.gz").setIgnoreExceptions(false) .setLayout(fileLayout.fileLayout(this)) - .withPolicy(CompositeTriggeringPolicy.createPolicy(OnStartupTriggeringPolicy.createPolicy(1), + .setPolicy(CompositeTriggeringPolicy.createPolicy(OnStartupTriggeringPolicy.createPolicy(1), TimeBasedTriggeringPolicy.newBuilder().build())) .build(); addAppender(file); @@ -246,10 +245,10 @@ private Appender createFileAppender(String appenderName, String fileNamePart, St return null; return RollingFileAppender.newBuilder().setName(appenderName + ".FILE") - .withFileName("log/" + fileNamePart + ".log") - .withFilePattern("log/" + fileNamePart + "_%d{yyyy-MM-dd}_%i.log.gz").setIgnoreExceptions(false) + .setFileName("log/" + fileNamePart + ".log") + .setFilePattern("log/" + fileNamePart + "_%d{yyyy-MM-dd}_%i.log.gz").setIgnoreExceptions(false) .setLayout(layout) - .withPolicy(CompositeTriggeringPolicy.createPolicy(OnStartupTriggeringPolicy.createPolicy(1), + .setPolicy(CompositeTriggeringPolicy.createPolicy(OnStartupTriggeringPolicy.createPolicy(1), TimeBasedTriggeringPolicy.newBuilder().build())) .build(); } diff --git a/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jInitializer.java b/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jInitializer.java index 0ed1b28da..f3952d201 100644 --- a/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jInitializer.java +++ b/dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jInitializer.java @@ -240,9 +240,9 @@ else if (STYLE_JSON_LOGSTASH.equalsIgnoreCase(value)) return configuration -> JsonTemplateLayout.newBuilder().setConfiguration(configuration) .setEventTemplateUri(TemplateUri.LOGSTASH.getUri()).build(); else if (STYLE_TEXT.equalsIgnoreCase(value)) - return _ -> PatternLayout.newBuilder().withPattern("%d %m%n").build(); + return _ -> PatternLayout.newBuilder().setPattern("%d %m%n").build(); else if (STYLE_TEXT_MDC.equalsIgnoreCase(value)) - return _ -> PatternLayout.newBuilder().withPattern("%d%notEmpty{ %X} %m%n").build(); + return _ -> PatternLayout.newBuilder().setPattern("%d%notEmpty{ %X} %m%n").build(); else throw new IllegalArgumentException( "Value '" + value + "' for " + PREFIX + parameter + POSTFIX_STYLE + " not supported"); diff --git a/dsf-common/dsf-common-oidc/pom.xml b/dsf-common/dsf-common-oidc/pom.xml index b42aa9a2a..4a4a14ab3 100644 --- a/dsf-common/dsf-common-oidc/pom.xml +++ b/dsf-common/dsf-common-oidc/pom.xml @@ -43,10 +43,12 @@ org.glassfish.jersey.core jersey-client + ${jersey.version} org.glassfish.jersey.connectors - jersey-apache-connector + jersey-apache5-connector + ${jersey.version} commons-logging @@ -57,6 +59,7 @@ org.glassfish.jersey.media jersey-media-json-jackson + ${jersey.version} \ No newline at end of file diff --git a/dsf-common/dsf-common-oidc/src/main/java/dev/dsf/common/oidc/BaseOidcClientJersey.java b/dsf-common/dsf-common-oidc/src/main/java/dev/dsf/common/oidc/BaseOidcClientJersey.java index 81799bc30..05a199254 100644 --- a/dsf-common/dsf-common-oidc/src/main/java/dev/dsf/common/oidc/BaseOidcClientJersey.java +++ b/dsf-common/dsf-common-oidc/src/main/java/dev/dsf/common/oidc/BaseOidcClientJersey.java @@ -24,7 +24,7 @@ import javax.net.ssl.SSLContext; import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.logging.LoggingFeature; @@ -104,7 +104,7 @@ else if (trustStore != null && keyStore != null && keyStorePassword != null) builder = builder.sslContext(sslContext); ClientConfig config = new ClientConfig(); - config.connectorProvider(new ApacheConnectorProvider()); + config.connectorProvider(new Apache5ConnectorProvider()); config.property(ClientProperties.PROXY_URI, proxySchemeHostPort); config.property(ClientProperties.PROXY_USERNAME, proxyUserName); config.property(ClientProperties.PROXY_PASSWORD, proxyPassword == null ? null : String.valueOf(proxyPassword)); diff --git a/dsf-common/dsf-common-status/pom.xml b/dsf-common/dsf-common-status/pom.xml index b8a03f6e1..74ac17bae 100644 --- a/dsf-common/dsf-common-status/pom.xml +++ b/dsf-common/dsf-common-status/pom.xml @@ -40,14 +40,22 @@ jakarta.ws.rs jakarta.ws.rs-api + ${jakarta.ws.rs.version} jakarta.annotation jakarta.annotation-api + ${jakarta.annotation.api.version} org.springframework spring-context + + + commons-logging + commons-logging + + org.apache.commons diff --git a/dsf-common/dsf-common-ui/pom.xml b/dsf-common/dsf-common-ui/pom.xml index 3adb67d79..73bf5a583 100644 --- a/dsf-common/dsf-common-ui/pom.xml +++ b/dsf-common/dsf-common-ui/pom.xml @@ -36,6 +36,7 @@ jakarta.ws.rs jakarta.ws.rs-api + ${jakarta.ws.rs.version} commons-codec diff --git a/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml b/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml index 7cbd9d76b..b5378f93a 100644 --- a/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml +++ b/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml @@ -16,7 +16,7 @@ services: proxy: - image: nginx:1.29 + image: nginx:1.31 restart: "no" ports: - 127.0.0.1:443:443 @@ -38,19 +38,19 @@ services: dic1-fhir-frontend: ipv4_address: 172.20.0.2 dic2-fhir-frontend: - ipv4_address: 172.20.0.10 - dic3-fhir-frontend: ipv4_address: 172.20.0.18 + dic3-fhir-frontend: + ipv4_address: 172.20.0.34 ttp-fhir-frontend: - ipv4_address: 172.20.0.26 + ipv4_address: 172.20.0.50 dic1-bpe-frontend: - ipv4_address: 172.20.0.34 + ipv4_address: 172.20.0.66 dic2-bpe-frontend: - ipv4_address: 172.20.0.42 + ipv4_address: 172.20.0.82 dic3-bpe-frontend: - ipv4_address: 172.20.0.50 + ipv4_address: 172.20.0.98 ttp-bpe-frontend: - ipv4_address: 172.20.0.58 + ipv4_address: 172.20.0.114 internet: aliases: - dic1 @@ -290,7 +290,7 @@ services: DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic2_fhir.secret networks: dic2-fhir-frontend: - ipv4_address: 172.20.0.11 + ipv4_address: 172.20.0.19 dic2-fhir-backend: internet: depends_on: @@ -369,7 +369,7 @@ services: DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic3_fhir.secret networks: dic3-fhir-frontend: - ipv4_address: 172.20.0.19 + ipv4_address: 172.20.0.35 dic3-fhir-backend: internet: depends_on: @@ -456,7 +456,7 @@ services: DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_ttp_fhir.secret networks: ttp-fhir-frontend: - ipv4_address: 172.20.0.27 + ipv4_address: 172.20.0.51 ttp-fhir-backend: internet: depends_on: @@ -573,7 +573,7 @@ services: DEV_DSF_BPE_FHIR_CLIENT_CONNECTIONS_CONFIG_DEFAULT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/root_ca.crt networks: dic1-bpe-frontend: - ipv4_address: 172.20.0.35 + ipv4_address: 172.20.0.67 dic1-bpe-backend: internet: forward-proxy: @@ -664,7 +664,7 @@ services: DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic2_bpe.secret networks: dic2-bpe-frontend: - ipv4_address: 172.20.0.43 + ipv4_address: 172.20.0.83 dic2-bpe-backend: internet: depends_on: @@ -753,7 +753,7 @@ services: DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic3_bpe.secret networks: dic3-bpe-frontend: - ipv4_address: 172.20.0.51 + ipv4_address: 172.20.0.99 dic3-bpe-backend: internet: depends_on: @@ -843,7 +843,7 @@ services: DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_ttp_bpe.secret networks: ttp-bpe-frontend: - ipv4_address: 172.20.0.59 + ipv4_address: 172.20.0.115 ttp-bpe-backend: internet: depends_on: @@ -964,57 +964,107 @@ networks: config: - subnet: 172.20.0.0/29 dic1-fhir-backend: - dic2-fhir-frontend: driver: bridge ipam: driver: default config: - subnet: 172.20.0.8/29 + dic2-fhir-frontend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.16/29 dic2-fhir-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.24/29 dic3-fhir-frontend: driver: bridge ipam: driver: default config: - - subnet: 172.20.0.16/29 + - subnet: 172.20.0.32/29 dic3-fhir-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.40/29 ttp-fhir-frontend: driver: bridge ipam: driver: default config: - - subnet: 172.20.0.24/29 + - subnet: 172.20.0.48/29 ttp-fhir-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.56/29 dic1-bpe-frontend: driver: bridge ipam: driver: default config: - - subnet: 172.20.0.32/29 + - subnet: 172.20.0.64/29 dic1-bpe-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.72/29 dic2-bpe-frontend: driver: bridge ipam: driver: default config: - - subnet: 172.20.0.40/29 + - subnet: 172.20.0.80/29 dic2-bpe-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.88/29 dic3-bpe-frontend: driver: bridge ipam: driver: default config: - - subnet: 172.20.0.48/29 + - subnet: 172.20.0.96/29 dic3-bpe-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.104/29 ttp-bpe-frontend: driver: bridge ipam: driver: default config: - - subnet: 172.20.0.56/29 + - subnet: 172.20.0.112/29 ttp-bpe-backend: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.120/29 internet: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.128/28 forward-proxy: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.20.0.144/29 volumes: postgresql: diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf index 0580cae33..e7e86ae66 100644 --- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf +++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf @@ -38,7 +38,7 @@ server { location /bpe { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.35:8080/bpe; + proxy_pass http://172.20.0.67:8080/bpe; proxy_http_version 1.1; proxy_set_header Host $http_host; diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf index e7cffb32d..7246c61e8 100644 --- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf +++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf @@ -22,7 +22,7 @@ server { location /fhir { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.11:8080/fhir; + proxy_pass http://172.20.0.19:8080/fhir; proxy_http_version 1.1; proxy_set_header Host $http_host; @@ -38,7 +38,7 @@ server { location /bpe { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.43:8080/bpe; + proxy_pass http://172.20.0.83:8080/bpe; proxy_http_version 1.1; proxy_set_header Host $http_host; diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf index 2b5668b8a..3b9856925 100644 --- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf +++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf @@ -22,7 +22,7 @@ server { location /fhir { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.19:8080/fhir; + proxy_pass http://172.20.0.35:8080/fhir; proxy_http_version 1.1; proxy_set_header Host $http_host; @@ -38,7 +38,7 @@ server { location /bpe { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.51:8080/bpe; + proxy_pass http://172.20.0.99:8080/bpe; proxy_http_version 1.1; proxy_set_header Host $http_host; diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf index da3d7d9fc..7fd6b7c49 100644 --- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf +++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf @@ -22,7 +22,7 @@ server { location /fhir { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.27:8080/fhir; + proxy_pass http://172.20.0.51:8080/fhir; proxy_http_version 1.1; proxy_set_header Host $http_host; @@ -38,7 +38,7 @@ server { location /bpe { proxy_set_header X-ClientCert $ssl_client_escaped_cert; - proxy_pass http://172.20.0.59:8080/bpe; + proxy_pass http://172.20.0.115:8080/bpe; proxy_http_version 1.1; proxy_set_header Host $http_host; diff --git a/dsf-docker/bpe_proxy/Dockerfile b/dsf-docker/bpe_proxy/Dockerfile index eb9ec33e3..60cb8e1ef 100644 --- a/dsf-docker/bpe_proxy/Dockerfile +++ b/dsf-docker/bpe_proxy/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM httpd:2.4-alpine@sha256:968c8b4098fcecb473762b45f6c541a3b2b2cfab2caccb1edbd2cece071ef160 +FROM docker.io/library/httpd:2.4-alpine@sha256:0136c2d4462f3b8ecc92bea70efdfef4d06523999ae8d7aa533969dea6db4576 LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf LABEL org.opencontainers.image.description="DSF BPE Reverse Proxy" LABEL org.opencontainers.image.licenses="Apache License, Version 2.0" diff --git a/dsf-docker/fhir_proxy/Dockerfile b/dsf-docker/fhir_proxy/Dockerfile index f6c608fae..15cb6c2fc 100755 --- a/dsf-docker/fhir_proxy/Dockerfile +++ b/dsf-docker/fhir_proxy/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM httpd:2.4-alpine@sha256:968c8b4098fcecb473762b45f6c541a3b2b2cfab2caccb1edbd2cece071ef160 +FROM docker.io/library/httpd:2.4-alpine@sha256:0136c2d4462f3b8ecc92bea70efdfef4d06523999ae8d7aa533969dea6db4576 LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf LABEL org.opencontainers.image.description="DSF FHIR Reverse Proxy" LABEL org.opencontainers.image.licenses="Apache License, Version 2.0" diff --git a/dsf-fhir/dsf-fhir-rest-adapter/pom.xml b/dsf-fhir/dsf-fhir-rest-adapter/pom.xml index 6f2a8869d..8d702ac1a 100755 --- a/dsf-fhir/dsf-fhir-rest-adapter/pom.xml +++ b/dsf-fhir/dsf-fhir-rest-adapter/pom.xml @@ -37,10 +37,21 @@ ca.uhn.hapi.fhir hapi-fhir-structures-r4 ${hapi.fhir.version} + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + jakarta.ws.rs jakarta.ws.rs-api + ${jakarta.ws.rs.version} provided diff --git a/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile b/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile index 40d6acde3..3faac011b 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:4ffb3a1511099754cddc70eb1b12e50ffdb67619aa0ab6c13fcd800a78ef7c7a AS builder +FROM docker.io/library/debian:trixie-slim@sha256:b6e2a152f22a40ff69d92cb397223c906017e1391a73c952b588e51af8883bf8 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:0f843579efd505efb0a0eef1d5a816cc4523ffcad458a54a4e9e52e60c4c030a +FROM docker.io/azul/zulu-openjdk:25-jre-headless@sha256:8cec35879adc3694e3cad2a499f9527c7c788278a923363b09b096a1b28f751c 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" diff --git a/dsf-fhir/dsf-fhir-server/pom.xml b/dsf-fhir/dsf-fhir-server/pom.xml index 5ab54be76..1eec78482 100755 --- a/dsf-fhir/dsf-fhir-server/pom.xml +++ b/dsf-fhir/dsf-fhir-server/pom.xml @@ -85,6 +85,7 @@ jakarta.ws.rs jakarta.ws.rs-api + ${jakarta.ws.rs.version} jakarta.websocket @@ -125,29 +126,45 @@ org.glassfish.jersey.core jersey-server + ${jersey.version} org.glassfish.jersey.inject jersey-hk2 + ${jersey.version} org.glassfish.jersey.media jersey-media-json-jackson + ${jersey.version} org.glassfish.jersey.containers jersey-container-servlet + ${jersey.version} ca.uhn.hapi.fhir hapi-fhir-structures-r4 ${hapi.fhir.version} + + + io.opentelemetry + opentelemetry-api + + ca.uhn.hapi.fhir hapi-fhir-structures-r5 ${hapi.fhir.version} + + + net.sourceforge.plantuml + plantuml-mit + + ca.uhn.hapi.fhir @@ -157,6 +174,26 @@ commons-logging commons-logging + + net.sf.saxon + Saxon-HE + + + org.ogce + xpp3 + + + org.xerial + sqlite-jdbc + + + org.commonmark + commonmark + + + org.commonmark + commonmark-ext-gfm-tables + ${hapi.fhir.version} diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ThymeleafTemplateServiceImpl.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ThymeleafTemplateServiceImpl.java index 3269d739a..c5dd2958b 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ThymeleafTemplateServiceImpl.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ThymeleafTemplateServiceImpl.java @@ -65,7 +65,6 @@ import jakarta.ws.rs.core.PathSegment; import jakarta.ws.rs.core.SecurityContext; import jakarta.ws.rs.core.UriInfo; -import net.sf.saxon.lib.FeatureKeys; public class ThymeleafTemplateServiceImpl implements ThymeleafTemplateService, InitializingBean { @@ -154,7 +153,6 @@ public ThymeleafTemplateServiceImpl(String serverBaseUrl, Theme theme, FhirConte try { transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - transformerFactory.setFeature(FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS, false); } catch (TransformerConfigurationException e) { diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/AbstractResourceDaoJdbc.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/AbstractResourceDaoJdbc.java index f5ff2763a..8db9e7a7a 100755 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/AbstractResourceDaoJdbc.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/dao/jdbc/AbstractResourceDaoJdbc.java @@ -523,7 +523,7 @@ public Optional readIncludingDeletedWithTransaction(Connection connection, UU if (result.next()) { if (preparedStatementFactory.getReadByIdDeleted(result) != null) - logger.warn("{} with IdPart {} found, but marked as deleted", resourceTypeName, uuid); + logger.debug("{} with IdPart {} found, but marked as deleted", resourceTypeName, uuid); else logger.debug("{} with IdPart {} found", resourceTypeName, uuid); diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/search/parameters/basic/AbstractBooleanParameter.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/search/parameters/basic/AbstractBooleanParameter.java index 29839e63b..04076fdb3 100755 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/search/parameters/basic/AbstractBooleanParameter.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/search/parameters/basic/AbstractBooleanParameter.java @@ -16,13 +16,12 @@ package dev.dsf.fhir.search.parameters.basic; import java.util.List; +import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; import org.hl7.fhir.r4.model.Resource; -import com.google.common.base.Objects; - import dev.dsf.fhir.search.SearchQueryParameterError; import dev.dsf.fhir.search.SearchQueryParameterError.SearchQueryParameterErrorType; @@ -86,6 +85,6 @@ public String getBundleUriQueryParameterValue() @Override protected boolean resourceMatches(R resource) { - return hasBoolean.test(resource) && Objects.equal(getBoolean.apply(resource), value); + return hasBoolean.test(resource) && Objects.equals(getBoolean.apply(resource), value); } } diff --git a/dsf-fhir/dsf-fhir-validation/pom.xml b/dsf-fhir/dsf-fhir-validation/pom.xml index f6d6bca09..01dbf03c5 100644 --- a/dsf-fhir/dsf-fhir-validation/pom.xml +++ b/dsf-fhir/dsf-fhir-validation/pom.xml @@ -37,11 +37,27 @@ ca.uhn.hapi.fhir hapi-fhir-caching-caffeine ${hapi.fhir.version} + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + ca.uhn.hapi.fhir hapi-fhir-structures-r4 ${hapi.fhir.version} + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + ca.uhn.hapi.fhir @@ -52,12 +68,46 @@ commons-logging commons-logging + + net.sf.saxon + Saxon-HE + + + org.ogce + xpp3 + + + org.xerial + sqlite-jdbc + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + + net.sourceforge.plantuml + plantuml-mit + + + org.commonmark + commonmark + + + org.commonmark + commonmark-ext-gfm-tables + ca.uhn.hapi.fhir hapi-fhir-validation-resources-r4 ${hapi.fhir.version} + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-annotations + + @@ -133,7 +183,9 @@ + src/main/resources/fhir/**/*.ignore src/main/resources/fhir/**/*.post + src/main/resources/fhir/**/*.put src/main/resources/fhir/bundle.xml src/main/resources/fhir/resources.delete diff --git a/dsf-fhir/dsf-fhir-webservice-client/pom.xml b/dsf-fhir/dsf-fhir-webservice-client/pom.xml index 0a3dc99eb..85dd11de8 100755 --- a/dsf-fhir/dsf-fhir-webservice-client/pom.xml +++ b/dsf-fhir/dsf-fhir-webservice-client/pom.xml @@ -46,22 +46,27 @@ org.glassfish.jersey.core jersey-client + ${jersey.version} org.glassfish.jersey.inject jersey-hk2 + ${jersey.version} org.glassfish.jersey.media jersey-media-jaxb + ${jersey.version} org.glassfish.jersey.media jersey-media-json-jackson + ${jersey.version} org.glassfish.jersey.connectors - jersey-apache-connector + jersey-apache5-connector + ${jersey.version} commons-logging 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 bc4dc44ce..ce4b37ea7 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 @@ -19,8 +19,8 @@ import java.time.Duration; import java.util.function.Supplier; -import org.apache.http.conn.ConnectTimeoutException; -import org.apache.http.conn.HttpHostConnectException; +import org.apache.hc.client5.http.ConnectTimeoutException; +import org.apache.hc.client5.http.HttpHostConnectException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractJerseyClient.java b/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractJerseyClient.java index 9ecff9af0..39fdb95ae 100644 --- a/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractJerseyClient.java +++ b/dsf-fhir/dsf-fhir-webservice-client/src/main/java/dev/dsf/fhir/client/AbstractJerseyClient.java @@ -24,7 +24,7 @@ import javax.net.ssl.SSLContext; import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider; @@ -77,7 +77,7 @@ else if (trustStore != null && keyStore != null && keyStorePassword != null) builder = builder.sslContext(sslContext); ClientConfig config = new ClientConfig(); - config.connectorProvider(new ApacheConnectorProvider()); + config.connectorProvider(new Apache5ConnectorProvider()); config.property(ClientProperties.PROXY_URI, proxySchemeHostPort); config.property(ClientProperties.PROXY_USERNAME, proxyUserName); config.property(ClientProperties.PROXY_PASSWORD, proxyPassword == null ? null : String.valueOf(proxyPassword)); diff --git a/dsf-fhir/dsf-fhir-websocket-client/pom.xml b/dsf-fhir/dsf-fhir-websocket-client/pom.xml index f3ab0962d..91a2e7c36 100755 --- a/dsf-fhir/dsf-fhir-websocket-client/pom.xml +++ b/dsf-fhir/dsf-fhir-websocket-client/pom.xml @@ -42,6 +42,7 @@ org.glassfish.jersey.core jersey-common + ${jersey.version} org.glassfish.tyrus diff --git a/dsf-maven/dsf-maven-plugin/pom.xml b/dsf-maven/dsf-maven-plugin/pom.xml index fa6486a2f..13fd1c11b 100644 --- a/dsf-maven/dsf-maven-plugin/pom.xml +++ b/dsf-maven/dsf-maven-plugin/pom.xml @@ -138,6 +138,12 @@ org.springframework spring-core + + + commons-logging + commons-logging + + diff --git a/pom.xml b/pom.xml index 0ab5b8de4..07e020e76 100755 --- a/pom.xml +++ b/pom.xml @@ -38,14 +38,13 @@ ${project.basedir} - 2.0.17 - 2.25.4 - 12.1.8 - 3.1.11 + 2.0.18 + 2.26.0 + 12.1.10 2.2.2 - 6.2.18 - 2.21.2 - 1.1.1 + 7.0.7 + 2.21.4 + 2.1.1 5.1.0 8.4.2 6.5.27 @@ -53,7 +52,16 @@ 1.84 3.8.0 5.2.1 - 5.2.1 + 6.0.0 + 3.1.11 + 4.0.2 + 4.0.2 + 3.1.0 + 4.0.0 + 4.0.0 + 2.1.0 + 3.0.0 + 3.0.0 DSF Parent POM @@ -183,7 +191,7 @@ org.postgresql postgresql - 42.7.10 + 42.7.11 org.checkerframework @@ -193,7 +201,7 @@ com.github.ben-manes.caffeine caffeine - 3.2.3 + 3.2.4 @@ -205,7 +213,7 @@ com.auth0 java-jwt - 4.5.1 + 4.5.2 @@ -244,47 +252,6 @@ ${jetty.version} - - - org.glassfish.jersey.core - jersey-common - ${jersey.version} - - - org.glassfish.jersey.core - jersey-server - ${jersey.version} - - - org.glassfish.jersey.core - jersey-client - ${jersey.version} - - - org.glassfish.jersey.containers - jersey-container-servlet - ${jersey.version} - - - org.glassfish.jersey.inject - jersey-hk2 - ${jersey.version} - - - org.glassfish.jersey.connectors - jersey-apache-connector - ${jersey.version} - - - org.glassfish.jersey.media - jersey-media-jaxb - ${jersey.version} - - - org.glassfish.jersey.media - jersey-media-json-jackson - ${jersey.version} - com.fasterxml.jackson.core jackson-databind @@ -293,8 +260,6 @@ com.fasterxml.jackson.core jackson-annotations - 2.21 @@ -334,7 +299,7 @@ org.glassfish.jaxb jaxb-runtime - 4.0.7 + 4.0.9 @@ -375,16 +340,6 @@ - - jakarta.ws.rs - jakarta.ws.rs-api - 4.0.0 - - - jakarta.annotation - jakarta.annotation-api - 3.0.0 - jakarta.servlet jakarta.servlet-api @@ -448,17 +403,17 @@ com.google.code.gson gson - 2.13.2 + 2.14.0 org.thymeleaf thymeleaf - 3.1.4.RELEASE + 3.1.5.RELEASE com.nimbusds nimbus-jose-jwt - 10.9 + 10.9.1 org.fhir @@ -469,12 +424,12 @@ commons-io commons-io - 2.21.0 + 2.22.0 commons-codec commons-codec - 1.21.0 + 1.22.0 @@ -508,25 +463,25 @@ org.ow2.asm asm - 9.9.1 + 9.10.1 org.apache.tika tika-core - 3.3.0 + 3.3.1 org.apache.maven maven-core - 3.9.15 + 3.9.16 org.apache.maven maven-plugin-api - 3.9.15 + 3.9.16 org.apache.maven.plugin-tools @@ -574,12 +529,12 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.5 + 3.5.6 org.apache.maven.plugins maven-failsafe-plugin - 3.5.5 + 3.5.6 org.apache.maven.plugins @@ -609,7 +564,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.10.0 + 3.11.0 org.codehaus.mojo @@ -624,12 +579,12 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.6.2 + 3.6.3 org.apache.maven.plugins maven-site-plugin - 3.21.0 + 3.22.0 com.github.spotbugs @@ -1097,6 +1052,7 @@ SCRIPT_STYLE SCRIPT_STYLE SCRIPT_STYLE + SCRIPT_STYLE