From 1543671dcfb18ae780d6c77c4e8ba7e252358fd1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 10 May 2026 11:46:20 +0000 Subject: [PATCH 1/4] FINERACT-2421: Update all non-major dependencies --- .github/workflows/build-core.yml | 8 +- .github/workflows/build-cucumber.yml | 4 +- .github/workflows/build-e2e-tests.yml | 6 +- .github/workflows/build-mariadb.yml | 6 +- .github/workflows/build-mysql.yml | 8 +- .github/workflows/build-postgresql.yml | 6 +- .github/workflows/build-progressive-loan.yml | 6 +- .github/workflows/build-quality-checks.yml | 8 +- .../regression-safety-db-changes.yml | 2 +- ...tegration-test-sequentially-postgresql.yml | 6 +- .../verify-api-backward-compatibility.yml | 2 +- .../workflows/verify-liquibase-ddl-safety.yml | 2 +- build.gradle | 30 +-- buildSrc/build.gradle | 2 +- .../org.apache.fineract.dependencies.gradle | 200 +++++++++--------- docker-compose-postgresql-kafka.yml | 2 +- fineract-e2e-tests-runner/build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 2 +- 19 files changed, 153 insertions(+), 153 deletions(-) diff --git a/.github/workflows/build-core.yml b/.github/workflows/build-core.yml index 1a5f435742e..a72f9578be9 100644 --- a/.github/workflows/build-core.yml +++ b/.github/workflows/build-core.yml @@ -29,7 +29,7 @@ jobs: distribution: 'zulu' - name: Cache Gradle dependencies - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: path: | ~/.gradle/caches @@ -67,7 +67,7 @@ jobs: tar --exclude='./fineract-workspace.tar' -cf fineract-workspace.tar . - name: Upload workspace - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: fineract-workspace-${{ github.run_id }} path: fineract-workspace.tar @@ -75,7 +75,7 @@ jobs: - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-build-core path: '**/build/reports/' @@ -84,7 +84,7 @@ jobs: - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs-build-core path: '**/build/cargo/' diff --git a/.github/workflows/build-cucumber.yml b/.github/workflows/build-cucumber.yml index 6a83eb5425e..4b267d12420 100644 --- a/.github/workflows/build-cucumber.yml +++ b/.github/workflows/build-cucumber.yml @@ -41,7 +41,7 @@ jobs: - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-cucumber path: '**/build/reports/' @@ -50,7 +50,7 @@ jobs: - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs-cucumber path: '**/build/cargo/' diff --git a/.github/workflows/build-e2e-tests.yml b/.github/workflows/build-e2e-tests.yml index c5e8a11faa4..db4e3fccb48 100644 --- a/.github/workflows/build-e2e-tests.yml +++ b/.github/workflows/build-e2e-tests.yml @@ -155,7 +155,7 @@ jobs: - name: Upload test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: allure-results-shard-${{ matrix.shard_index }} path: | @@ -168,7 +168,7 @@ jobs: - name: Upload Allure Report if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: allure-report-shard-${{ matrix.shard_index }} path: allure-report-shard-${{ matrix.shard_index }} @@ -176,7 +176,7 @@ jobs: - name: Upload logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: logs-shard-${{ matrix.shard_index }} path: | diff --git a/.github/workflows/build-mariadb.yml b/.github/workflows/build-mariadb.yml index f9f813d5bab..07b69e573e3 100644 --- a/.github/workflows/build-mariadb.yml +++ b/.github/workflows/build-mariadb.yml @@ -26,7 +26,7 @@ jobs: options: --health-cmd="healthcheck.sh --su-mysql --connect --innodb_initialized" --health-interval=5s --health-timeout=2s --health-retries=3 mock-oauth2-server: - image: ghcr.io/navikt/mock-oauth2-server:3.0.1 + image: ghcr.io/navikt/mock-oauth2-server:3.0.3 ports: - 9000:9000 env: @@ -136,7 +136,7 @@ jobs: - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-mariadb-${{ matrix.task }}-attempt-${{ github.run_attempt }} path: '**/build/reports/' @@ -144,7 +144,7 @@ jobs: - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs-mariadb-${{ matrix.task }}-attempt-${{ github.run_attempt }} path: '**/build/cargo/' diff --git a/.github/workflows/build-mysql.yml b/.github/workflows/build-mysql.yml index 86fd8047c76..82a8e7d61d0 100644 --- a/.github/workflows/build-mysql.yml +++ b/.github/workflows/build-mysql.yml @@ -18,7 +18,7 @@ jobs: services: mysql: - image: mysql:9.1 + image: mysql:9.7 ports: - 3306:3306 env: @@ -26,7 +26,7 @@ jobs: options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 mock-oauth2-server: - image: ghcr.io/navikt/mock-oauth2-server:3.0.1 + image: ghcr.io/navikt/mock-oauth2-server:3.0.3 ports: - 9000:9000 env: @@ -131,7 +131,7 @@ jobs: - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-mysql-${{ matrix.task }}-attempt-${{ github.run_attempt }} path: '**/build/reports/' @@ -139,7 +139,7 @@ jobs: - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs-mysql-${{ matrix.task }}-attempt-${{ github.run_attempt }} path: '**/build/cargo/' diff --git a/.github/workflows/build-postgresql.yml b/.github/workflows/build-postgresql.yml index 4e850e15bf4..823e1e5b047 100644 --- a/.github/workflows/build-postgresql.yml +++ b/.github/workflows/build-postgresql.yml @@ -27,7 +27,7 @@ jobs: options: --health-cmd="pg_isready -q -d postgres -U root" --health-interval=5s --health-timeout=2s --health-retries=3 mock-oauth2-server: - image: ghcr.io/navikt/mock-oauth2-server:3.0.1 + image: ghcr.io/navikt/mock-oauth2-server:3.0.3 ports: - 9000:9000 env: @@ -132,7 +132,7 @@ jobs: - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-postgresql-${{ matrix.task }}-attempt-${{ github.run_attempt }} path: '**/build/reports/' @@ -140,7 +140,7 @@ jobs: - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs-postgresql-${{ matrix.task }}-attempt-${{ github.run_attempt }} path: '**/build/cargo/' diff --git a/.github/workflows/build-progressive-loan.yml b/.github/workflows/build-progressive-loan.yml index caaa98130b1..e9f3e5dd8fe 100644 --- a/.github/workflows/build-progressive-loan.yml +++ b/.github/workflows/build-progressive-loan.yml @@ -57,7 +57,7 @@ jobs: - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-build-progressive-loan path: | @@ -68,7 +68,7 @@ jobs: - name: Archive Progressive Loan JAR if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: progressive-loan-jar path: ${{ env.EMBEDDABLE_JAR_FILE }} @@ -77,7 +77,7 @@ jobs: - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs-build-progressive-loan path: '**/build/cargo/' diff --git a/.github/workflows/build-quality-checks.yml b/.github/workflows/build-quality-checks.yml index d9e627455ea..fb8f09a57f8 100644 --- a/.github/workflows/build-quality-checks.yml +++ b/.github/workflows/build-quality-checks.yml @@ -41,7 +41,7 @@ jobs: - name: Archive Javadoc reports if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: javadoc-reports-quality-checks path: '**/build/docs/javadoc/' @@ -82,7 +82,7 @@ jobs: - name: Archive Checkstyle reports if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: checkstyle-reports-quality-checks path: '**/build/reports/checkstyle/' @@ -123,7 +123,7 @@ jobs: - name: Archive RAT reports if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: rat-reports-quality-checks path: '**/build/reports/rat/' @@ -164,7 +164,7 @@ jobs: - name: Archive SpotBugs reports if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: spotbugs-reports-quality-checks path: '**/build/reports/spotbugs/' diff --git a/.github/workflows/regression-safety-db-changes.yml b/.github/workflows/regression-safety-db-changes.yml index 9445daa8313..a515ebe16c6 100644 --- a/.github/workflows/regression-safety-db-changes.yml +++ b/.github/workflows/regression-safety-db-changes.yml @@ -378,7 +378,7 @@ jobs: - name: Upload test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: regression-safety-results path: | diff --git a/.github/workflows/run-integration-test-sequentially-postgresql.yml b/.github/workflows/run-integration-test-sequentially-postgresql.yml index add9fe90562..cabca088e15 100644 --- a/.github/workflows/run-integration-test-sequentially-postgresql.yml +++ b/.github/workflows/run-integration-test-sequentially-postgresql.yml @@ -20,7 +20,7 @@ jobs: POSTGRES_PASSWORD: postgres options: --health-cmd="pg_isready -q -d postgres -U root" --health-interval=5s --health-timeout=2s --health-retries=3 mock-oauth2-server: - image: ghcr.io/navikt/mock-oauth2-server:3.0.1 + image: ghcr.io/navikt/mock-oauth2-server:3.0.3 ports: - 9000:9000 env: @@ -82,7 +82,7 @@ jobs: ./gradlew --no-daemon --console=plain :oauth2-tests:test -PdbType=postgresql -x buildJavaSdk - name: Archive test results if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results retention-days: 5 @@ -93,7 +93,7 @@ jobs: oauth2-tests/build/reports/ - name: Archive server logs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: server-logs retention-days: 5 diff --git a/.github/workflows/verify-api-backward-compatibility.yml b/.github/workflows/verify-api-backward-compatibility.yml index 27b54c5fd34..ba186101077 100644 --- a/.github/workflows/verify-api-backward-compatibility.yml +++ b/.github/workflows/verify-api-backward-compatibility.yml @@ -233,7 +233,7 @@ jobs: - name: Archive breaking change report if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: api-compatibility-report path: fineract-provider/build/swagger-brake/ diff --git a/.github/workflows/verify-liquibase-ddl-safety.yml b/.github/workflows/verify-liquibase-ddl-safety.yml index d69b1ede173..5a5be74112f 100644 --- a/.github/workflows/verify-liquibase-ddl-safety.yml +++ b/.github/workflows/verify-liquibase-ddl-safety.yml @@ -111,7 +111,7 @@ jobs: - name: Archive report if: always() && steps.changes.outputs.has_changes == 'true' - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: ddl-safety-report path: ${{ runner.temp }}/ddl-safety-report/ diff --git a/build.gradle b/build.gradle index 6be0057fcd8..97ce5d2b61f 100644 --- a/build.gradle +++ b/build.gradle @@ -110,29 +110,29 @@ buildscript { plugins { id 'me.qoomon.git-versioning' version '6.4.4' - id "org.barfuin.gradle.taskinfo" version "2.2.0" + id "org.barfuin.gradle.taskinfo" version "2.2.1" id 'com.adarshr.test-logger' version '4.0.0' id 'com.diffplug.spotless' version '6.25.0' apply false id 'org.nosphere.apache.rat' version '0.8.1' apply false id 'com.github.hierynomus.license' version '0.16.1' apply false id 'com.github.jk1.dependency-license-report' version '2.9' apply false - id 'org.zeroturnaround.gradle.jrebel' version '1.2.0' apply false - id 'org.springframework.boot' version '3.5.13' apply false - id 'net.ltgt.errorprone' version '4.1.0' apply false - id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.2.23' apply false - id 'com.gorylenko.gradle-git-properties' version '2.4.2' apply false + id 'org.zeroturnaround.gradle.jrebel' version '1.2.2' apply false + id 'org.springframework.boot' version '3.5.14' apply false + id 'net.ltgt.errorprone' version '4.4.0' apply false + id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.2.49' apply false + id 'com.gorylenko.gradle-git-properties' version '2.5.7' apply false id 'org.asciidoctor.jvm.convert' version '4.0.5' apply false id 'org.asciidoctor.jvm.pdf' version '4.0.5' apply false - id 'com.google.cloud.tools.jib' version '3.4.5' apply false - id 'org.sonarqube' version '6.0.1.5171' - id 'com.github.andygoossens.modernizer' version '1.10.0' apply false - id 'com.github.spotbugs' version '6.0.26' apply false - id 'se.thinkcode.cucumber-runner' version '0.0.11' apply false + id 'com.google.cloud.tools.jib' version '3.5.3' apply false + id 'org.sonarqube' version '6.3.1.5724' + id 'com.github.andygoossens.modernizer' version '1.13.0' apply false + id 'com.github.spotbugs' version '6.5.4' apply false + id 'se.thinkcode.cucumber-runner' version '0.0.14' apply false id "com.github.davidmc24.gradle.plugin.avro-base" version "1.9.1" apply false - id 'org.openapi.generator' version '7.8.0' apply false - id 'com.gradleup.shadow' version '9.3.2' apply false - id 'me.champeau.jmh' version '0.7.1' apply false - id 'org.cyclonedx.bom' version '3.1.0' apply false + id 'org.openapi.generator' version '7.22.0' apply false + id 'com.gradleup.shadow' version '9.4.1' apply false + id 'me.champeau.jmh' version '0.7.3' apply false + id 'org.cyclonedx.bom' version '3.2.4' apply false id 'com.docktape.swagger-brake' version '2.7.0' apply false } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index de2e63c05c1..3d099538fd3 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -45,7 +45,7 @@ configurations.all { resolutionStrategy { dependencySubstitution { // Substitution is to resolve CVE-2025-12183 - substitute module('org.lz4:lz4-java') using module('at.yawk.lz4:lz4-java:1.10.1') + substitute module('org.lz4:lz4-java') using module('at.yawk.lz4:lz4-java:1.11.0') } } } diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index 8a9d1d811bc..8336a64251f 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -24,19 +24,19 @@ dependencyManagement { imports { mavenBom 'com.squareup.okhttp3:okhttp-bom:4.12.0' mavenBom 'org.slf4j:slf4j-bom:2.0.17' - mavenBom 'io.micrometer:micrometer-bom:1.13.6' - mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.13' - mavenBom 'io.awspring.cloud:spring-cloud-aws-dependencies:3.2.1' - mavenBom 'io.opentelemetry:opentelemetry-bom:1.44.1' - mavenBom 'org.jetbrains.kotlin:kotlin-bom:2.0.21' - mavenBom 'org.junit:junit-bom:5.11.3' - mavenBom 'com.fasterxml.jackson:jackson-bom:2.19.2' - mavenBom 'io.cucumber:cucumber-bom:7.20.1' - mavenBom 'org.mockito:mockito-bom:5.14.2' - mavenBom 'software.amazon.awssdk:bom:2.29.9' - mavenBom 'io.github.resilience4j:resilience4j-bom:2.2.0' - mavenBom 'org.testcontainers:testcontainers-bom:1.20.4' - mavenBom 'org.glassfish.jersey:jersey-bom:3.1.10' + mavenBom 'io.micrometer:micrometer-bom:1.16.5' + mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.14' + mavenBom 'io.awspring.cloud:spring-cloud-aws-dependencies:3.4.2' + mavenBom 'io.opentelemetry:opentelemetry-bom:1.62.0' + mavenBom 'org.jetbrains.kotlin:kotlin-bom:2.3.21' + mavenBom 'org.junit:junit-bom:5.14.4' + mavenBom 'com.fasterxml.jackson:jackson-bom:2.21.3' + mavenBom 'io.cucumber:cucumber-bom:7.34.3' + mavenBom 'org.mockito:mockito-bom:5.23.0' + mavenBom 'software.amazon.awssdk:bom:2.44.4' + mavenBom 'io.github.resilience4j:resilience4j-bom:2.4.0' + mavenBom 'org.testcontainers:testcontainers-bom:1.21.4' + mavenBom 'org.glassfish.jersey:jersey-bom:3.1.11' } dependencies { @@ -44,43 +44,43 @@ dependencyManagement { // We do not use :+ to get the latest available version available on Maven Central, as that could suddenly break things. // We use the Renovate Bot to automatically propose Pull Requests (PRs) when upgrades for all of these versions are available. - dependency 'ch.qos.logback:logback-core:1.5.19' - dependency 'ch.qos.logback:logback-classic:1.5.19' + dependency 'ch.qos.logback:logback-core:1.5.32' + dependency 'ch.qos.logback:logback-classic:1.5.32' dependency 'ch.qos.logback.contrib:logback-json-classic:0.1.5' dependency 'ch.qos.logback.contrib:logback-jackson:0.1.5' dependency 'org.codehaus.janino:janino:3.1.12' - dependency 'org.eclipse.persistence:org.eclipse.persistence.jpa:4.0.2' - dependency 'com.google.guava:guava:33.1.0-jre' - dependency 'com.google.code.gson:gson:2.11.0' - dependency 'com.google.googlejavaformat:google-java-format:1.24.0' - dependency 'org.apache.commons:commons-collections4:4.4' + dependency 'org.eclipse.persistence:org.eclipse.persistence.jpa:4.0.9' + dependency 'com.google.guava:guava:33.6.0-jre' + dependency 'com.google.code.gson:gson:2.14.0' + dependency 'com.google.googlejavaformat:google-java-format:1.35.0' + dependency 'org.apache.commons:commons-collections4:4.5.0' dependency 'org.apache.commons:commons-compress:1.28.0' - dependency ('software.amazon.msk:aws-msk-iam-auth:2.2.0') { + dependency ('software.amazon.msk:aws-msk-iam-auth:2.3.6') { exclude 'commons-logging:commons-logging:' } dependency ('org.apache.commons:commons-email:1.6.0') { exclude 'com.sun.mail:javax.mail' exclude 'javax.activation:activation' } - dependency 'commons-io:commons-io:2.18.0' - dependency 'com.github.librepdf:openpdf:3.0.0' + dependency 'commons-io:commons-io:2.22.0' + dependency 'com.github.librepdf:openpdf:3.0.4' dependency ('org.mnode.ical4j:ical4j:3.2.19') { exclude 'com.sun.mail:javax.mail' exclude 'org.codehaus.groovy:groovy' } - dependency 'org.apache.commons:commons-csv:1.12.0' - dependency 'org.quartz-scheduler:quartz:2.5.0' - dependency 'org.ehcache:ehcache:3.10.8' + dependency 'org.apache.commons:commons-csv:1.14.1' + dependency 'org.quartz-scheduler:quartz:2.5.2' + dependency 'org.ehcache:ehcache:3.12.0' dependency 'com.github.spullara.mustache.java:compiler:0.9.14' dependency 'com.jayway.jsonpath:json-path:3.0.0' - dependency ('org.apache.tika:tika-core:3.2.3') { + dependency ('org.apache.tika:tika-core:3.3.0') { exclude 'commons-logging:commons-logging' } - dependency ('org.apache.tika:tika-core:3.2.3') { + dependency ('org.apache.tika:tika-core:3.3.0') { exclude 'commons-logging:commons-logging' } - dependency ('org.apache.tika:tika-parser-miscoffice-module:3.2.3') { + dependency ('org.apache.tika:tika-parser-miscoffice-module:3.3.0') { exclude 'org.bouncycastle:bcprov-jdk15on' exclude 'org.bouncycastle:bcjmail-jdk15on' exclude 'org.bouncycastle:bcprov-jdk18on' @@ -97,7 +97,7 @@ dependencyManagement { exclude 'org.apache.commons:commons-compress' exclude 'xml-apis:xml-apis' } - dependency ('org.apache.tika:tika-parser-microsoft-module:3.2.3') { + dependency ('org.apache.tika:tika-parser-microsoft-module:3.3.0') { exclude 'org.bouncycastle:bcprov-jdk15on' exclude 'org.bouncycastle:bcjmail-jdk15on' exclude 'org.bouncycastle:bcprov-jdk18on' @@ -114,7 +114,7 @@ dependencyManagement { exclude 'org.apache.commons:commons-compress' exclude 'xml-apis:xml-apis' } - dependency ('org.apache.tika:tika-parser-image-module:3.2.3') { + dependency ('org.apache.tika:tika-parser-image-module:3.3.0') { exclude 'org.bouncycastle:bcprov-jdk15on' exclude 'org.bouncycastle:bcjmail-jdk15on' exclude 'org.bouncycastle:bcprov-jdk18on' @@ -138,86 +138,86 @@ dependencyManagement { dependency 'jakarta.jms:jakarta.jms-api:3.1.0' dependency 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' dependency 'org.glassfish.jaxb:jaxb-runtime:2.3.6' // Swagger needs exactly this version - dependency 'joda-time:joda-time:2.13.1' + dependency 'joda-time:joda-time:2.14.2' - dependency 'io.github.classgraph:classgraph:4.8.179' - dependency 'org.awaitility:awaitility:4.2.2' - dependency 'com.github.spotbugs:spotbugs-annotations:4.8.6' + dependency 'io.github.classgraph:classgraph:4.8.184' + dependency 'org.awaitility:awaitility:4.3.0' + dependency 'com.github.spotbugs:spotbugs-annotations:4.9.8' dependency 'javax.cache:cache-api:1.1.1' dependency 'org.mock-server:mockserver-junit-jupiter:5.15.0' dependency 'org.webjars:webjars-locator-core:0.59' dependency 'com.icegreen:greenmail-junit5:2.0.1' // fineract client dependencies - dependency "com.squareup.retrofit2:retrofit:2.11.0" - dependency "com.squareup.retrofit2:retrofit-mock:2.11.0" - dependency "com.squareup.retrofit2:adapter-java8:2.11.0" - dependency "com.squareup.retrofit2:adapter-rxjava2:2.11.0" - dependency "com.squareup.retrofit2:adapter-rxjava3:2.11.0" - dependency "com.squareup.retrofit2:adapter-guava:2.11.0" - dependency "com.squareup.retrofit2:converter-wire:2.11.0" - dependency "com.squareup.retrofit2:converter-jackson:2.11.0" - dependency "com.squareup.retrofit2:converter-simplexml:2.11.0" - dependency "com.squareup.retrofit2:converter-jaxb:2.11.0" - dependency "com.squareup.retrofit2:converter-java8:2.11.0" - dependency "com.squareup.retrofit2:converter-scalars:2.11.0" - dependency "com.squareup.retrofit2:converter-gson:2.11.0" - dependency "com.squareup.retrofit2:converter-protobuf:2.11.0" + dependency "com.squareup.retrofit2:retrofit:2.12.0" + dependency "com.squareup.retrofit2:retrofit-mock:2.12.0" + dependency "com.squareup.retrofit2:adapter-java8:2.12.0" + dependency "com.squareup.retrofit2:adapter-rxjava2:2.12.0" + dependency "com.squareup.retrofit2:adapter-rxjava3:2.12.0" + dependency "com.squareup.retrofit2:adapter-guava:2.12.0" + dependency "com.squareup.retrofit2:converter-wire:2.12.0" + dependency "com.squareup.retrofit2:converter-jackson:2.12.0" + dependency "com.squareup.retrofit2:converter-simplexml:2.12.0" + dependency "com.squareup.retrofit2:converter-jaxb:2.12.0" + dependency "com.squareup.retrofit2:converter-java8:2.12.0" + dependency "com.squareup.retrofit2:converter-scalars:2.12.0" + dependency "com.squareup.retrofit2:converter-gson:2.12.0" + dependency "com.squareup.retrofit2:converter-protobuf:2.12.0" dependency 'io.reactivex.rxjava2:rxjava:2.2.21' dependency "io.gsonfire:gson-fire:1.9.0" dependency "com.google.code.findbugs:jsr305:3.0.2" - dependency "commons-codec:commons-codec:1.17.1" - dependency "org.projectlombok:lombok:1.18.36" + dependency "commons-codec:commons-codec:1.22.0" + dependency "org.projectlombok:lombok:1.18.46" - dependency 'org.bouncycastle:bcpkix-jdk18on:1.81' - dependency 'org.bouncycastle:bcprov-jdk18on:1.81' - dependency 'org.bouncycastle:bcutil-jdk18on:1.81' - dependency 'org.bouncycastle:bcpg-jdk18on:1.81' + dependency 'org.bouncycastle:bcpkix-jdk18on:1.84' + dependency 'org.bouncycastle:bcprov-jdk18on:1.84' + dependency 'org.bouncycastle:bcutil-jdk18on:1.84' + dependency 'org.bouncycastle:bcpg-jdk18on:1.84' - dependency 'org.eclipse.jgit:org.eclipse.jgit:7.2.1.202505142326-r' - dependency 'org.eclipse.jgit:org.eclipse.jgit.gpg.bc:7.2.1.202505142326-r' - dependency 'org.eclipse.jgit:org.eclipse.jgit.ssh.apache:7.2.1.202505142326-r' + dependency 'org.eclipse.jgit:org.eclipse.jgit:7.6.0.202603022253-r' + dependency 'org.eclipse.jgit:org.eclipse.jgit.gpg.bc:7.6.0.202603022253-r' + dependency 'org.eclipse.jgit:org.eclipse.jgit.ssh.apache:7.6.0.202603022253-r' - dependency ('com.tmatesoft.svnkit:svnkit:1.10.12') + dependency ('com.tmatesoft.svnkit:svnkit:1.10.13') dependency 'com.vdurmont:semver4j:3.1.0' dependency 'org.beryx:text-io:3.4.1' - dependency ('org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0') { + dependency ('org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.17') { exclude 'io.swagger.core.v3:swagger-core' } - dependency 'com.google.cloud.sql:mysql-socket-factory-connector-j-8:1.23.1' + dependency 'com.google.cloud.sql:mysql-socket-factory-connector-j-8:1.28.3' - dependency ('org.apache.activemq:activemq-client:6.2.4') { + dependency ('org.apache.activemq:activemq-client:6.2.5') { exclude 'javax.annotation:javax.annotation-api' } - dependency 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.22' - dependency ('io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.22') { + dependency 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.49' + dependency ('io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.49') { exclude 'jakarta.activation:jakarta.activation-api' } - dependency ('io.swagger.core.v3:swagger-core-jakarta:2.2.22') { + dependency ('io.swagger.core.v3:swagger-core-jakarta:2.2.49') { exclude 'jakarta.activation:jakarta.activation-api' } dependency 'jakarta.annotation:jakarta.annotation-api:3.0.0' - dependency 'jakarta.activation:jakarta.activation-api:2.1.3' + dependency 'jakarta.activation:jakarta.activation-api:2.1.4' dependency ('com.sun.mail:jakarta.mail:2.0.2') { // Spring needs this version exclude 'com.sun.activation:jakarta.activation' } - dependency ('jakarta.xml.bind:jakarta.xml.bind-api:4.0.2') { + dependency ('jakarta.xml.bind:jakarta.xml.bind-api:4.0.5') { exclude 'jakarta.activation:jakarta.activation-api' } dependency 'jakarta.validation:jakarta.validation-api:3.1.1' - dependency 'org.hibernate.validator:hibernate-validator:9.0.1.Final' + dependency 'org.hibernate.validator:hibernate-validator:9.1.0.Final' dependency ('org.liquibase:liquibase-core:4.33.0') { exclude 'javax.xml.bind:jaxb-api' } dependency 'org.liquibase.ext:liquibase-postgresql:4.33.0' - dependency ('org.dom4j:dom4j:2.1.4') { + dependency ('org.dom4j:dom4j:2.2.0') { exclude 'relaxngDatatype:relaxngDatatype' // already in com.sun.xml.bind:jaxb-osgi:2.3.0.1 // FINERACT-940 && FINERACT-966 https://github.com/spotbugs/spotbugs/issues/1128 exclude 'xpp3:xpp3' @@ -225,34 +225,34 @@ dependencyManagement { } dependency 'org.owasp.esapi:esapi:2.7.0.0' - dependency 'org.awaitility:awaitility:4.2.2' + dependency 'org.awaitility:awaitility:4.3.0' - dependencySet(group: 'org.apache.poi', version: '5.4.1') { + dependencySet(group: 'org.apache.poi', version: '5.5.1') { entry 'poi' entry 'poi-ooxml' entry 'poi-ooxml-schemas' } - dependencySet(group: 'io.rest-assured', version: '5.5.1') { + dependencySet(group: 'io.rest-assured', version: '5.5.7') { entry 'rest-assured' entry 'json-path' entry 'xml-path' } - dependency 'org.apache.groovy:groovy-xml:5.0.2' - dependency 'org.apache.groovy:groovy-json:5.0.2' + dependency 'org.apache.groovy:groovy-xml:5.0.6' + dependency 'org.apache.groovy:groovy-json:5.0.6' dependency 'org.mapstruct:mapstruct:1.6.3' dependency 'org.mapstruct:mapstruct-processor:1.6.3' - dependency "org.apache.avro:avro:1.12.0" + dependency "org.apache.avro:avro:1.12.1" - dependency ('org.mariadb.jdbc:mariadb-java-client:3.5.7') { + dependency ('org.mariadb.jdbc:mariadb-java-client:3.5.8') { exclude 'org.slf4j:jcl-over-slf4j' exclude 'org.slf4j:slf4j-api' } - dependency 'org.postgresql:postgresql:42.7.9' + dependency 'org.postgresql:postgresql:42.7.11' - dependency 'com.mysql:mysql-connector-j:9.3.0' + dependency 'com.mysql:mysql-connector-j:9.7.0' dependency 'org.assertj:assertj-core:3.27.7' @@ -261,24 +261,24 @@ dependencyManagement { dependency 'org.mockito:mockito-inline:5.2.0' - dependency 'org.wiremock:wiremock-standalone:3.13.0' - dependency 'org.apache.sshd:sshd-common:2.15.0' - dependency 'org.apache.sshd:sshd-core:2.15.0' + dependency 'org.wiremock:wiremock-standalone:3.13.2' + dependency 'org.apache.sshd:sshd-common:2.17.1' + dependency 'org.apache.sshd:sshd-core:2.17.1' - dependency 'io.cucumber:cucumber-java:7.20.1' - dependency 'io.cucumber:cucumber-java8:7.20.1' - dependency 'io.cucumber:cucumber-junit-platform-engine:7.20.1' - dependency 'io.cucumber:cucumber-spring:7.20.1' + dependency 'io.cucumber:cucumber-java:7.34.3' + dependency 'io.cucumber:cucumber-java8:7.34.3' + dependency 'io.cucumber:cucumber-junit-platform-engine:7.34.3' + dependency 'io.cucumber:cucumber-spring:7.34.3' dependency 'org.reflections:reflections:0.10.2' dependency 'org.openjdk.jmh:jmh-core:1.37' dependency 'org.openjdk.jmh:jmh-generator-annprocess:1.37' - dependency 'org.springframework.restdocs:spring-restdocs-asciidoctor:3.0.3' - dependency 'org.springframework.restdocs:spring-restdocs-mockmvc:3.0.3' - dependency 'org.springframework.restdocs:spring-restdocs-webtestclient:3.0.3' - dependency 'org.springframework.restdocs:spring-restdocs-restassured:3.0.3' + dependency 'org.springframework.restdocs:spring-restdocs-asciidoctor:3.0.5' + dependency 'org.springframework.restdocs:spring-restdocs-mockmvc:3.0.5' + dependency 'org.springframework.restdocs:spring-restdocs-webtestclient:3.0.5' + dependency 'org.springframework.restdocs:spring-restdocs-restassured:3.0.5' dependency 'com.lmax:disruptor:4.0.0' @@ -289,22 +289,22 @@ dependencyManagement { } dependency 'com.ibm.icu:icu4j:78.3' - dependency 'org.yakworks:spring-icu4j:0.4.2' - dependency 'org.apache.commons:commons-lang3:3.18.0' - dependency 'com.nimbusds:nimbus-jose-jwt:10.0.2' + dependency 'org.yakworks:spring-icu4j:0.5.2' + dependency 'org.apache.commons:commons-lang3:3.20.0' + dependency 'com.nimbusds:nimbus-jose-jwt:10.9' // Force Spring Framework version: CVE-2025-41249 (now managed by Spring Boot 3.5.13 BOM at 6.2.17) - dependency 'org.springframework:spring-core:6.2.17' + dependency 'org.springframework:spring-core:6.2.18' // Force Spring Security version: CVE-2025-41248, CVE-2026-22732 - dependency 'org.springframework.security:spring-security-core:6.5.9' + dependency 'org.springframework.security:spring-security-core:6.5.10' // Force netty-codec version: CVE-2025-67735, CVE-2026-33870, CVE-2026-33871 - dependency 'io.netty:netty-codec:4.1.132.Final' - dependency 'io.netty:netty-codec-http:4.1.132.Final' - dependency 'io.netty:netty-codec-http2:4.1.132.Final' + dependency 'io.netty:netty-codec:4.2.13.Final' + dependency 'io.netty:netty-codec-http:4.2.13.Final' + dependency 'io.netty:netty-codec-http2:4.2.13.Final' // Force lz4-java version: CVE-2025-12183 - dependency 'at.yawk.lz4:lz4-java:1.10.1' + dependency 'at.yawk.lz4:lz4-java:1.11.0' // Force Thymeleaf version: CVE-2026-40477, CVE-2026-40478 (Spring Boot 3.5.13 still ships 3.1.3) - dependency 'org.thymeleaf:thymeleaf:3.1.4.RELEASE' - dependency 'org.thymeleaf:thymeleaf-spring6:3.1.4.RELEASE' + dependency 'org.thymeleaf:thymeleaf:3.1.5.RELEASE' + dependency 'org.thymeleaf:thymeleaf-spring6:3.1.5.RELEASE' // Force tomcat-embed-core version: CVE-2025-24813, CVE-2025-66614, CVE-2026-29145, CVE-2026-24734, CVE-2026-34483, CVE-2026-34487 dependency 'org.apache.tomcat.embed:tomcat-embed-core:10.1.54' dependency 'org.apache.tomcat.embed:tomcat-embed-el:10.1.54' diff --git a/docker-compose-postgresql-kafka.yml b/docker-compose-postgresql-kafka.yml index 3a9bbb72a4c..45a9401cac2 100644 --- a/docker-compose-postgresql-kafka.yml +++ b/docker-compose-postgresql-kafka.yml @@ -20,7 +20,7 @@ version: "3.7" services: kafka: - image: "apache/kafka:4.1.1-rc2" + image: "apache/kafka:4.2.0-rc2" ports: - "9092:9092" env_file: diff --git a/fineract-e2e-tests-runner/build.gradle b/fineract-e2e-tests-runner/build.gradle index efa762c44e2..0793bc2e8c5 100644 --- a/fineract-e2e-tests-runner/build.gradle +++ b/fineract-e2e-tests-runner/build.gradle @@ -18,8 +18,8 @@ */ plugins { - id 'se.thinkcode.cucumber-runner' version '0.0.11' - id 'io.qameta.allure' version '3.0.2' + id 'se.thinkcode.cucumber-runner' version '0.0.14' + id 'io.qameta.allure' version '3.2.0' } apply plugin: 'java' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da476b..4f5eb9dcc0e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle index cd1caeb12cd..cc45f2797ae 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,7 +19,7 @@ plugins { id 'com.gradle.develocity' version '3.18.2' - id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.0.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.6.0' } def isCI = System.getenv('JENKINS_URL') != null From d9e3602b8487a2d766dc5b4069b3f8046e9f1fab Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 8 May 2026 01:29:50 +0000 Subject: [PATCH 2/4] FINERACT-2421: Update non-major --- build.gradle | 22 ++++++------ fineract-client-feign/build.gradle | 2 +- fineract-client-feign/dependencies.gradle | 24 ++++++------- fineract-doc/build.gradle | 6 ++-- fineract-e2e-tests-core/build.gradle | 44 +++++++++++------------ fineract-e2e-tests-runner/build.gradle | 40 ++++++++++----------- integration-tests/dependencies.gradle | 2 +- oauth2-tests/build.gradle | 6 ++-- oauth2-tests/dependencies.gradle | 2 +- twofactor-tests/dependencies.gradle | 2 +- 10 files changed, 75 insertions(+), 75 deletions(-) diff --git a/build.gradle b/build.gradle index 97ce5d2b61f..ab52de4225d 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ // TODO: this is work in progress, please follow FINERACT-1171 buildscript { ext { - jacocoVersion = '0.8.12' + jacocoVersion = '0.8.14' retrofitVersion = '2.9.0' okhttpVersion = '4.9.3' fineractCustomProjects = [] @@ -99,11 +99,11 @@ buildscript { dependencies { classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0' - classpath 'org.eclipse.persistence:eclipselink:4.0.6' + classpath 'org.eclipse.persistence:eclipselink:4.0.9' classpath 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' classpath 'com.google.cloud.tools:jib-layer-filter-extension-gradle:0.3.0' - classpath 'org.apache.commons:commons-lang3:3.18.0' - classpath 'io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.22' + classpath 'org.apache.commons:commons-lang3:3.20.0' + classpath 'io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.49' classpath 'jakarta.servlet:jakarta.servlet-api:6.1.0' } } @@ -184,7 +184,7 @@ allprojects { resolutionStrategy { dependencySubstitution { // Substitution is to resolve CVE-2025-12183 - substitute module('org.lz4:lz4-java') using module('at.yawk.lz4:lz4-java:1.10.1') + substitute module('org.lz4:lz4-java') using module('at.yawk.lz4:lz4-java:1.11.0') } } } @@ -554,7 +554,7 @@ configure(project.fineractJavaProjects) { // Configuration for the Checkstyle plugin // https://docs.gradle.org/current/userguide/checkstyle_plugin.html dependencies { - checkstyle 'com.puppycrawl.tools:checkstyle:11.0.0' + checkstyle 'com.puppycrawl.tools:checkstyle:11.1.0' checkstyle 'com.github.sevntu-checkstyle:sevntu-checks:1.44.1' } @@ -584,7 +584,7 @@ configure(project.fineractJavaProjects) { // Configuration for the errorprone plugin // https://github.com/tbroyer/gradle-errorprone-plugin dependencies { - errorprone "com.google.errorprone:error_prone_core:2.35.1" + errorprone "com.google.errorprone:error_prone_core:2.49.0" } tasks.withType(JavaCompile).configureEach { @@ -838,10 +838,10 @@ configure(project.fineractCustomProjects) { 'org.awaitility:awaitility', 'io.github.classgraph:classgraph', 'io.cucumber:cucumber-core', - 'io.cucumber:cucumber-java:7.20.1', - 'io.cucumber:cucumber-java8:7.20.1', - 'io.cucumber:cucumber-junit-platform-engine:7.20.1', - 'io.cucumber:cucumber-spring:7.20.1', + 'io.cucumber:cucumber-java:7.34.3', + 'io.cucumber:cucumber-java8:7.34.3', + 'io.cucumber:cucumber-junit-platform-engine:7.34.3', + 'io.cucumber:cucumber-spring:7.34.3', ) testCompileOnly('org.projectlombok:lombok') diff --git a/fineract-client-feign/build.gradle b/fineract-client-feign/build.gradle index 26021aaed8d..f908c544801 100644 --- a/fineract-client-feign/build.gradle +++ b/fineract-client-feign/build.gradle @@ -170,7 +170,7 @@ spotbugsTest { } jacoco { - toolVersion = "0.8.11" + toolVersion = "0.8.14" } jacocoTestReport { diff --git a/fineract-client-feign/dependencies.gradle b/fineract-client-feign/dependencies.gradle index ebc09f7973b..93e2014480b 100644 --- a/fineract-client-feign/dependencies.gradle +++ b/fineract-client-feign/dependencies.gradle @@ -19,29 +19,29 @@ dependencies { // Feign dependencies implementation( - 'io.github.openfeign:feign-core:13.6', - 'io.github.openfeign:feign-jackson:13.6', - 'io.github.openfeign:feign-slf4j:13.6', - 'io.github.openfeign:feign-hc5:13.6', - 'io.github.openfeign:feign-okhttp:13.6', + 'io.github.openfeign:feign-core:13.12', + 'io.github.openfeign:feign-jackson:13.12', + 'io.github.openfeign:feign-slf4j:13.12', + 'io.github.openfeign:feign-hc5:13.12', + 'io.github.openfeign:feign-okhttp:13.12', 'io.github.openfeign.form:feign-form:3.8.0', - 'org.apache.httpcomponents.client5:httpclient5:5.2.1', + 'org.apache.httpcomponents.client5:httpclient5:5.6.1', 'com.squareup.okhttp3:okhttp:4.12.0', 'com.fasterxml.jackson.core:jackson-databind', 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310', 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8', 'jakarta.annotation:jakarta.annotation-api:3.0.0', - 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.15', - 'org.apache.commons:commons-lang3:3.12.0', + 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.49', + 'org.apache.commons:commons-lang3:3.20.0', 'org.projectlombok:lombok' ) // Test dependencies testImplementation( - 'org.junit.jupiter:junit-jupiter-api:5.11.3', - 'org.junit.jupiter:junit-jupiter-engine:5.11.3', - 'org.mockito:mockito-core:5.14.2', - 'org.assertj:assertj-core:3.26.3', + 'org.junit.jupiter:junit-jupiter-api:5.14.4', + 'org.junit.jupiter:junit-jupiter-engine:5.14.4', + 'org.mockito:mockito-core:5.23.0', + 'org.assertj:assertj-core:3.27.7', 'org.wiremock:wiremock-standalone' ) } diff --git a/fineract-doc/build.gradle b/fineract-doc/build.gradle index 6fcb0a88615..13aef3b0130 100644 --- a/fineract-doc/build.gradle +++ b/fineract-doc/build.gradle @@ -26,7 +26,7 @@ buildscript { dependencies { classpath 'org.asciidoctor:asciidoctor-gradle-jvm:4.0.5' classpath 'org.asciidoctor:asciidoctor-gradle-jvm-pdf:4.0.5' - classpath 'org.yaml:snakeyaml:2.5' + classpath 'org.yaml:snakeyaml:2.6' } } @@ -42,8 +42,8 @@ apply plugin: 'org.asciidoctor.jvm.pdf' configurations.all { resolutionStrategy { // Force specific versions of dependencies to avoid conflicts - force 'org.yaml:snakeyaml:2.5', - 'org.jruby:jruby-complete:10.0.2.0' + force 'org.yaml:snakeyaml:2.6', + 'org.jruby:jruby-complete:10.1.0.0' } } diff --git a/fineract-e2e-tests-core/build.gradle b/fineract-e2e-tests-core/build.gradle index 747a62ecc86..ab7e1581952 100644 --- a/fineract-e2e-tests-core/build.gradle +++ b/fineract-e2e-tests-core/build.gradle @@ -66,40 +66,40 @@ dependencies { testImplementation 'com.github.spotbugs:spotbugs-annotations' - testImplementation 'com.squareup.retrofit2:retrofit:2.11.0' - testImplementation 'io.github.openfeign:feign-core:13.6' - testImplementation 'io.github.openfeign:feign-jackson:13.6' + testImplementation 'com.squareup.retrofit2:retrofit:2.12.0' + testImplementation 'io.github.openfeign:feign-core:13.12' + testImplementation 'io.github.openfeign:feign-jackson:13.12' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'org.apache.commons:commons-lang3:3.18.0' + testImplementation 'org.apache.commons:commons-lang3:3.20.0' testImplementation 'com.google.guava:guava' testImplementation ('com.googlecode.json-simple:json-simple:1.1.1') { exclude group: 'junit', module: 'junit' } - testImplementation 'com.google.code.gson:gson:2.11.0' + testImplementation 'com.google.code.gson:gson:2.14.0' - testImplementation 'io.cucumber:cucumber-java:7.20.1' - testImplementation 'io.cucumber:cucumber-junit:7.20.1' - testImplementation 'io.cucumber:cucumber-spring:7.20.1' - testImplementation 'io.cucumber:cucumber-junit-platform-engine:7.20.1' + testImplementation 'io.cucumber:cucumber-java:7.34.3' + testImplementation 'io.cucumber:cucumber-junit:7.34.3' + testImplementation 'io.cucumber:cucumber-spring:7.34.3' + testImplementation 'io.cucumber:cucumber-junit-platform-engine:7.34.3' - testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.29.1' + testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.34.0' - testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.3' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.14.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.14.4' - testCompileOnly 'org.projectlombok:lombok:1.18.36' - testAnnotationProcessor 'org.projectlombok:lombok:1.18.36' + testCompileOnly 'org.projectlombok:lombok:1.18.46' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.46' - testImplementation "ch.qos.logback:logback-core:1.5.19" - testImplementation "ch.qos.logback:logback-classic:1.5.19" + testImplementation "ch.qos.logback:logback-core:1.5.32" + testImplementation "ch.qos.logback:logback-classic:1.5.32" - testImplementation 'org.apache.activemq:activemq-client:6.1.6' - testImplementation "org.apache.avro:avro:1.12.0" - testImplementation "org.awaitility:awaitility:4.2.2" - testImplementation 'io.github.classgraph:classgraph:4.8.179' + testImplementation 'org.apache.activemq:activemq-client:6.2.5' + testImplementation "org.apache.avro:avro:1.12.1" + testImplementation "org.awaitility:awaitility:4.3.0" + testImplementation 'io.github.classgraph:classgraph:4.8.184' - testImplementation 'org.apache.commons:commons-collections4:4.4' + testImplementation 'org.apache.commons:commons-collections4:4.5.0' testImplementation 'org.springframework:spring-jdbc' testImplementation 'org.postgresql:postgresql' diff --git a/fineract-e2e-tests-runner/build.gradle b/fineract-e2e-tests-runner/build.gradle index 0793bc2e8c5..7b1dabcf242 100644 --- a/fineract-e2e-tests-runner/build.gradle +++ b/fineract-e2e-tests-runner/build.gradle @@ -38,38 +38,38 @@ dependencies { implementation 'org.springframework:spring-test' testImplementation 'org.springframework:spring-jms' - testImplementation 'com.squareup.retrofit2:retrofit:2.11.0' + testImplementation 'com.squareup.retrofit2:retrofit:2.12.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'org.apache.commons:commons-lang3:3.18.0' + testImplementation 'org.apache.commons:commons-lang3:3.20.0' testImplementation 'com.google.guava:guava' testImplementation ('com.googlecode.json-simple:json-simple:1.1.1') { exclude group: 'junit', module: 'junit' } - testImplementation 'com.google.code.gson:gson:2.11.0' + testImplementation 'com.google.code.gson:gson:2.14.0' - testImplementation 'org.junit.platform:junit-platform-suite:1.11.4' - testImplementation 'org.junit.platform:junit-platform-console:1.11.4' - testImplementation 'io.cucumber:cucumber-java:7.20.1' - testImplementation 'io.cucumber:cucumber-junit:7.20.1' - testImplementation 'io.cucumber:cucumber-spring:7.20.1' - testImplementation 'io.cucumber:cucumber-junit-platform-engine:7.20.1' + testImplementation 'org.junit.platform:junit-platform-suite:1.14.4' + testImplementation 'org.junit.platform:junit-platform-console:1.14.4' + testImplementation 'io.cucumber:cucumber-java:7.34.3' + testImplementation 'io.cucumber:cucumber-junit:7.34.3' + testImplementation 'io.cucumber:cucumber-spring:7.34.3' + testImplementation 'io.cucumber:cucumber-junit-platform-engine:7.34.3' - testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.29.1' + testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.34.0' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.7' - testCompileOnly 'org.projectlombok:lombok:1.18.36' - testAnnotationProcessor 'org.projectlombok:lombok:1.18.36' + testCompileOnly 'org.projectlombok:lombok:1.18.46' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.46' - testImplementation "ch.qos.logback:logback-core:1.5.19" - testImplementation "ch.qos.logback:logback-classic:1.5.19" + testImplementation "ch.qos.logback:logback-core:1.5.32" + testImplementation "ch.qos.logback:logback-classic:1.5.32" - testImplementation 'org.apache.activemq:activemq-client:6.1.6' - testImplementation "org.apache.avro:avro:1.12.0" - testImplementation "org.awaitility:awaitility:4.2.2" - testImplementation 'io.github.classgraph:classgraph:4.8.179' + testImplementation 'org.apache.activemq:activemq-client:6.2.5' + testImplementation "org.apache.avro:avro:1.12.1" + testImplementation "org.awaitility:awaitility:4.3.0" + testImplementation 'io.github.classgraph:classgraph:4.8.184' - testImplementation 'org.apache.commons:commons-collections4:4.4' + testImplementation 'org.apache.commons:commons-collections4:4.5.0' testImplementation 'org.springframework:spring-jdbc' testImplementation 'org.postgresql:postgresql' diff --git a/integration-tests/dependencies.gradle b/integration-tests/dependencies.gradle index 6f5a7d412d8..f0794bca77f 100644 --- a/integration-tests/dependencies.gradle +++ b/integration-tests/dependencies.gradle @@ -20,7 +20,7 @@ dependencies { // testCompile dependencies are ONLY used in src/test, not src/main. // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly! // - tomcat 'org.apache.tomcat:tomcat:10.1.49@zip' + tomcat 'org.apache.tomcat:tomcat:10.1.54@zip' def providerMainOutput = project(':fineract-provider').extensions.getByType(SourceSetContainer).named('main').get().output testImplementation( providerMainOutput, project(path: ':fineract-core', configuration: 'runtimeElements'), diff --git a/oauth2-tests/build.gradle b/oauth2-tests/build.gradle index e6098f250a3..b72eb77d446 100644 --- a/oauth2-tests/build.gradle +++ b/oauth2-tests/build.gradle @@ -35,9 +35,9 @@ configurations { } dependencies { driver 'com.mysql:mysql-connector-j' - testImplementation 'org.seleniumhq.selenium:selenium-java:4.21.0' - testImplementation 'io.github.bonigarcia:webdrivermanager:6.3.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' + testImplementation 'org.seleniumhq.selenium:selenium-java:4.43.0' + testImplementation 'io.github.bonigarcia:webdrivermanager:6.3.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.14.4' } cargo { diff --git a/oauth2-tests/dependencies.gradle b/oauth2-tests/dependencies.gradle index c66dfb9a2b9..021a2df78e7 100644 --- a/oauth2-tests/dependencies.gradle +++ b/oauth2-tests/dependencies.gradle @@ -20,7 +20,7 @@ dependencies { // testCompile dependencies are ONLY used in src/test, not src/main. // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly! // - tomcat 'org.apache.tomcat:tomcat:10.1.49@zip' + tomcat 'org.apache.tomcat:tomcat:10.1.54@zip' testImplementation( files("$rootDir/fineract-provider/build/classes/java/main/"), project(path: ':fineract-provider', configuration: 'runtimeElements'), project(path: ':fineract-security', configuration: 'runtimeElements'), diff --git a/twofactor-tests/dependencies.gradle b/twofactor-tests/dependencies.gradle index 30f99d7a439..c9f54c3c530 100644 --- a/twofactor-tests/dependencies.gradle +++ b/twofactor-tests/dependencies.gradle @@ -20,7 +20,7 @@ dependencies { // testCompile dependencies are ONLY used in src/test, not src/main. // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly! // - tomcat 'org.apache.tomcat:tomcat:10.1.49@zip' + tomcat 'org.apache.tomcat:tomcat:10.1.54@zip' testImplementation( files("$rootDir/fineract-provider/build/classes/java/main/"), project(path: ':fineract-provider', configuration: 'runtimeElements'), 'org.junit.jupiter:junit-jupiter-api', From 606468d961bad9e90e70e62f9d1070e0c94708be Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Fri, 22 May 2026 11:53:54 +0100 Subject: [PATCH 3/4] FINERACT-2421: Update dependencies --- .github/workflows/build-core.yml | 2 +- .../mifos-fineract-client-publish.yml | 2 +- .github/workflows/stale.yml | 2 +- build.gradle | 4 +- .../org.apache.fineract.dependencies.gradle | 27 ++++++-- .../journalentry/domain/JournalEntry.java | 2 +- fineract-client-feign/build.gradle | 12 ++-- fineract-client-feign/dependencies.gradle | 1 + .../client/feign/ObjectMapperFactory.java | 4 ++ .../DocumentsApiFixedIntegrationTest.java | 2 +- .../services/ImagesApiIntegrationTest.java | 2 +- .../fineract/client/util/FeignPartsTest.java | 8 +-- fineract-client/build.gradle | 26 ++++---- fineract-client/dependencies.gradle | 1 + .../test/FineractClientTechnicalTest.java | 3 +- .../core/exception/MultiException.java | 2 +- .../security/utils/ColumnValidator.java | 2 - .../security/utils/SQLBuilder.java | 2 +- .../fineract/util/StreamResponseUtil.java | 3 +- .../en/chapters/release/process-step06.adoc | 2 +- fineract-document/dependencies.gradle | 4 +- .../detector/FileContentDetector.java | 3 +- .../service/FileContentStoreService.java | 6 +- .../detector/TikaContentDetectorTest.java | 14 ++-- .../processor/ContentProcessorTest.java | 7 +- .../src/test/resources/cucumber.properties | 1 + .../test/resources/junit-platform.properties | 1 + ...ProductAttributesWriteServiceImplTest.java | 1 - .../portfolio/loanaccount/domain/Loan.java | 66 +++++++++---------- .../domain/LoanCollateralManagement.java | 2 +- fineract-provider/build.gradle | 39 +++++++++-- fineract-provider/dependencies.gradle | 4 +- .../BulkImportWorkbookServiceImpl.java | 3 +- .../email/api/EmailCampaignApiResource.java | 2 +- .../executeemail/ExecuteEmailTasklet.java | 20 +++--- .../ExecuteReportMailingJobsTasklet.java | 30 +++++---- .../core/auditing/CustomAuditingHandler.java | 2 +- .../core/config/ContentS3Config.java | 4 +- .../BodyCachingHttpServletRequestWrapper.java | 7 +- .../core/jersey/converter/JsonConverter.java | 3 +- ...acksonLocalDateBeanSerializerModifier.java | 2 - .../serializer/JacksonSerializerAdapter.java | 3 +- .../JacksonLocalDateArraySerializer.java | 3 +- .../service/ReadReportingServiceImpl.java | 25 +++---- .../PdfDatatableReportExportService.java | 3 +- .../reportmailingjob/helper/IPv4Helper.java | 2 +- .../infrastructure/s3/AmazonS3Config.java | 4 +- .../api/LoansApiResourceSwagger.java | 2 +- .../ShareAccountReadPlatformServiceImpl.java | 2 +- ...COBBusinessStepServiceStepDefinitions.java | 3 - .../InitialisationTaskletStepDefinitions.java | 2 - .../ApplyLoanLockTaskletStepDefinitions.java | 2 - .../LoanItemProcessorStepDefinitions.java | 2 - .../loan/LoanItemReaderStepDefinitions.java | 2 - .../COBBulkEventConfigurationTest.java | 3 +- .../InlineLoanCOBExecutorServiceImplTest.java | 3 +- ...ommandHandlerExceptionStepDefinitions.java | 2 - .../service/CommandSourceServiceTest.java | 2 - ...nchronousCommandProcessingServiceTest.java | 2 - .../BusinessDateWritePlatformServiceTest.java | 3 +- .../ClasspathDuplicatesStepDefinitions.java | 6 +- .../core/MultiExceptionStepDefinitions.java | 3 - ...tegrationWritePlatformServiceImplTest.java | 2 - .../service/DatatableReadServiceImplTest.java | 3 +- .../kafka/KafkaExternalEventProducerTest.java | 3 +- ...lEventConfigurationRepositoryImplTest.java | 3 +- ...onBusinessEventServiceIntegrationTest.java | 3 +- gradle.properties | 2 +- integration-tests/build.gradle | 4 +- .../ClientLoanIntegrationTest.java | 3 +- .../ExternalBusinessEventTest.java | 2 +- .../fineract/integrationtests/StaffTest.java | 3 +- .../LocalContentStorageUtil.java | 6 +- .../client/ClientEntityImportHandlerTest.java | 38 ++++++----- .../loan/LoanImportHandlerTest.java | 39 +++++------ .../office/OfficeImportHandlerTest.java | 38 +++++------ .../savings/SavingsImportHandlerTest.java | 39 +++++------ .../integrationtests/client/DocumentTest.java | 3 +- .../client/FeignDocumentTest.java | 3 +- .../client/FeignImageTest.java | 3 +- .../integrationtests/client/ImageTest.java | 5 +- .../integrationtests/common/BatchHelper.java | 22 +++++-- .../common/organisation/CampaignsTest.java | 9 ++- .../ExternalAssetOwnerTransferCancelTest.java | 4 +- .../ExternalAssetOwnerTransferTest.java | 4 +- ...nitiateExternalAssetOwnerTransferTest.java | 4 +- 86 files changed, 352 insertions(+), 302 deletions(-) diff --git a/.github/workflows/build-core.yml b/.github/workflows/build-core.yml index a72f9578be9..d315730dc39 100644 --- a/.github/workflows/build-core.yml +++ b/.github/workflows/build-core.yml @@ -51,7 +51,7 @@ jobs: run: ./gradlew --no-daemon :fineract-provider:generateGitProperties -x javadoc -x javadocJar -x checkstyleMain -x checkstyleTest -x checkstyleJmh -x spotbugsMain -x spotbugsTest -x spotlessCheck -x spotlessApply -x rat - name: Verify generated git.properties - run: test -f fineract-provider/build/resources/main/git.properties + run: test -f fineract-provider/build/generated-resources/git/git.properties - name: Build Fineract Client Java SDK run: ./gradlew --no-daemon :fineract-client:buildJavaSdk -x test -x cucumber -x doc -x javadoc -x javadocJar -x checkstyleMain -x checkstyleTest -x checkstyleJmh -x spotbugsMain -x spotbugsTest -x spotlessCheck -x spotlessApply -x rat diff --git a/.github/workflows/mifos-fineract-client-publish.yml b/.github/workflows/mifos-fineract-client-publish.yml index 4f27e8a1ed5..4c824bbb919 100644 --- a/.github/workflows/mifos-fineract-client-publish.yml +++ b/.github/workflows/mifos-fineract-client-publish.yml @@ -22,7 +22,7 @@ jobs: with: fetch-depth: 0 - name: Generate build number - uses: onyxmueller/build-tag-number@bbb3e6dd40d79811d5fb661e5d6651c1748f4210 # v1.0.4 + uses: onyxmueller/build-tag-number@a0792399755057a06c7805cae3299807cbaf0035 # v1.0.5 with: token: ${{ secrets.GITHUB_TOKEN }} - name: Set up JDK 21 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index c92027ecb10..03afaea1741 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10 + - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} # stale-issue-message: 'Stale issue message' diff --git a/build.gradle b/build.gradle index ab52de4225d..49aadda0d71 100644 --- a/build.gradle +++ b/build.gradle @@ -212,6 +212,7 @@ allprojects { "SameNameButDifferent", // Until errorprone recognizes Lombok "MultiVariableDeclaration", // Until errorprone recognizes Lombok "UnnecessaryDefaultInEnumSwitch", // FINERACT-1911 + "StringConcatToTextBlock", // Error Prone 2.49.0 crashes on JDK 21, raised issue: https://github.com/google/error-prone/issues/5815 "AssertEqualsArgumentOrderChecker", "RemoveUnusedImports" // For generated code ) @@ -459,6 +460,7 @@ configure(project.fineractJavaProjects) { } tasks.withType(JavaCompile).configureEach { options.compilerArgs += [ + "-XDaddTypeAnnotationsToSymbol=true", "-Xlint:cast", "-Xlint:auxiliaryclass", "-Xlint:dep-ann", @@ -554,7 +556,7 @@ configure(project.fineractJavaProjects) { // Configuration for the Checkstyle plugin // https://docs.gradle.org/current/userguide/checkstyle_plugin.html dependencies { - checkstyle 'com.puppycrawl.tools:checkstyle:11.1.0' + checkstyle 'com.puppycrawl.tools:checkstyle:13.4.2' checkstyle 'com.github.sevntu-checkstyle:sevntu-checks:1.44.1' } diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index 8336a64251f..f1ff35138b1 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -26,7 +26,7 @@ dependencyManagement { mavenBom 'org.slf4j:slf4j-bom:2.0.17' mavenBom 'io.micrometer:micrometer-bom:1.16.5' mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.14' - mavenBom 'io.awspring.cloud:spring-cloud-aws-dependencies:3.4.2' + mavenBom 'io.awspring.cloud:spring-cloud-aws-dependencies:4.0.2' mavenBom 'io.opentelemetry:opentelemetry-bom:1.62.0' mavenBom 'org.jetbrains.kotlin:kotlin-bom:2.3.21' mavenBom 'org.junit:junit-bom:5.14.4' @@ -134,6 +134,8 @@ dependencyManagement { dependency ('org.apache.httpcomponents:httpclient:4.5.14') { exclude 'commons-logging:commons-logging:' } + dependency 'org.apache.httpcomponents.core5:httpcore5:5.4' + dependency 'org.apache.httpcomponents.core5:httpcore5-h2:5.4' dependency 'jakarta.management.j2ee:jakarta.management.j2ee-api:1.1.4' dependency 'jakarta.jms:jakarta.jms-api:3.1.0' dependency 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' @@ -144,7 +146,7 @@ dependencyManagement { dependency 'org.awaitility:awaitility:4.3.0' dependency 'com.github.spotbugs:spotbugs-annotations:4.9.8' dependency 'javax.cache:cache-api:1.1.1' - dependency 'org.mock-server:mockserver-junit-jupiter:5.15.0' + dependency 'org.mock-server:mockserver-junit-jupiter:5.14.0' dependency 'org.webjars:webjars-locator-core:0.59' dependency 'com.icegreen:greenmail-junit5:2.0.1' @@ -296,10 +298,23 @@ dependencyManagement { dependency 'org.springframework:spring-core:6.2.18' // Force Spring Security version: CVE-2025-41248, CVE-2026-22732 dependency 'org.springframework.security:spring-security-core:6.5.10' - // Force netty-codec version: CVE-2025-67735, CVE-2026-33870, CVE-2026-33871 - dependency 'io.netty:netty-codec:4.2.13.Final' - dependency 'io.netty:netty-codec-http:4.2.13.Final' - dependency 'io.netty:netty-codec-http2:4.2.13.Final' + // Keep Netty on the 4.1 line for MockServer compatibility. + dependency 'io.netty:netty-buffer:4.1.133.Final' + dependency 'io.netty:netty-common:4.1.133.Final' + dependency 'io.netty:netty-codec:4.1.133.Final' + dependency 'io.netty:netty-codec-base:4.1.133.Final' + dependency 'io.netty:netty-codec-compression:4.1.133.Final' + dependency 'io.netty:netty-codec-http:4.1.133.Final' + dependency 'io.netty:netty-codec-http2:4.1.133.Final' + dependency 'io.netty:netty-codec-marshalling:4.1.133.Final' + dependency 'io.netty:netty-codec-protobuf:4.1.133.Final' + dependency 'io.netty:netty-codec-socks:4.1.133.Final' + dependency 'io.netty:netty-handler:4.1.133.Final' + dependency 'io.netty:netty-handler-proxy:4.1.133.Final' + dependency 'io.netty:netty-resolver:4.1.133.Final' + dependency 'io.netty:netty-transport:4.1.133.Final' + dependency 'io.netty:netty-transport-classes-epoll:4.1.133.Final' + dependency 'io.netty:netty-transport-native-unix-common:4.1.133.Final' // Force lz4-java version: CVE-2025-12183 dependency 'at.yawk.lz4:lz4-java:1.11.0' // Force Thymeleaf version: CVE-2026-40477, CVE-2026-40478 (Spring Boot 3.5.13 still ships 3.1.3) diff --git a/fineract-accounting/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntry.java b/fineract-accounting/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntry.java index d190e9f18d0..c3b21f252ba 100644 --- a/fineract-accounting/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntry.java +++ b/fineract-accounting/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntry.java @@ -44,7 +44,7 @@ public class JournalEntry extends AbstractAuditableWithUTCDateTimeCustom { @JoinColumn(name = "office_id", nullable = false) private Office office; - @ManyToOne() + @ManyToOne @JoinColumn(name = "payment_details_id") private PaymentDetail paymentDetail; diff --git a/fineract-client-feign/build.gradle b/fineract-client-feign/build.gradle index f908c544801..f46663965f7 100644 --- a/fineract-client-feign/build.gradle +++ b/fineract-client-feign/build.gradle @@ -25,11 +25,11 @@ apply from: 'dependencies.gradle' openApiMeta { generatorName = 'Fineract-Feign' packageName = 'org.apache.fineract.client.feign' - outputFolder = "$buildDir/meta".toString() + outputFolder = file("$buildDir/meta") } openApiValidate { - inputSpec = "file:///$swaggerFile" + inputSpec = file(swaggerFile) recommend = true } @@ -39,16 +39,16 @@ tasks.register('buildJavaSdk', org.openapitools.generator.gradle.plugin.tasks.Ge verbose = false validateSpec = false skipValidateSpec = true - inputSpec = "file:///$swaggerFile" - outputDir = "$buildDir/generated/temp-java".toString() - templateDir = "$projectDir/src/main/resources/templates/java" + inputSpec = file(swaggerFile) + outputDir = file("$buildDir/generated/temp-java") + templateDir = file("$projectDir/src/main/resources/templates/java") groupId = 'org.apache.fineract' apiPackage = 'org.apache.fineract.client.feign.services' invokerPackage = 'org.apache.fineract.client.feign' modelPackage = 'org.apache.fineract.client.models' generateModelTests = false generateApiTests = false - ignoreFileOverride = "$projectDir/.openapi-generator-ignore" + ignoreFileOverride = file("$projectDir/.openapi-generator-ignore") configOptions = [ dateLibrary : 'java8', library : 'feign', diff --git a/fineract-client-feign/dependencies.gradle b/fineract-client-feign/dependencies.gradle index 93e2014480b..746c3b465e6 100644 --- a/fineract-client-feign/dependencies.gradle +++ b/fineract-client-feign/dependencies.gradle @@ -30,6 +30,7 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind', 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310', 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8', + 'org.openapitools:jackson-databind-nullable:0.2.6', 'jakarta.annotation:jakarta.annotation-api:3.0.0', 'io.swagger.core.v3:swagger-annotations-jakarta:2.2.49', 'org.apache.commons:commons-lang3:3.20.0', diff --git a/fineract-client-feign/src/main/java/org/apache/fineract/client/feign/ObjectMapperFactory.java b/fineract-client-feign/src/main/java/org/apache/fineract/client/feign/ObjectMapperFactory.java index 18e163041e7..5c2d2c0f61a 100644 --- a/fineract-client-feign/src/main/java/org/apache/fineract/client/feign/ObjectMapperFactory.java +++ b/fineract-client-feign/src/main/java/org/apache/fineract/client/feign/ObjectMapperFactory.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.fineract.client.adapter.ExternalIdAdapter; +import org.openapitools.jackson.nullable.JsonNullableModule; /** * Factory for creating and configuring Jackson ObjectMapper instances. @@ -53,6 +54,9 @@ public static ObjectMapper createObjectMapper() { // Register Java 8 date/time support mapper.registerModule(new JavaTimeModule()); + // Support OpenAPI-generated JsonNullable fields + mapper.registerModule(new JsonNullableModule()); + // Register ExternalId adapter mapper.registerModule(ExternalIdAdapter.createModule()); diff --git a/fineract-client-feign/src/test/java/org/apache/fineract/client/services/DocumentsApiFixedIntegrationTest.java b/fineract-client-feign/src/test/java/org/apache/fineract/client/services/DocumentsApiFixedIntegrationTest.java index b59be072c4d..8eabd4c47c1 100644 --- a/fineract-client-feign/src/test/java/org/apache/fineract/client/services/DocumentsApiFixedIntegrationTest.java +++ b/fineract-client-feign/src/test/java/org/apache/fineract/client/services/DocumentsApiFixedIntegrationTest.java @@ -59,7 +59,7 @@ void setUp() throws IOException { config = FineractFeignClientConfig.builder().baseUrl("http://localhost:" + wireMockServer.port()).credentials("test", "test") .connectTimeout(5, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build(); - testDocumentFile = new File(tempDir, "test-doc.pdf"); + testDocumentFile = tempDir.toPath().resolve("test-doc.pdf").toFile(); Files.write(testDocumentFile.toPath(), "%PDF-1.4 test content".getBytes(StandardCharsets.UTF_8)); } diff --git a/fineract-client-feign/src/test/java/org/apache/fineract/client/services/ImagesApiIntegrationTest.java b/fineract-client-feign/src/test/java/org/apache/fineract/client/services/ImagesApiIntegrationTest.java index 8053b6a3e3e..dd58aa58e49 100644 --- a/fineract-client-feign/src/test/java/org/apache/fineract/client/services/ImagesApiIntegrationTest.java +++ b/fineract-client-feign/src/test/java/org/apache/fineract/client/services/ImagesApiIntegrationTest.java @@ -61,7 +61,7 @@ void setUp() throws IOException { config = FineractFeignClientConfig.builder().baseUrl("http://localhost:" + wireMockServer.port()).credentials("test", "test") .connectTimeout(5, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build(); - testImageFile = new File(tempDir, "test-image.jpg"); + testImageFile = tempDir.toPath().resolve("test-image.jpg").toFile(); Files.write(testImageFile.toPath(), new byte[] { (byte) 0xFF, (byte) 0xD8, (byte) 0xFF, 0x01, 0x02, 0x03 }); } diff --git a/fineract-client-feign/src/test/java/org/apache/fineract/client/util/FeignPartsTest.java b/fineract-client-feign/src/test/java/org/apache/fineract/client/util/FeignPartsTest.java index c095cb9fe59..d1164eaa884 100644 --- a/fineract-client-feign/src/test/java/org/apache/fineract/client/util/FeignPartsTest.java +++ b/fineract-client-feign/src/test/java/org/apache/fineract/client/util/FeignPartsTest.java @@ -229,7 +229,7 @@ void testFileNameWithInvalidContentDisposition() { @Test void testProbeContentTypeForJpegFile() throws IOException { - File jpegFile = new File(tempDir, "test.jpg"); + File jpegFile = tempDir.toPath().resolve("test.jpg").toFile(); Files.write(jpegFile.toPath(), new byte[] { (byte) 0xFF, (byte) 0xD8, (byte) 0xFF }); String contentType = FeignParts.probeContentType(jpegFile); @@ -239,7 +239,7 @@ void testProbeContentTypeForJpegFile() throws IOException { @Test void testProbeContentTypeForPdfFile() throws IOException { - File pdfFile = new File(tempDir, "test.pdf"); + File pdfFile = tempDir.toPath().resolve("test.pdf").toFile(); Files.write(pdfFile.toPath(), "%PDF-1.4".getBytes(StandardCharsets.UTF_8)); String contentType = FeignParts.probeContentType(pdfFile); @@ -249,7 +249,7 @@ void testProbeContentTypeForPdfFile() throws IOException { @Test void testProbeContentTypeFallsBackToMediaType() throws IOException { - File unknownFile = new File(tempDir, "test.docx"); + File unknownFile = tempDir.toPath().resolve("test.docx").toFile(); Files.write(unknownFile.toPath(), "test content".getBytes(StandardCharsets.UTF_8)); String contentType = FeignParts.probeContentType(unknownFile); @@ -260,7 +260,7 @@ void testProbeContentTypeFallsBackToMediaType() throws IOException { @Test void testProbeContentTypeForUnknownFile() throws IOException { - File unknownFile = new File(tempDir, "test.xyz"); + File unknownFile = tempDir.toPath().resolve("test.xyz").toFile(); Files.write(unknownFile.toPath(), "unknown content".getBytes(StandardCharsets.UTF_8)); String contentType = FeignParts.probeContentType(unknownFile); diff --git a/fineract-client/build.gradle b/fineract-client/build.gradle index 45c731ddeb6..d7d4ec43d1d 100644 --- a/fineract-client/build.gradle +++ b/fineract-client/build.gradle @@ -27,17 +27,17 @@ apply from: 'dependencies.gradle' openApiMeta { generatorName = 'Fineract' packageName = 'org.apache.fineract.client' - outputFolder = "$buildDir/meta".toString() + outputFolder = file("$buildDir/meta") // trick to make sure fineract.json is generated first } openApiValidate { - inputSpec = "file:///$swaggerFile" + inputSpec = file(swaggerFile) recommend = true } openApiGenerate { - outputDir = "$buildDir/generated/temp-java".toString() + outputDir = file("$buildDir/generated/temp-java") } idea { @@ -62,9 +62,9 @@ task buildJavaSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateT verbose = false validateSpec = false skipValidateSpec = true - inputSpec = "file:///$swaggerFile" - outputDir = "$buildDir/generated/temp-java".toString() - templateDir = "$projectDir/src/main/resources/templates/java" + inputSpec = file(swaggerFile) + outputDir = file("$buildDir/generated/temp-java") + templateDir = file("$projectDir/src/main/resources/templates/java") groupId = 'org.apache.fineract' apiPackage = 'org.apache.fineract.client.services' invokerPackage = 'org.apache.fineract.client' @@ -79,7 +79,7 @@ task buildJavaSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateT ] generateModelTests = false generateApiTests = false - ignoreFileOverride = "$projectDir/.openapi-generator-ignore" + ignoreFileOverride = file("$projectDir/.openapi-generator-ignore") dependsOn(':fineract-provider:resolve') } @@ -88,8 +88,8 @@ task buildTypescriptAngularSdk(type: org.openapitools.generator.gradle.plugin.ta verbose = false validateSpec = false skipValidateSpec = true - inputSpec = "file:///$swaggerFile" - outputDir = "$buildDir/generated/typescript".toString() + inputSpec = file(swaggerFile) + outputDir = file("$buildDir/generated/typescript") apiPackage = 'apache-fineract-client/services' invokerPackage = 'apache-fineract-client/invoker' modelPackage = 'apache-fineract-client/models' @@ -108,8 +108,8 @@ task buildTypescriptFetchSdk(type: org.openapitools.generator.gradle.plugin.task verbose = false validateSpec = false skipValidateSpec = true - inputSpec = "file:///$swaggerFile" - outputDir = "$buildDir/generated/typescript-fetch".toString() + inputSpec = file(swaggerFile) + outputDir = file("$buildDir/generated/typescript-fetch") configOptions = [ npmName: '@apache/fineract-client-fetch', npmVersion: '1.12.0-SNAPSHOT', @@ -125,8 +125,8 @@ task buildAsciidoc(type: org.openapitools.generator.gradle.plugin.tasks.Generate verbose = false validateSpec = false skipValidateSpec = true - inputSpec = "file:///$swaggerFile" - outputDir = "$buildDir/generated/asciidoc".toString() + inputSpec = file(swaggerFile) + outputDir = file("$buildDir/generated/asciidoc") apiPackage = 'org.apache.fineract.client.services' invokerPackage = 'org.apache.fineract.client' modelPackage = 'org.apache.fineract.client.models' diff --git a/fineract-client/dependencies.gradle b/fineract-client/dependencies.gradle index aad45729a1e..11d00868c4f 100644 --- a/fineract-client/dependencies.gradle +++ b/fineract-client/dependencies.gradle @@ -29,6 +29,7 @@ dependencies { 'com.squareup.retrofit2:converter-scalars', 'com.squareup.retrofit2:converter-gson', 'io.gsonfire:gson-fire', + 'org.openapitools:jackson-databind-nullable:0.2.6', 'com.google.code.findbugs:jsr305', 'com.github.spotbugs:spotbugs-annotations', 'com.squareup.okhttp3:okhttp', diff --git a/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java b/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java index 5e63c3a0e17..480a9cf2a4a 100644 --- a/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java +++ b/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java @@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.fineract.client.util.FineractClient; import org.junit.jupiter.api.Test; @@ -29,7 +28,7 @@ * * @author Michael Vorburger.ch */ -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class FineractClientTechnicalTest { @Test diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiException.java index df1367ab1b9..7cc2929af36 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiException.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/MultiException.java @@ -43,7 +43,7 @@ *

* . * - * @author Michael Vorburger.ch + * @author Michael Vorburger.ch (mike at vorburger.ch) */ @Slf4j public class MultiException extends Exception { diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/ColumnValidator.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/ColumnValidator.java index 444aad2fea6..720fa305651 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/ColumnValidator.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/ColumnValidator.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.infrastructure.security.utils; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -48,7 +47,6 @@ public class ColumnValidator { private final SqlValidator sqlValidator; private final JdbcTemplate jdbcTemplate; - @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", justification = "TODO: fix this!") private void validateColumn(Map> tableColumnMap) { Connection connection = null; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLBuilder.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLBuilder.java index 694a65aa6f7..79cda0922d1 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLBuilder.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLBuilder.java @@ -31,7 +31,7 @@ * instead of manually assembling SQL queries, then SqlValidator should not be required anymore. (Correctly using this * means only ever passing completely fixed String literals to .) * - * @author Michael Vorburger + * @author Michael Vorburger (mike at vorburger.ch) */ public class SQLBuilder { diff --git a/fineract-core/src/main/java/org/apache/fineract/util/StreamResponseUtil.java b/fineract-core/src/main/java/org/apache/fineract/util/StreamResponseUtil.java index 9beb490df40..dfd6d4aa163 100644 --- a/fineract-core/src/main/java/org/apache/fineract/util/StreamResponseUtil.java +++ b/fineract-core/src/main/java/org/apache/fineract/util/StreamResponseUtil.java @@ -33,7 +33,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @Slf4j @@ -51,7 +50,7 @@ public static Response ok(final StreamResponseData content) { @Override public void write(OutputStream out) throws IOException { - IOUtils.copy(content.getStream(), out); + content.getStream().transferTo(out); } }; diff --git a/fineract-doc/src/docs/en/chapters/release/process-step06.adoc b/fineract-doc/src/docs/en/chapters/release/process-step06.adoc index 19cd73dac39..5cca8334efe 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step06.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step06.adoc @@ -11,7 +11,7 @@ Create source and binary tarballs. ./gradlew srcDistTar binaryDistTar ---- -Check that `fineract-provider/build/classes/java/main/git.properties` exists. If so, continue. If not, you're likely encountering https://github.com/n0mer/gradle-git-properties/issues/233[this bug], and you need to *re-run the command above* to create proper source and binary tarballs. That `git.properties` file is supposed to end up at `BOOT-INF/classes/git.properties` in `fineract-provider-{revnumber}.jar` in the binary release tarball. Its contents are displayed at the `/fineract-provider/actuator/info` endpoint. It may be possible to fix this heisenbug entirely by https://github.com/gradle/gradle/issues/34177#issuecomment-3051970053[modifying our git properties gradle plugin config] in `fineract-provider/build.gradle`, perhaps by changing where `git.properties` is written. +Check that `fineract-provider/build/generated-resources/git/git.properties` exists. If so, continue. If not, you're likely encountering https://github.com/n0mer/gradle-git-properties/issues/233[this bug], and you need to *re-run the command above* to create proper source and binary tarballs. That `git.properties` file is supposed to end up at `BOOT-INF/classes/git.properties` in `fineract-provider-{revnumber}.jar` in the binary release tarball. Its contents are displayed at the `/fineract-provider/actuator/info` endpoint. It may be possible to fix this heisenbug entirely by https://github.com/gradle/gradle/issues/34177#issuecomment-3051970053[modifying our git properties gradle plugin config] in `fineract-provider/build.gradle`, perhaps by changing where `git.properties` is written. Look in `fineract-war/build/distributions/` for the tarballs. diff --git a/fineract-document/dependencies.gradle b/fineract-document/dependencies.gradle index e1cc0e429e4..e7d897aa5d1 100644 --- a/fineract-document/dependencies.gradle +++ b/fineract-document/dependencies.gradle @@ -49,10 +49,12 @@ dependencies { 'org.apache.httpcomponents:httpcore', 'org.apache.tika:tika-core', - 'org.apache.tika:tika-parser-microsoft-module', 'org.apache.tika:tika-parser-miscoffice-module', 'org.apache.tika:tika-parser-image-module', ) + implementation('org.apache.tika:tika-parser-microsoft-module') { + exclude group: 'org.apache.poi', module: 'poi-ooxml-full' + } compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.mapstruct:mapstruct-processor' diff --git a/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/detector/FileContentDetector.java b/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/detector/FileContentDetector.java index 048bc1a321e..2ca2ad28b60 100644 --- a/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/detector/FileContentDetector.java +++ b/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/detector/FileContentDetector.java @@ -19,7 +19,6 @@ package org.apache.fineract.infrastructure.contentstore.detector; import java.nio.file.Files; -import java.nio.file.Paths; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; @@ -34,7 +33,7 @@ public final class FileContentDetector implements ContentDetector { @Override public ContentDetectorContext detect(ContentDetectorContext ctx) { try { - final var mimeType = Files.probeContentType(Paths.get(ctx.getFileName())); + final var mimeType = Files.probeContentType(java.nio.file.Path.of(ctx.getFileName())); final var format = FilenameUtils.getExtension(ctx.getFileName()); return ctx.clone(mimeType, "." + format, format); diff --git a/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/service/FileContentStoreService.java b/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/service/FileContentStoreService.java index 1f293764b95..34e8adc4fa9 100644 --- a/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/service/FileContentStoreService.java +++ b/fineract-document/src/main/java/org/apache/fineract/infrastructure/contentstore/service/FileContentStoreService.java @@ -21,7 +21,6 @@ import static java.util.Objects.requireNonNull; import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -30,7 +29,6 @@ import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.contentstore.data.ContentStoreType; import org.apache.fineract.infrastructure.contentstore.detector.ContentDetectorContext; @@ -95,8 +93,8 @@ public String upload(String path, InputStream is, String mimeType) { final var target = Files.exists(getPath(safePath, false)) ? getPath(safePath, false) : getPath(safePath, true); - try (var in = is) { - IOUtils.copy(in, new FileOutputStream(target.toString())); + try (var in = is; var out = Files.newOutputStream(target)) { + in.transferTo(out); } catch (Exception e) { throw new ContentStoreException(e); } diff --git a/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/detector/TikaContentDetectorTest.java b/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/detector/TikaContentDetectorTest.java index d283c6806b7..b29a2b1c8de 100644 --- a/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/detector/TikaContentDetectorTest.java +++ b/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/detector/TikaContentDetectorTest.java @@ -25,12 +25,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.github.romankh3.image.comparison.ImageComparison; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Files; import javax.imageio.ImageIO; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.fineract.infrastructure.TestConfiguration; import org.apache.fineract.infrastructure.contentstore.exception.ContentDetectorException; import org.junit.jupiter.api.Test; @@ -97,10 +95,12 @@ void reuseStream() throws IOException { assertEquals("image/png", ctx.getMimeType()); - IOUtils.copy(ctx.getInputStream(), new FileOutputStream("build/test.png")); + try (var out = Files.newOutputStream(java.nio.file.Path.of("build/test.png"))) { + ctx.getInputStream().transferTo(out); + } try (var expectedIs = TikaContentDetectorTest.class.getClassLoader().getResourceAsStream("test.png"); - var actualIs = new FileInputStream("build/test.png")) { + var actualIs = Files.newInputStream(java.nio.file.Path.of("build/test.png"))) { requireNonNull(expectedIs); var expectedImage = ImageIO.read(expectedIs); @@ -125,8 +125,8 @@ void illegalArguments() { } private void write(ContentDetectorContext ctx) { - try (var is = ctx.getInputStream()) { - IOUtils.copy(is, new FileOutputStream("build/detector" + ctx.getExtension())); + try (var is = ctx.getInputStream(); var out = Files.newOutputStream(java.nio.file.Path.of("build/detector" + ctx.getExtension()))) { + is.transferTo(out); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/processor/ContentProcessorTest.java b/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/processor/ContentProcessorTest.java index 353bfc0c1c3..048cad33a57 100644 --- a/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/processor/ContentProcessorTest.java +++ b/fineract-document/src/test/java/org/apache/fineract/infrastructure/contentstore/processor/ContentProcessorTest.java @@ -28,10 +28,9 @@ import static org.apache.fineract.infrastructure.contentstore.processor.SizeContentProcessor.SIZE_RESULT_VALUE; import java.io.ByteArrayInputStream; -import java.io.FileOutputStream; +import java.nio.file.Files; import java.util.Map; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.fineract.infrastructure.TestConfiguration; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -161,8 +160,8 @@ void base64() { } private void write(ContentProcessorContext ctx, String fileName) { - try (var is = ctx.getInputStream()) { - IOUtils.copy(is, new FileOutputStream("build/" + fileName)); + try (var is = ctx.getInputStream(); var out = Files.newOutputStream(java.nio.file.Path.of("build/" + fileName))) { + is.transferTo(out); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/fineract-e2e-tests-runner/src/test/resources/cucumber.properties b/fineract-e2e-tests-runner/src/test/resources/cucumber.properties index d3b2786eb65..708954f3b01 100644 --- a/fineract-e2e-tests-runner/src/test/resources/cucumber.properties +++ b/fineract-e2e-tests-runner/src/test/resources/cucumber.properties @@ -18,3 +18,4 @@ # cucumber.publish.quiet=true +cucumber.glue=org.apache.fineract.test diff --git a/fineract-e2e-tests-runner/src/test/resources/junit-platform.properties b/fineract-e2e-tests-runner/src/test/resources/junit-platform.properties index 24014121721..8dd3c833704 100644 --- a/fineract-e2e-tests-runner/src/test/resources/junit-platform.properties +++ b/fineract-e2e-tests-runner/src/test/resources/junit-platform.properties @@ -25,6 +25,7 @@ junit.jupiter.execution.parallel.config.fixed.parallelism=3 junit.jupiter.execution.parallel.enabled = false junit.jupiter.execution.parallel.config.strategy=fixed cucumber.plugin=pretty +cucumber.glue=org.apache.fineract.test cucumber.filter.tags=not @Skip cucumber.execution.exclusive-resources.isolated.read-write=org.junit.platform.engine.support.hierarchical.ExclusiveResource.GLOBAL_KEY cucumber.execution.execution-mode.feature=same_thread diff --git a/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java b/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java index 32020227548..6f420bdf3f0 100644 --- a/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java +++ b/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java @@ -377,7 +377,6 @@ static class TestContext { } """, attributeKey, attributeValue); - @SuppressFBWarnings("CT_CONSTRUCTOR_THROW") TestContext() { MockitoAnnotations.openMocks(this); stubFromApiJsonHelper(); diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index 5e6c28917d9..b15f753eb16 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -115,11 +115,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Version int version; - @Setter() + @Setter @Column(name = "account_no", length = 20, unique = true, nullable = false) private String accountNumber; - @Setter() + @Setter @Column(name = "external_id") private ExternalId externalId; @@ -131,7 +131,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @JoinColumn(name = "group_id") private Group group; - @Setter() + @Setter @ManyToOne @JoinColumn(name = "glim_id") private GroupLoanIndividualMonitoringAccount glim; @@ -176,11 +176,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Embedded private LoanProductRelatedDetail loanRepaymentScheduleDetail; - @Setter() + @Setter @Column(name = "term_frequency", nullable = false) private Integer termFrequency; - @Setter() + @Setter @Enumerated @Column(name = "term_period_frequency_enum", nullable = false) private PeriodFrequencyType termPeriodFrequencyType; @@ -190,60 +190,60 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Convert(converter = LoanStatusConverter.class) private LoanStatus loanStatus; - @Setter() + @Setter @Column(name = "sync_disbursement_with_meeting") private Boolean syncDisbursementWithMeeting; // loan application states - @Setter() + @Setter @Column(name = "submittedon_date") private LocalDate submittedOnDate; - @Setter() + @Setter @Column(name = "rejectedon_date") private LocalDate rejectedOnDate; - @Setter() + @Setter @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "rejectedon_userid") private AppUser rejectedBy; - @Setter() + @Setter @Column(name = "withdrawnon_date") private LocalDate withdrawnOnDate; - @Setter() + @Setter @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "withdrawnon_userid") private AppUser withdrawnBy; - @Setter() + @Setter @Column(name = "approvedon_date") private LocalDate approvedOnDate; - @Setter() + @Setter @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "approvedon_userid") private AppUser approvedBy; - @Setter() + @Setter @Column(name = "expected_disbursedon_date") private LocalDate expectedDisbursementDate; - @Setter() + @Setter @Column(name = "disbursedon_date") private LocalDate actualDisbursementDate; - @Setter() + @Setter @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "disbursedon_userid") private AppUser disbursedBy; - @Setter() + @Setter @Column(name = "closedon_date") private LocalDate closedOnDate; - @Setter() + @Setter @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "closedon_userid") private AppUser closedBy; @@ -264,15 +264,15 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "expected_maturedon_date") private LocalDate expectedMaturityDate; - @Setter() + @Setter @Column(name = "maturedon_date") private LocalDate actualMaturityDate; - @Setter() + @Setter @Column(name = "expected_firstrepaymenton_date") private LocalDate expectedFirstRepaymentOnDate; - @Setter() + @Setter @Column(name = "interest_calculated_from_date") private LocalDate interestChargedFromDate; @@ -280,7 +280,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "total_overpaid_derived", scale = 6, precision = 19) private BigDecimal totalOverpaid; - @Setter() + @Setter @Column(name = "overpaidon_date") private LocalDate overpaidOnDate; @@ -318,23 +318,23 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Embedded private LoanSummary summary; - @Setter() + @Setter @Column(name = "principal_amount_proposed", scale = 6, precision = 19, nullable = false) private BigDecimal proposedPrincipal; - @Setter() + @Setter @Column(name = "approved_principal", scale = 6, precision = 19, nullable = false) private BigDecimal approvedPrincipal; - @Setter() + @Setter @Column(name = "net_disbursal_amount", scale = 6, precision = 19, nullable = false) private BigDecimal netDisbursalAmount; - @Setter() + @Setter @Column(name = "fixed_emi_amount", scale = 6, precision = 19) private BigDecimal fixedEmiAmount; - @Setter() + @Setter @Column(name = "max_outstanding_loan_balance", scale = 6, precision = 19) private BigDecimal maxOutstandingLoanBalance; @@ -359,11 +359,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "is_npa", nullable = false) private boolean isNpa; - @Setter() + @Setter @Column(name = "accrued_till") private LocalDate accruedTill; - @Setter() + @Setter @Column(name = "create_standing_instruction_at_disbursement") private Boolean createStandingInstructionAtDisbursement; @@ -374,11 +374,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "interest_recalcualated_on") private LocalDate interestRecalculatedOn; - @Setter() + @Setter @Column(name = "is_floating_interest_rate") private Boolean isFloatingInterestRate; - @Setter() + @Setter @Column(name = "interest_rate_differential", scale = 6, precision = 19) private BigDecimal interestRateDifferential; @@ -403,11 +403,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @JoinTable(name = "m_loan_rate", joinColumns = @JoinColumn(name = "loan_id"), inverseJoinColumns = @JoinColumn(name = "rate_id")) private List rates; - @Setter() + @Setter @Column(name = "fixed_principal_percentage_per_installment", scale = 2, precision = 5) private BigDecimal fixedPrincipalPercentagePerInstallment; - @Setter() + @Setter @Column(name = "last_closed_business_date") private LocalDate lastClosedBusinessDate; diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java index 9b180b8f226..911e5fe7368 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java @@ -35,7 +35,7 @@ public class LoanCollateralManagement extends AbstractPersistableCustom { @Column(name = "quantity", nullable = false, scale = 5, precision = 20) private BigDecimal quantity; - @ManyToOne() + @ManyToOne @JoinColumn(name = "transaction_id") private LoanTransaction loanTransaction = null; diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle index 4307e747b80..278c215a88d 100644 --- a/fineract-provider/build.gradle +++ b/fineract-provider/build.gradle @@ -124,7 +124,16 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.mockito:mockito-core' testImplementation 'org.mockito:mockito-junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter-api' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.14.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.14.4' + testImplementation 'org.junit.platform:junit-platform-commons:1.14.4' + testImplementation 'org.junit.platform:junit-platform-engine:1.14.4' + testImplementation 'org.junit.platform:junit-platform-launcher:1.14.4' + testImplementation 'org.junit.platform:junit-platform-suite-api:1.14.4' + testImplementation 'org.junit.platform:junit-platform-suite-commons:1.14.4' + testImplementation 'org.junit.platform:junit-platform-suite-engine:1.14.4' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.14.4' + testRuntimeOnly 'org.junit.platform:junit-platform-suite:1.14.4' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.liquibase:liquibase-core' } @@ -242,6 +251,22 @@ tasks.register('setBlankPassword') { } } +tasks.named('sourcesJar') { + dependsOn(processResources, generateGitProperties, resolve) + mustRunAfter(processResources, generateGitProperties, resolve) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + from(sourceSets.main.java.srcDirs) { + include "**/*.java" + } +} + +tasks.named('licenseMain') { + dependsOn(processResources, generateGitProperties) + mustRunAfter(processResources, generateGitProperties) + source = sourceSets.main.java.srcDirs +} + bootRun { jvmArgs = [ "-Dspring.output.ansi.enabled=ALWAYS" @@ -263,7 +288,7 @@ bootJar { attributes('Main-Class': 'org.springframework.boot.loader.launch.PropertiesLauncher', 'Implementation-Title': 'Apache Fineract', 'Implementation-Version': project.version) } archiveClassifier = '' - dependsOn resolve + dependsOn resolve, generateGitProperties } jib { @@ -346,22 +371,28 @@ tasks.jibDockerBuild.dependsOn(bootJar, resolve, generateGitProperties) // Configuration for git properties gradle plugin // https://github.com/n0mer/gradle-git-properties gitProperties { - gitPropertiesResourceDir = file("$buildDir/resources/main") + gitPropertiesResourceDir = file("$buildDir/generated-resources/git") dateFormat = "yyyy-MM-dd'T'HH:mmZ" dateFormatTimeZone = "GMT" failOnNoGitDirectory = false } +sourceSets.main.output.dir("$buildDir/generated-resources/git", builtBy: generateGitProperties) + processResources.dependsOn generateGitProperties // NOTE: Gradle suggested these dependencies +jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} jar.dependsOn resolve test.dependsOn resolve checkstyleMain.dependsOn resolve checkstyleTest.dependsOn resolve rat.dependsOn prepareInputYaml spotbugsTest.dependsOn resolve -compileTestJava.dependsOn ':fineract-client:processResources', ':fineract-avro-schemas:processResources' +spotbugsMain.dependsOn resolve +compileTestJava.dependsOn ':fineract-client:processResources', ':fineract-avro-schemas:processResources', resolve resolveMainClassName.dependsOn resolve javadoc { diff --git a/fineract-provider/dependencies.gradle b/fineract-provider/dependencies.gradle index cd3ffc448a6..cdd4a33d51c 100644 --- a/fineract-provider/dependencies.gradle +++ b/fineract-provider/dependencies.gradle @@ -100,7 +100,6 @@ dependencies { 'org.apache.commons:commons-lang3', 'commons-io:commons-io', 'org.apache.poi:poi', - 'org.apache.poi:poi-ooxml', 'org.apache.tika:tika-core', 'org.apache.tika:tika-parser-microsoft-module', 'org.apache.tika:tika-parser-miscoffice-module', @@ -163,6 +162,9 @@ dependencies { exclude group: 'com.zaxxer', module: 'HikariCP-java7' } implementation('org.apache.commons:commons-csv'){} + implementation('org.apache.poi:poi-ooxml') { + exclude group: 'org.apache.poi', module: 'poi-ooxml-lite' + } implementation ('software.amazon.awssdk:s3') { } implementation ('software.amazon.awssdk:auth') { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java index fdcf1ff6b2a..d70f35ce6df 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java @@ -29,7 +29,6 @@ import java.util.Collection; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.fineract.infrastructure.bulkimport.data.BulkImportEvent; import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType; import org.apache.fineract.infrastructure.bulkimport.data.ImportData; @@ -75,7 +74,7 @@ public Long importWorkbook(String entity, InputStream inputStream, FormDataConte try { if (entity != null && inputStream != null && fileDetail != null && locale != null && dateFormat != null) { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - IOUtils.copy(inputStream, baos); + inputStream.transferTo(baos); final byte[] bytes = baos.toByteArray(); InputStream clonedInputStream = new ByteArrayInputStream(bytes); final BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(bytes)); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailCampaignApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailCampaignApiResource.java index 580cc3c65e4..fc3a81ca54f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailCampaignApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailCampaignApiResource.java @@ -176,7 +176,7 @@ public String preview(final String apiRequestBodyAsJson, @Context final UriInfo } - @GET() + @GET @Path("template") @Operation(summary = "Retrieve email campaign template", operationId = "retrieveAllTemplatesEmailCampaign") public String template(@Context final UriInfo uriInfo) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailTasklet.java index dfe405e0896..031e651ded4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailTasklet.java @@ -22,8 +22,9 @@ import jakarta.mail.internet.InternetAddress; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -208,19 +209,20 @@ private File generateAttachments(final EmailCampaign emailCampaign, final Schedu try { final ByteArrayOutputStream byteArrayOutputStream = readReportingService.generatePentahoReportAsOutputStream(reportName, emailAttachmentFileFormat.getValue(), reportParams, null, emailCampaign.getApprovedBy(), errorLog); - final String fileLocation = fineractProperties.getContent().getFilesystem().getRootFolder() + File.separator + ""; - final String fileNameWithoutExtension = fileLocation + File.separator + reportName; - if (!new File(fileLocation).isDirectory()) { - new File(fileLocation).mkdirs(); + final Path fileLocation = Path.of(fineractProperties.getContent().getFilesystem().getRootFolder()); + final Path fileNameWithoutExtension = fileLocation.resolve(reportName); + if (!Files.isDirectory(fileLocation)) { + Files.createDirectories(fileLocation); } if (byteArrayOutputStream.size() == 0) { errorLog.append("Pentaho report processing failed, empty output stream created"); } else if (errorLog.length() == 0 && (byteArrayOutputStream.size() > 0)) { - final String fileName = fileNameWithoutExtension + "." + emailAttachmentFileFormat.getValue(); + final Path fileName = fileNameWithoutExtension.resolveSibling(reportName + "." + emailAttachmentFileFormat.getValue()); - final File file = new File(fileName); - final FileOutputStream outputStream = new FileOutputStream(file); - byteArrayOutputStream.writeTo(outputStream); + final File file = fileName.toFile(); + try (var outputStream = Files.newOutputStream(fileName)) { + byteArrayOutputStream.writeTo(outputStream); + } return file; } } catch (IOException | PlatformDataIntegrityException e) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsTasklet.java index 015652188fe..cfc054fd210 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsTasklet.java @@ -22,8 +22,9 @@ import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -133,17 +134,18 @@ private void generateReportOutputStream(final ReportMailingJob reportMailingJob, if (responseObject != null && responseObject.getClass().equals(ByteArrayOutputStream.class)) { final ByteArrayOutputStream byteArrayOutputStream = (ByteArrayOutputStream) responseObject; - final String fileLocation = fineractProperties.getContent().getFilesystem().getRootFolder() + File.separator + ""; - final String fileNameWithoutExtension = fileLocation + File.separator + reportName; + final Path fileLocation = Path.of(fineractProperties.getContent().getFilesystem().getRootFolder()); + final Path fileNameWithoutExtension = fileLocation.resolve(reportName); - if (!new File(fileLocation).isDirectory()) { - new File(fileLocation).mkdirs(); + if (!Files.isDirectory(fileLocation)) { + Files.createDirectories(fileLocation); } if (byteArrayOutputStream.size() == 0) { errorLog.append("Report processing failed, empty output stream created"); } else if ((errorLog != null && errorLog.length() == 0) && (byteArrayOutputStream.size() > 0)) { - final String fileName = fileNameWithoutExtension + "." + emailAttachmentFileFormat.getValue(); + final Path fileName = fileNameWithoutExtension + .resolveSibling(reportName + "." + emailAttachmentFileFormat.getValue()); sendReportFileToEmailRecipients(reportMailingJob, fileName, byteArrayOutputStream, errorLog); } @@ -192,14 +194,19 @@ private void updateReportMailingJobAfterJobExecution(final ReportMailingJob repo reportMailingJobPreviousRunStatus.getValue()); } - private void sendReportFileToEmailRecipients(final ReportMailingJob reportMailingJob, final String fileName, + private void sendReportFileToEmailRecipients(final ReportMailingJob reportMailingJob, final Path fileName, final ByteArrayOutputStream byteArrayOutputStream, final StringBuilder errorLog) { final Set emailRecipients = this.reportMailingJobValidator.validateEmailRecipients(reportMailingJob.getEmailRecipients()); try { - final File file = new File(fileName); - final FileOutputStream outputStream = new FileOutputStream(file); - byteArrayOutputStream.writeTo(outputStream); + final Path parent = fileName.getParent(); + if (parent != null) { + Files.createDirectories(parent); + } + final File file = fileName.toFile(); + try (var outputStream = Files.newOutputStream(fileName)) { + byteArrayOutputStream.writeTo(outputStream); + } for (String emailRecipient : emailRecipients) { final ReportMailingJobEmailData reportMailingJobEmailData = new ReportMailingJobEmailData().setTo(emailRecipient) @@ -207,9 +214,6 @@ private void sendReportFileToEmailRecipients(final ReportMailingJob reportMailin reportMailingJobEmailService.sendEmailWithAttachment(reportMailingJobEmailData); } - - outputStream.close(); - } catch (IOException e) { errorLog.append("The ReportMailingJobWritePlatformServiceImpl.sendReportFileToEmailRecipients method threw an IOException " + "exception: ").append(e).append(" ---------- "); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java index 141ff4ed00b..8503c2824dc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java @@ -51,7 +51,7 @@ public CustomAuditingHandler(PersistentEntities entities) { * @param mappingContext * must not be {@literal null}. * @since 1.8 - * @deprecated use {@link AuditingHandler(PersistentEntities)} instead. + * @deprecated use AuditingHandler with PersistentEntities instead. */ public CustomAuditingHandler(MappingContext, ? extends PersistentProperty> mappingContext, AuditorAware auditorAware) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/ContentS3Config.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/ContentS3Config.java index f9640afb090..29eb413abbc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/ContentS3Config.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/ContentS3Config.java @@ -29,6 +29,7 @@ import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.checksums.RequestChecksumCalculation; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3ClientBuilder; @@ -40,7 +41,8 @@ public class ContentS3Config { @Bean @ConditionalOnProperty("fineract.content.s3.enabled") public S3Client contentS3Client(FineractProperties fineractProperties) { - S3ClientBuilder builder = S3Client.builder().credentialsProvider(getCredentialProvider(fineractProperties.getContent().getS3())); + S3ClientBuilder builder = S3Client.builder().credentialsProvider(getCredentialProvider(fineractProperties.getContent().getS3())) + .requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED); if (!Strings.isNullOrEmpty(fineractProperties.getContent().getS3().getRegion())) { builder.region(Region.of(fineractProperties.getContent().getS3().getRegion())); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/http/BodyCachingHttpServletRequestWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/http/BodyCachingHttpServletRequestWrapper.java index 23a9ad9b03a..17996b7c60d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/http/BodyCachingHttpServletRequestWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/http/BodyCachingHttpServletRequestWrapper.java @@ -20,7 +20,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jakarta.servlet.ReadListener; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; @@ -30,17 +29,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import org.apache.commons.io.IOUtils; -public class BodyCachingHttpServletRequestWrapper extends HttpServletRequestWrapper { +public final class BodyCachingHttpServletRequestWrapper extends HttpServletRequestWrapper { private final byte[] cachedBody; private ByteArrayInputStream inputStream; - @SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW") public BodyCachingHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); - this.cachedBody = IOUtils.toByteArray(request.getInputStream()); + this.cachedBody = request.getInputStream().readAllBytes(); this.inputStream = new ByteArrayInputStream(cachedBody); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/converter/JsonConverter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/converter/JsonConverter.java index daad86f0093..6aac0d6adcd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/converter/JsonConverter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/converter/JsonConverter.java @@ -21,8 +21,9 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import java.io.IOException; +import java.io.Serializable; -public interface JsonConverter { +public interface JsonConverter extends Serializable { T convertToObject(JsonParser parser) throws IOException; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonLocalDateBeanSerializerModifier.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonLocalDateBeanSerializerModifier.java index d530769a206..5d37a5efaab 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonLocalDateBeanSerializerModifier.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonLocalDateBeanSerializerModifier.java @@ -23,14 +23,12 @@ import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.time.LocalDate; import java.util.List; import org.apache.fineract.infrastructure.core.jersey.converter.LocalDateJsonConverter; import org.apache.fineract.infrastructure.core.jersey.serializer.legacy.JacksonLocalDateArraySerializer; import org.apache.fineract.infrastructure.core.jersey.serializer.legacy.JsonLocalDateArrayFormat; -@SuppressFBWarnings({ "SE_BAD_FIELD", "SE_BAD_FIELD_STORE" }) public class JacksonLocalDateBeanSerializerModifier extends BeanSerializerModifier { private final JsonSerializer localDateSerializer = new JacksonSerializerAdapter<>(new LocalDateJsonConverter()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonSerializerAdapter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonSerializerAdapter.java index 951a0872eb2..6363c9ab811 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonSerializerAdapter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/JacksonSerializerAdapter.java @@ -22,11 +22,12 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; +import java.io.Serializable; import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.core.jersey.converter.JsonConverter; @RequiredArgsConstructor -public class JacksonSerializerAdapter extends JsonSerializer { +public class JacksonSerializerAdapter extends JsonSerializer implements Serializable { private final JsonConverter converter; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/legacy/JacksonLocalDateArraySerializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/legacy/JacksonLocalDateArraySerializer.java index 1b7b812532a..7c2e7455963 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/legacy/JacksonLocalDateArraySerializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/serializer/legacy/JacksonLocalDateArraySerializer.java @@ -22,9 +22,10 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; +import java.io.Serializable; import java.time.LocalDate; -public class JacksonLocalDateArraySerializer extends JsonSerializer { +public class JacksonLocalDateArraySerializer extends JsonSerializer implements Serializable { @Override public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java index 27d340c0a9d..62579478a96 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java @@ -20,14 +20,13 @@ import jakarta.ws.rs.core.StreamingOutput; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -226,12 +225,16 @@ public String getReportType(final String reportName, final boolean isParameterTy @Override public String retrieveReportPDF(final String reportName, final String type, final Map queryParams) { - final String fileLocation = fineractProperties.getContent().getFilesystem().getRootFolder() + File.separator + ""; - if (!new File(fileLocation).isDirectory()) { - new File(fileLocation).mkdirs(); + final Path fileLocation = Path.of(fineractProperties.getContent().getFilesystem().getRootFolder()); + if (!Files.isDirectory(fileLocation)) { + try { + Files.createDirectories(fileLocation); + } catch (IOException e) { + throw new UncheckedIOException(e); + } } - final String genaratePdf = fileLocation + File.separator + reportName + ".pdf"; + final Path generatePdf = fileLocation.resolve(reportName + ".pdf"); try { final GenericResultsetData result = retrieveGenericResultset(reportName, type, queryParams); @@ -249,11 +252,11 @@ public String retrieveReportPDF(final String reportName, final String type, fina if (!reportName.matches("^[a-zA-Z0-9_.-]+$")) { throw new IllegalArgumentException("Invalid report name format"); } - Path validatedPath = Paths.get(fileLocation, reportName + ".pdf").normalize(); - if (!validatedPath.startsWith(Paths.get(fileLocation))) { + Path validatedPath = Path.of(fileLocation.toString(), reportName + ".pdf").normalize(); + if (!validatedPath.startsWith(fileLocation)) { throw new IllegalArgumentException("Path traversal attempt detected"); } - PdfWriter.getInstance(document, new FileOutputStream(validatedPath.toString())); + PdfWriter.getInstance(document, Files.newOutputStream(validatedPath)); document.open(); final PdfPTable table = new PdfPTable(chSize); @@ -283,7 +286,7 @@ public String retrieveReportPDF(final String reportName, final String type, fina table.completeRow(); document.add(table); document.close(); - return genaratePdf; + return generatePdf.toString(); } catch (final Exception e) { log.error("error.msg.reporting.error:", e); throw ErrorHandler.getMappable(e); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/PdfDatatableReportExportService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/PdfDatatableReportExportService.java index 5bd75f052ca..c91aad7bcfc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/PdfDatatableReportExportService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/PdfDatatableReportExportService.java @@ -21,6 +21,7 @@ import jakarta.ws.rs.core.MultivaluedMap; import jakarta.ws.rs.core.Response; import java.io.File; +import java.nio.file.Path; import java.util.Map; import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.dataqueries.service.DatatableExportTargetParameter; @@ -38,7 +39,7 @@ public ResponseHolder export(String reportName, MultivaluedMap q String parameterTypeValue) { final String pdfFileName = this.readExtraDataAndReportingService.retrieveReportPDF(reportName, parameterTypeValue, reportParams); - final File file = new File(pdfFileName); + final File file = Path.of(pdfFileName).toFile(); return new ResponseHolder(Response.Status.OK).contentType("application/pdf") .addHeader("Content-Disposition", "attachment; filename=\"" + pdfFileName + "\"").entity(file); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/helper/IPv4Helper.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/helper/IPv4Helper.java index dda23c330a5..cbbc975c39d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/helper/IPv4Helper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/helper/IPv4Helper.java @@ -28,7 +28,7 @@ /** * This utility provides methods to either convert an IPv4 address to its long format or a 32bit dotted format. * - * @see http://hawkee.com/snippet/9731/ + * @see hawkee snippet */ public final class IPv4Helper { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/s3/AmazonS3Config.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/s3/AmazonS3Config.java index 1458c93915e..daaf5343eda 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/s3/AmazonS3Config.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/s3/AmazonS3Config.java @@ -28,6 +28,7 @@ import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; +import software.amazon.awssdk.core.checksums.RequestChecksumCalculation; import software.amazon.awssdk.regions.providers.AwsRegionProvider; import software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain; import software.amazon.awssdk.services.s3.S3Client; @@ -50,7 +51,8 @@ public AwsRegionProvider awsRegionProvider() { @Bean("s3Client") public S3Client s3Client(DefaultCredentialsProvider awsCredentialsProvider, AwsRegionProvider awsRegionProvider, List customizers) { - S3ClientBuilder builder = S3Client.builder().credentialsProvider(awsCredentialsProvider).region(awsRegionProvider.getRegion()); + S3ClientBuilder builder = S3Client.builder().credentialsProvider(awsCredentialsProvider).region(awsRegionProvider.getRegion()) + .requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED); customizers.forEach(customizer -> customizer.customize(builder)); return builder.build(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java index 64aee4ff74e..780893ed56b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java @@ -1367,7 +1367,7 @@ private PostLoansRequest() {} public String expectedDisbursementDate; @Schema(example = "mifos-standard-strategy") public String transactionProcessingStrategyCode; - @Schema(example = "360", allowableValues = "1, 360, 364, 36") + @Schema(examples = "1, 360, 364, 365") public Integer daysInYearType; @Schema(example = "FULL_LEAP_YEAR", allowableValues = "FULL_LEAP_YEAR, FEB_29_PERIOD_ONLY") public String daysInYearCustomStrategy; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java index 2f7d851814e..a6f807f83f8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java @@ -262,7 +262,7 @@ private static final class ShareAccountMapper implements RowMapper left join m_appuser sbu on sbu.id = sa.submitted_userid left join m_appuser rbu on rbu.id = sa.rejected_userid left join m_appuser abu on abu.id = sa.approved_userid - left join m_appuser avbu on rbu.id = sa.activated_userid + left join m_appuser avbu on avbu.id = sa.activated_userid left join m_appuser cbu on cbu.id = sa.closed_userid left join m_savings_account msa on sa.savings_account_id = msa.id\s"""; diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java index aae91816f9d..aa32f22e872 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.verify; import com.google.common.base.Splitter; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import java.util.Collections; import java.util.List; @@ -48,7 +47,6 @@ import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.ApplicationContext; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class COBBusinessStepServiceStepDefinitions implements En { private ApplicationContext applicationContext = mock(ApplicationContext.class); @@ -72,7 +70,6 @@ public class COBBusinessStepServiceStepDefinitions implements En { private BatchBusinessStep batchBusinessStep = mock(BatchBusinessStep.class); private Set resultSet; - @SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW") public COBBusinessStepServiceStepDefinitions() throws Exception { businessStepService = new COBBusinessStepServiceImpl(batchBusinessStepRepository, applicationContext, beanFactory, businessEventNotifierService, configurationDomainService, reloaderService); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/common/InitialisationTaskletStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/common/InitialisationTaskletStepDefinitions.java index 17df55f2328..80f831f4129 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/common/InitialisationTaskletStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/common/InitialisationTaskletStepDefinitions.java @@ -23,7 +23,6 @@ import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import java.time.LocalDate; import java.time.ZoneId; @@ -42,7 +41,6 @@ import org.springframework.batch.repeat.RepeatStatus; import org.springframework.security.core.context.SecurityContextHolder; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class InitialisationTaskletStepDefinitions implements En { private static final LocalDate TODAY = LocalDate.now(ZoneId.systemDefault()); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java index 040339fd4f9..d57ae80d483 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import java.time.LocalDate; import java.time.ZoneId; @@ -52,7 +51,6 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class ApplyLoanLockTaskletStepDefinitions implements En { ArgumentCaptor valueCaptor = ArgumentCaptor.forClass(List.class); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java index 8625b498a2a..9b2709b3fe9 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import java.time.LocalDate; import java.time.ZoneId; @@ -38,7 +37,6 @@ import org.springframework.batch.core.StepExecution; import org.springframework.batch.item.ExecutionContext; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class LoanItemProcessorStepDefinitions implements En { private COBBusinessStepService cobBusinessStepService = mock(COBBusinessStepService.class); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java index b332495448b..b40258c206d 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.mock; import com.google.common.base.Splitter; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import java.time.LocalDate; import java.time.ZoneId; @@ -51,7 +50,6 @@ import org.springframework.batch.core.StepExecution; import org.springframework.batch.item.ExecutionContext; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class LoanItemReaderStepDefinitions implements En { private LoanRepository loanRepository = mock(LoanRepository.class); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/service/COBBulkEventConfigurationTest.java b/fineract-provider/src/test/java/org/apache/fineract/cob/service/COBBulkEventConfigurationTest.java index 19a47b1f932..c4548a068d5 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/service/COBBulkEventConfigurationTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/service/COBBulkEventConfigurationTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.time.LocalDate; import java.time.ZoneId; import java.util.HashMap; @@ -55,7 +54,7 @@ import org.springframework.context.ApplicationContext; @ExtendWith(MockitoExtension.class) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class COBBulkEventConfigurationTest { @Mock diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImplTest.java index 04721588135..84d5c8ab1f1 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImplTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.time.LocalDate; @@ -53,7 +52,7 @@ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + class InlineLoanCOBExecutorServiceImplTest { @InjectMocks diff --git a/fineract-provider/src/test/java/org/apache/fineract/commands/provider/CommandHandlerExceptionStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/commands/provider/CommandHandlerExceptionStepDefinitions.java index 17400444253..c5d84d1686b 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/commands/provider/CommandHandlerExceptionStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/commands/provider/CommandHandlerExceptionStepDefinitions.java @@ -20,12 +20,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import org.apache.fineract.commands.exception.UnsupportedCommandException; import org.springframework.beans.factory.annotation.Autowired; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class CommandHandlerExceptionStepDefinitions implements En { @Autowired diff --git a/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java b/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java index 31c90c9e9a3..50c28b1e168 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java @@ -21,7 +21,6 @@ import static org.apache.fineract.commands.domain.CommandProcessingResultType.UNDER_PROCESSING; import static org.mockito.ArgumentMatchers.any; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.time.ZoneId; import java.util.Optional; import org.apache.fineract.batch.exception.ErrorInfo; @@ -46,7 +45,6 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class CommandSourceServiceTest { @Mock diff --git a/fineract-provider/src/test/java/org/apache/fineract/commands/service/SynchronousCommandProcessingServiceTest.java b/fineract-provider/src/test/java/org/apache/fineract/commands/service/SynchronousCommandProcessingServiceTest.java index fa67f353840..9584d331ca6 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/commands/service/SynchronousCommandProcessingServiceTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/commands/service/SynchronousCommandProcessingServiceTest.java @@ -34,7 +34,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.github.resilience4j.retry.Retry; import io.github.resilience4j.retry.RetryConfig; import io.github.resilience4j.retry.RetryRegistry; @@ -74,7 +73,6 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class SynchronousCommandProcessingServiceTest { @Mock diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java index 50409f1b55a..e24bb8ff34c 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.time.LocalDate; import java.util.Optional; import org.apache.fineract.infrastructure.businessdate.data.service.BusinessDateDTO; @@ -55,7 +54,7 @@ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class BusinessDateWritePlatformServiceTest { @InjectMocks diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/classpath/ClasspathDuplicatesStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/classpath/ClasspathDuplicatesStepDefinitions.java index 49b235d7c57..7790248b2d6 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/classpath/ClasspathDuplicatesStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/classpath/ClasspathDuplicatesStepDefinitions.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.infrastructure.classpath; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import io.github.classgraph.ClassGraph; import io.github.classgraph.ResourceList; @@ -39,7 +38,6 @@ public class ClasspathDuplicatesStepDefinitions implements En { private ClassGraph classGraph; - @SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW") public ClasspathDuplicatesStepDefinitions() { // tag::given[] Given("A class graph", () -> { @@ -115,8 +113,10 @@ private boolean isHarmlessDuplicate(String resourcePath) { || resourcePath.startsWith("META-INF/services") // || resourcePath.equals("META-INF/DEPENDENCIES") // || resourcePath.equals("META-INF/git.properties") // + || resourcePath.equals("git.properties") // || resourcePath.equals("META-INF/io.netty.versions.properties") // || resourcePath.equals("META-INF/jersey-module-version") // + || resourcePath.equals("messages.properties") // || resourcePath.startsWith("OSGI-INF/blueprint/") // // in Akka's JARs || resourcePath.startsWith("org/opendaylight/blueprint/") // @@ -134,6 +134,8 @@ private boolean isHarmlessDuplicate(String resourcePath) { || resourcePath.equals("META-INF/BC1024KE.DSA") // || resourcePath.equals("META-INF/BC2048KE.SF") // || resourcePath.equals("META-INF/BC1024KE.SF") // + || resourcePath.equals("META-INF/BCRSA204.SF") // + || resourcePath.equals("META-INF/BCRSA204.RSA") // || resourcePath.equals("OSGI-INF/bundle.info") // || resourcePath.equals("META-INF/DUMMY.SF") // || resourcePath.equals("META-INF/DUMMY.DSA") // diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/MultiExceptionStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/MultiExceptionStepDefinitions.java index ef7fd8735c6..27a016cc8f1 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/MultiExceptionStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/MultiExceptionStepDefinitions.java @@ -20,19 +20,16 @@ import static org.junit.jupiter.api.Assertions.assertThrows; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.cucumber.java8.En; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.exception.MultiException; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class MultiExceptionStepDefinitions implements En { private List exceptions = new ArrayList<>(); - @SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW") public MultiExceptionStepDefinitions() { Given("/^A multi exception with exceptions (.*) and (.*)$/", (String exception1, String exception2) -> { if (!StringUtils.isBlank(exception1)) { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImplTest.java index fa41082b727..4f9341330c7 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImplTest.java @@ -32,7 +32,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.JsonParser; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -73,7 +72,6 @@ import org.mockito.Spy; import org.springframework.lang.NonNull; -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") public class ExternalCreditBureauIntegrationWritePlatformServiceImplTest { @Spy diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImplTest.java index 29154483305..9f01e688bac 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImplTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.when; import com.google.gson.JsonObject; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.List; import java.util.stream.Stream; import org.apache.fineract.TestConfiguration; @@ -53,7 +52,7 @@ @SpringBootTest @ContextConfiguration(classes = TestConfiguration.class) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class DatatableReadServiceImplTest { @Autowired diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/producer/kafka/KafkaExternalEventProducerTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/producer/kafka/KafkaExternalEventProducerTest.java index ce4393a5913..f951d3326fc 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/producer/kafka/KafkaExternalEventProducerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/producer/kafka/KafkaExternalEventProducerTest.java @@ -20,7 +20,6 @@ import static org.mockito.Mockito.times; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.nio.charset.Charset; import java.util.List; import java.util.Map; @@ -37,7 +36,7 @@ import org.springframework.lang.NonNull; @ExtendWith(MockitoExtension.class) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + class KafkaExternalEventProducerTest { public static final String TOPIC_NAME = "unit-test"; diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java index fe8a613dbb9..50a4843e220 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java @@ -23,7 +23,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jakarta.persistence.EntityManager; import org.apache.fineract.infrastructure.event.external.exception.ExternalEventConfigurationNotFoundException; import org.apache.fineract.infrastructure.event.external.repository.CustomExternalEventConfigurationRepositoryImpl; @@ -36,7 +35,7 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class CustomExternalEventConfigurationRepositoryImplTest { @Mock diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/ReplayedTransactionBusinessEventServiceIntegrationTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/ReplayedTransactionBusinessEventServiceIntegrationTest.java index de3f6f55656..b468c677841 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/ReplayedTransactionBusinessEventServiceIntegrationTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/ReplayedTransactionBusinessEventServiceIntegrationTest.java @@ -23,7 +23,6 @@ import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.verify; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Optional; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; @@ -39,7 +38,7 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + class ReplayedTransactionBusinessEventServiceIntegrationTest { @Mock diff --git a/gradle.properties b/gradle.properties index 70829cbd9bb..415a0829cd0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ # specific language governing permissions and limitations # under the License. # -org.gradle.jvmargs=-Xmx8g --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=null +org.gradle.jvmargs=-Xmx12g --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=null buildType=BUILD org.gradle.caching=true org.gradle.parallel=true diff --git a/integration-tests/build.gradle b/integration-tests/build.gradle index 2dd6df4470d..d624acebdc8 100644 --- a/integration-tests/build.gradle +++ b/integration-tests/build.gradle @@ -36,7 +36,9 @@ configurations { dependencies { driver 'com.mysql:mysql-connector-j' testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.junit.jupiter:junit-jupiter-api' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.14.4' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.14.4' + testRuntimeOnly 'org.junit.platform:junit-platform-suite:1.14.4' } cargo { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java index c8208b4cb17..09c367edb09 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java @@ -28,7 +28,6 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.ResponseSpecBuilder; import io.restassured.http.ContentType; @@ -125,7 +124,7 @@ * repayments and verifying accounting transactions */ @SuppressWarnings({ "rawtypes", "unchecked" }) -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class ClientLoanIntegrationTest extends BaseLoanIntegrationTest { static { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java index adaa9347847..e15de61e1ad 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java @@ -100,7 +100,7 @@ public static void beforeAll() { "EXTERNAL_ASSET_OWNER_TRANSFER"); } - @Test() + @Test public void testExternalBusinessEventLoanBalanceChangedBusinessEventOnMultiDisbursedInterestBearingLoanForRepaymentAndOverpaymentAndReverseRepaymentAndFullRepayment() { AtomicReference loanIdRef = new AtomicReference<>(); runAt("1 March 2023", () -> { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java index fdc59f5b8d4..14a5a3a1946 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java @@ -19,7 +19,6 @@ package org.apache.fineract.integrationtests; import com.google.gson.Gson; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.ResponseSpecBuilder; import io.restassured.http.ContentType; @@ -36,7 +35,7 @@ import org.junit.jupiter.api.Test; @Deprecated // TODO move this into new org.apache.fineract.integrationtests.client.StaffTest -@SuppressFBWarnings(value = "RV_EXCEPTION_NOT_THROWN", justification = "False positive") + public class StaffTest { private RequestSpecification requestSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/LocalContentStorageUtil.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/LocalContentStorageUtil.java index 7ddcd49573a..1feafff2af9 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/LocalContentStorageUtil.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/LocalContentStorageUtil.java @@ -20,7 +20,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -55,7 +54,8 @@ public static String path(String path) { } // local docker volumes - final var dockerPath = Path.of("").toAbsolutePath().getParent().resolve("build/fineract/tmp/DefaultDemoTenant").resolve(path); + final var dockerPath = Path.of("").toAbsolutePath().getParent().resolve("build").resolve("fineract").resolve("tmp") + .resolve("DefaultDemoTenant").resolve(path); if (Files.exists(dockerPath)) { return dockerPath.toString(); @@ -66,7 +66,7 @@ public static String path(String path) { @SuppressWarnings("UnusedMethod") public static void waitFor(String path) throws InterruptedException { - Path file = Paths.get(path); + Path file = Path.of(path); long maxWaitMillis = 10000; long start = System.currentTimeMillis(); boolean exists = false; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java index 9f2033bccfd..adb816eb200 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java @@ -26,10 +26,11 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -127,15 +128,15 @@ public void testClientImport() throws InterruptedException, IOException, ParseEx firstClientRow.createCell(ClientEntityConstants.SUBMITTED_ON_COL).setCellValue(submittedDate); firstClientRow.createCell(ClientEntityConstants.ADDRESS_ENABLED).setCellValue("False"); - File directory = new File(System.getProperty("user.home") + File.separator + "Fineract" + File.separator + "bulkimport" - + File.separator + "integration_tests" + File.separator + "importhandler" + File.separator + "client"); - if (!directory.exists()) { - directory.mkdirs(); + Path directory = Path.of(System.getProperty("user.home")).resolve("Fineract").resolve("bulkimport").resolve("integration_tests") + .resolve("importhandler").resolve("client"); + if (!directory.toFile().exists()) { + directory.toFile().mkdirs(); + } + File file = directory.resolve("ClientEntity.xls").toFile(); + try (OutputStream outputStream = Files.newOutputStream(file.toPath())) { + workbook.write(outputStream); } - File file = new File(directory + File.separator + "ClientEntity.xls"); - OutputStream outputStream = new FileOutputStream(file); - workbook.write(outputStream); - outputStream.close(); String importDocumentId = clientHelper.importClientEntityTemplate(file); file.delete(); @@ -146,15 +147,16 @@ public void testClientImport() throws InterruptedException, IOException, ParseEx // check status column of output excel String location = LocalContentStorageUtil.path(clientHelper.getOutputTemplateLocation(importDocumentId)); - FileInputStream fileInputStream = new FileInputStream(location); - Workbook outputWorkbook = new HSSFWorkbook(fileInputStream); - Sheet outputClientEntitySheet = outputWorkbook.getSheet(TemplatePopulateImportConstants.CLIENT_ENTITY_SHEET_NAME); - Row row = outputClientEntitySheet.getRow(1); + try (InputStream fileInputStream = Files.newInputStream(Path.of(location))) { + Workbook outputWorkbook = new HSSFWorkbook(fileInputStream); + Sheet outputClientEntitySheet = outputWorkbook.getSheet(TemplatePopulateImportConstants.CLIENT_ENTITY_SHEET_NAME); + Row row = outputClientEntitySheet.getRow(1); - LOG.info("Output location: {}", location); - LOG.info("Failure reason column: {}", row.getCell(ClientEntityConstants.STATUS_COL).getStringCellValue()); + LOG.info("Output location: {}", location); + LOG.info("Failure reason column: {}", row.getCell(ClientEntityConstants.STATUS_COL).getStringCellValue()); - Assertions.assertEquals("Imported", row.getCell(ClientEntityConstants.STATUS_COL).getStringCellValue()); - outputWorkbook.close(); + Assertions.assertEquals("Imported", row.getCell(ClientEntityConstants.STATUS_COL).getStringCellValue()); + outputWorkbook.close(); + } } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java index b149b09a8c8..2038232d916 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/loan/LoanImportHandlerTest.java @@ -28,10 +28,11 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.ParseException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -227,16 +228,15 @@ public void testLoanImport() throws InterruptedException, IOException, ParseExce firstLoanRow.createCell(LoanConstants.CHARGE_AMOUNT_1).setCellValue(disbursementChargeJSON.getFloat("amount")); firstLoanRow.createCell(LoanConstants.CHARGE_AMOUNT_TYPE_1).setCellValue(disbursementChargeJSON.getString("chargeCalculationType")); - String currentdirectory = new File("").getAbsolutePath(); - File directory = new File(currentdirectory + File.separator + "src" + File.separator + "integrationTest" + File.separator - + "resources" + File.separator + "bulkimport" + File.separator + "importhandler" + File.separator + "loan"); - if (!directory.exists()) { - directory.mkdirs(); + Path directory = Path.of("").toAbsolutePath().resolve("src").resolve("integrationTest").resolve("resources").resolve("bulkimport") + .resolve("importhandler").resolve("loan"); + if (!directory.toFile().exists()) { + directory.toFile().mkdirs(); + } + File file = directory.resolve("Loan.xls").toFile(); + try (OutputStream outputStream = Files.newOutputStream(file.toPath())) { + workbook.write(outputStream); } - File file = new File(directory + File.separator + "Loan.xls"); - OutputStream outputStream = new FileOutputStream(file); - workbook.write(outputStream); - outputStream.close(); String importDocumentId = loanTransactionHelper.importLoanTemplate(file); file.delete(); @@ -247,15 +247,16 @@ public void testLoanImport() throws InterruptedException, IOException, ParseExce // check status column of output excel String location = LocalContentStorageUtil.path(loanTransactionHelper.getOutputTemplateLocation(importDocumentId)); - FileInputStream fileInputStream = new FileInputStream(location); - Workbook outputworkbook = new HSSFWorkbook(fileInputStream); - Sheet outputLoanSheet = outputworkbook.getSheet(TemplatePopulateImportConstants.LOANS_SHEET_NAME); - Row row = outputLoanSheet.getRow(1); + try (InputStream fileInputStream = Files.newInputStream(Path.of(location))) { + Workbook outputworkbook = new HSSFWorkbook(fileInputStream); + Sheet outputLoanSheet = outputworkbook.getSheet(TemplatePopulateImportConstants.LOANS_SHEET_NAME); + Row row = outputLoanSheet.getRow(1); - LOG.info("Output location: {}", location); - LOG.info("Failure reason column: {}", row.getCell(LoanConstants.FAILURE_REPORT_COL).getStringCellValue()); + LOG.info("Output location: {}", location); + LOG.info("Failure reason column: {}", row.getCell(LoanConstants.FAILURE_REPORT_COL).getStringCellValue()); - Assertions.assertEquals("Imported", row.getCell(LoanConstants.STATUS_COL).getStringCellValue()); - outputworkbook.close(); + Assertions.assertEquals("Imported", row.getCell(LoanConstants.STATUS_COL).getStringCellValue()); + outputworkbook.close(); + } } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java index 0dc930ab8f9..3846f1afef0 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/office/OfficeImportHandlerTest.java @@ -26,11 +26,11 @@ import jakarta.ws.rs.core.MediaType; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -80,16 +80,15 @@ public void testOfficeImport() throws IOException, InterruptedException, NoSuchF Date date = simpleDateFormat.parse("14 May 2001"); firstOfficeRow.createCell(OfficeConstants.OPENED_ON_COL).setCellValue(date); - String currentdirectory = new File("").getAbsolutePath(); - File directory = new File(currentdirectory + File.separator + "src" + File.separator + "integrationTest" + File.separator - + "resources" + File.separator + "bulkimport" + File.separator + "importhandler" + File.separator + "office"); - if (!directory.exists()) { - directory.mkdirs(); + Path directory = Path.of("").toAbsolutePath().resolve("src").resolve("integrationTest").resolve("resources").resolve("bulkimport") + .resolve("importhandler").resolve("office"); + if (!directory.toFile().exists()) { + directory.toFile().mkdirs(); + } + File file = directory.resolve("Office.xls").toFile(); + try (OutputStream outputStream = Files.newOutputStream(file.toPath())) { + workbook.write(outputStream); } - File file = new File(directory + File.separator + "Office.xls"); - OutputStream outputStream = new FileOutputStream(file); - workbook.write(outputStream); - outputStream.close(); String importDocumentId = importOfficeTemplate(file); file.delete(); @@ -100,16 +99,17 @@ public void testOfficeImport() throws IOException, InterruptedException, NoSuchF // check status column of output excel String location = LocalContentStorageUtil.path(getOutputTemplateLocation(importDocumentId)); - FileInputStream fileInputStream = new FileInputStream(location); - Workbook outputWorkbook = new HSSFWorkbook(fileInputStream); - Sheet officeSheet = outputWorkbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME); - Row row = officeSheet.getRow(1); + try (InputStream fileInputStream = Files.newInputStream(Path.of(location))) { + Workbook outputWorkbook = new HSSFWorkbook(fileInputStream); + Sheet officeSheet = outputWorkbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME); + Row row = officeSheet.getRow(1); - log.info("Output location: {}", location); - log.info("Failure reason column: {}", row.getCell(OfficeConstants.STATUS_COL).getStringCellValue()); + log.info("Output location: {}", location); + log.info("Failure reason column: {}", row.getCell(OfficeConstants.STATUS_COL).getStringCellValue()); - Assertions.assertEquals("Imported", row.getCell(OfficeConstants.STATUS_COL).getStringCellValue()); - outputWorkbook.close(); + Assertions.assertEquals("Imported", row.getCell(OfficeConstants.STATUS_COL).getStringCellValue()); + outputWorkbook.close(); + } } private Workbook getOfficeWorkBook(final String dateFormat) throws IOException { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/savings/SavingsImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/savings/SavingsImportHandlerTest.java index 0e11e777ded..03d147df7ce 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/savings/SavingsImportHandlerTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/savings/SavingsImportHandlerTest.java @@ -27,10 +27,11 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -167,16 +168,15 @@ public void testSavingsImport() throws InterruptedException, IOException, ParseE firstSavingsRow.createCell(SavingsConstants.OVER_DRAFT_LIMIT_COL) .setCellValue(savingsProductSheet.getRow(1).getCell(15).getNumericCellValue()); - String currentdirectory = new File("").getAbsolutePath(); - File directory = new File(currentdirectory + File.separator + "src" + File.separator + "integrationTest" + File.separator - + "resources" + File.separator + "bulkimport" + File.separator + "importhandler" + File.separator + "savings"); - if (!directory.exists()) { - directory.mkdirs(); + Path directory = Path.of("").toAbsolutePath().resolve("src").resolve("integrationTest").resolve("resources").resolve("bulkimport") + .resolve("importhandler").resolve("savings"); + if (!directory.toFile().exists()) { + directory.toFile().mkdirs(); + } + File file = directory.resolve("Savings.xls").toFile(); + try (OutputStream outputStream = Files.newOutputStream(file.toPath())) { + workbook.write(outputStream); } - File file = new File(directory + File.separator + "Savings.xls"); - OutputStream outputStream = new FileOutputStream(file); - workbook.write(outputStream); - outputStream.close(); String importDocumentId = savingsAccountHelper.importSavingsTemplate(file); file.delete(); @@ -187,16 +187,17 @@ public void testSavingsImport() throws InterruptedException, IOException, ParseE // check status column of output excel String location = LocalContentStorageUtil.path(savingsAccountHelper.getOutputTemplateLocation(importDocumentId)); - FileInputStream fileInputStream = new FileInputStream(location); - Workbook wb = new HSSFWorkbook(fileInputStream); - Sheet sheet = wb.getSheet(TemplatePopulateImportConstants.SAVINGS_ACCOUNTS_SHEET_NAME); - Row row = sheet.getRow(1); + try (InputStream fileInputStream = Files.newInputStream(Path.of(location))) { + Workbook wb = new HSSFWorkbook(fileInputStream); + Sheet sheet = wb.getSheet(TemplatePopulateImportConstants.SAVINGS_ACCOUNTS_SHEET_NAME); + Row row = sheet.getRow(1); - LOG.info("Output location: {}", location); - LOG.info("Failure reason column: {}", row.getCell(SavingsConstants.STATUS_COL).getStringCellValue()); + LOG.info("Output location: {}", location); + LOG.info("Failure reason column: {}", row.getCell(SavingsConstants.STATUS_COL).getStringCellValue()); - Assertions.assertEquals("Imported", row.getCell(SavingsConstants.STATUS_COL).getStringCellValue()); - wb.close(); + Assertions.assertEquals("Imported", row.getCell(SavingsConstants.STATUS_COL).getStringCellValue()); + wb.close(); + } } private void safeNumericValueSetter(Row targetRow, int targetColId, Sheet sourceSheet, int rowId, int colId) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java index 3970aebb71f..e9618466738 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Path; import okhttp3.MediaType; import okhttp3.MultipartBody.Part; import okhttp3.ResponseBody; @@ -40,7 +41,7 @@ */ class DocumentTest extends IntegrationTest { - final File testFile = new File(getClass().getResource("/michael.vorburger-crepes.jpg").getFile()); + final File testFile = Path.of(getClass().getResource("/michael.vorburger-crepes.jpg").getFile()).toFile(); Long clientId = new ClientTest().getClientId(); Long documentId; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignDocumentTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignDocumentTest.java index 9819ebeca6d..a669ca92ac2 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignDocumentTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignDocumentTest.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.nio.file.Path; import org.apache.fineract.client.feign.FeignException; import org.apache.fineract.client.feign.FineractMultipartEncoder; import org.apache.fineract.client.models.DocumentData; @@ -39,7 +40,7 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class FeignDocumentTest extends FeignIntegrationTest { - final File testFile = new File(getClass().getResource("/michael.vorburger-crepes.jpg").getFile()); + final File testFile = Path.of(getClass().getResource("/michael.vorburger-crepes.jpg").getFile()).toFile(); Long clientId; Long documentId; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignImageTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignImageTest.java index c9aed0791c8..e20f9b05ad6 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignImageTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/FeignImageTest.java @@ -25,6 +25,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Path; import java.time.LocalDate; import java.time.ZoneId; import java.util.HashMap; @@ -39,7 +40,7 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class FeignImageTest extends FeignIntegrationTest { - final File testImage = new File(getClass().getResource("/michael.vorburger-crepes.jpg").getFile()); + final File testImage = Path.of(getClass().getResource("/michael.vorburger-crepes.jpg").getFile()).toFile(); Long staffId; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java index c27f0e64e75..a51761e10d5 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java @@ -33,7 +33,6 @@ import okhttp3.RequestBody; import okhttp3.ResponseBody; import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; import org.apache.fineract.client.services.ImagesApi; import org.apache.fineract.client.util.Parts; import org.junit.jupiter.api.Order; @@ -80,7 +79,7 @@ void getOriginalSize() throws IOException { @Order(3) void getSmallerSize() throws IOException { var r = ok(fineractClient().images.get("staff", staffId, 128, 128, null)); - assertThat(r.string()).hasSize(7251); + assertThat(r.string()).hasSize(7067); } @Test @@ -254,7 +253,7 @@ void pathTraversalWithAbsolutePathJpg2() { private MultipartBody.Part createPart(String fileResource, String fileName, String mediaType) { try { - byte[] data = IOUtils.toByteArray(ImageTest.class.getClassLoader().getResourceAsStream(fileResource)); + byte[] data = ImageTest.class.getClassLoader().getResourceAsStream(fileResource).readAllBytes(); var rb = RequestBody.create(data, MediaType.get(mediaType)); return MultipartBody.Part.createFormData("file", fileName, rb); } catch (Exception e) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java index 5b6e7f748f1..32bdd90c403 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/BatchHelper.java @@ -82,7 +82,8 @@ public static String toJsonString(final List batchRequests) { /** * Returns a Map from Json String * - * @param + * @param jsonString + * JSON input string * @return Map */ // TODO: Rewrite to use fineract-client instead! @@ -162,7 +163,10 @@ public static List postBatchRequestsWithEnclosingTransaction(fina /** * Returns a BatchResponse based on the given BatchRequest, by posting the request to the server. * - * @param + * @param requestSpec + * request specification + * @param responseSpec + * response specification * @return {@code List} */ // TODO: Rewrite to use fineract-client instead! @@ -190,8 +194,10 @@ public static List postWithSingleRequest(final RequestSpecificati * Creates and returns a {@link org.apache.fineract.batch.command.internal.CreateClientCommandStrategy} Request as * one of the request in Batch. * - * @param + * @param requestId + * request id * @param externalId + * external id * @return BatchRequest */ public static BatchRequest createClientRequest(final Long requestId, final String externalId) { @@ -221,8 +227,10 @@ public static BatchRequest createClientRequest(final Long requestId, final Strin * Creates and returns a {@link org.apache.fineract.batch.command.internal.CreateClientCommandStrategy} Request as * one of the request in Batch. * - * @param + * @param requestId + * request id * @param externalId + * external id * @return BatchRequest */ public static BatchRequest createActiveClientRequest(final Long requestId, final String externalId) { @@ -252,8 +260,10 @@ public static BatchRequest createActiveClientRequest(final Long requestId, final * Creates and returns a {@link org.apache.fineract.batch.command.internal.UpdateClientCommandStrategy} Request with * given requestId and reference. * - * @param - * @param + * @param requestId + * request id + * @param reference + * reference id * @return BatchRequest */ public static BatchRequest updateClientRequest(final Long requestId, final Long reference) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java index cb9d378350b..1ff5687ce1a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java @@ -66,7 +66,11 @@ public class CampaignsTest { public CampaignsTest(ClientAndServer client) { this.client = client; + } + @BeforeEach + public void setup() { + Utils.initializeRESTAssured(); // Set up mock server for message-gateway this.client.when(request().withMethod("GET").withPath("/smsbridges")) .respond(response().withContentType(MediaType.APPLICATION_JSON).withBody("[\n" // @@ -79,11 +83,6 @@ public CampaignsTest(ClientAndServer client) { + " }\n" // + "]") // ); - } - - @BeforeEach - public void setup() { - Utils.initializeRESTAssured(); this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); this.requestSpec.header("Fineract-Platform-TenantId", "default"); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java index c38d91c519e..0dca69793a3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferCancelTest.java @@ -411,7 +411,7 @@ private void validateResponse(PostInitiateTransferResponse transferResponse, Int assertNull(transferResponse.getChanges()); } - @RequiredArgsConstructor() + @RequiredArgsConstructor public static class ExpectedExternalTransferData { private final ExternalTransferData.StatusEnum status; @@ -441,7 +441,7 @@ static ExpectedExternalTransferData expected(ExternalTransferData.StatusEnum sta } - @RequiredArgsConstructor() + @RequiredArgsConstructor public static class ExpectedJournalEntryData { private final Long glAccountId; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java index 8eff86f3094..393cfaffc19 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/ExternalAssetOwnerTransferTest.java @@ -352,7 +352,7 @@ protected void getAndValidateThereIsNoJournalEntriesForTransfer(Long transferId) assertNull(result.getJournalEntryData()); } - @RequiredArgsConstructor() + @RequiredArgsConstructor public static class ExpectedExternalTransferData { private final ExternalTransferData.StatusEnum status; @@ -394,7 +394,7 @@ static ExpectedExternalTransferData expected(ExternalTransferData.StatusEnum sta } } - @RequiredArgsConstructor() + @RequiredArgsConstructor public static class ExpectedJournalEntryData { private final Long glAccountId; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java index 08d426b1a07..f9e2d729608 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java @@ -1672,7 +1672,7 @@ private void getAndValidateThereIsNoJournalEntriesForTransfer(Long transferId) { assertNull(result.getJournalEntryData()); } - @RequiredArgsConstructor() + @RequiredArgsConstructor public static class ExpectedExternalTransferData { private final ExternalTransferData.StatusEnum status; @@ -1715,7 +1715,7 @@ static ExpectedExternalTransferData expected(ExternalTransferData.StatusEnum sta } } - @RequiredArgsConstructor() + @RequiredArgsConstructor public static class ExpectedJournalEntryData { private final Long glAccountId; From c0e6614334199c26cc3cb46963a7f0a02ddbefe1 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Mon, 25 May 2026 16:39:48 +0100 Subject: [PATCH 4/4] FINERACT-2421: Enhance verify backward compatibility CI check --- .../verify-api-backward-compatibility.yml | 60 ++++++++----------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/.github/workflows/verify-api-backward-compatibility.yml b/.github/workflows/verify-api-backward-compatibility.yml index ba186101077..6be1985a00a 100644 --- a/.github/workflows/verify-api-backward-compatibility.yml +++ b/.github/workflows/verify-api-backward-compatibility.yml @@ -17,7 +17,7 @@ jobs: TZ: Asia/Kolkata steps: - - name: Checkout base branch + - name: Checkout base branch for baseline uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: repository: ${{ github.event.pull_request.base.repo.full_name }} @@ -25,23 +25,24 @@ jobs: fetch-depth: 0 path: baseline - - name: Compute merge-base commit - id: merge-base + - name: Checkout base branch for merged PR + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: ${{ github.event.pull_request.base.repo.full_name }} + ref: ${{ github.event.pull_request.base.ref }} + fetch-depth: 0 + path: current + + - name: Merge PR into current base + working-directory: current run: | - cd baseline + git config user.name "github-actions" + git config user.email "github-actions@github.com" + git fetch "https://github.com/${{ github.event.pull_request.head.repo.full_name }}.git" \ "${{ github.event.pull_request.head.ref }}:refs/remotes/pr-head" --no-tags - MERGE_BASE=$(git merge-base "origin/${{ github.event.pull_request.base.ref }}" "refs/remotes/pr-head") - echo "Merge-base commit: ${MERGE_BASE}" - echo "sha=${MERGE_BASE}" >> "$GITHUB_OUTPUT" - BASE_HEAD=$(git rev-parse "origin/${{ github.event.pull_request.base.ref }}") - if [ "${MERGE_BASE}" != "${BASE_HEAD}" ]; then - echo "::notice::PR is not rebased on latest ${{ github.event.pull_request.base.ref }}. Using merge-base ${MERGE_BASE} as baseline (branch HEAD: ${BASE_HEAD})." - fi - - name: Reset baseline to merge-base - working-directory: baseline - run: git checkout ${{ steps.merge-base.outputs.sha }} + git merge --no-commit --no-ff refs/remotes/pr-head - name: Set up JDK 21 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5 @@ -49,23 +50,18 @@ jobs: distribution: 'zulu' java-version: '21' - - name: Download workspace - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 - with: - name: fineract-workspace-${{ github.run_id }} - path: . - - - name: Extract workspace - run: tar -xf fineract-workspace.tar - - name: Generate baseline spec working-directory: baseline run: ./gradlew :fineract-provider:resolve --no-daemon + - name: Generate merged PR spec + working-directory: current + run: ./gradlew :fineract-provider:resolve --no-daemon + - name: Sanitize specs run: | python3 -c " - import json, sys + import json def sanitize(path): with open(path) as f: @@ -85,18 +81,18 @@ jobs: print(f'{path}: fixed {fixed} entries') sanitize('${GITHUB_WORKSPACE}/baseline/fineract-provider/build/resources/main/static/fineract.json') - sanitize('${GITHUB_WORKSPACE}/fineract-provider/build/resources/main/static/fineract.json') + sanitize('${GITHUB_WORKSPACE}/current/fineract-provider/build/resources/main/static/fineract.json') " - name: Check breaking changes id: breaking-check continue-on-error: true + working-directory: current run: | set -o pipefail ./gradlew --no-daemon :fineract-provider:checkBreakingChanges \ -PapiBaseline="${GITHUB_WORKSPACE}/baseline/fineract-provider/build/resources/main/static/fineract.json" \ - -PapiNew="${GITHUB_WORKSPACE}/fineract-provider/build/resources/main/static/fineract.json" \ - --no-daemon \ + -PapiNew="${GITHUB_WORKSPACE}/current/fineract-provider/build/resources/main/static/fineract.json" \ -x buildJavaSdk \ -x :fineract-client:buildJavaSdk \ -x :fineract-client-feign:buildJavaSdk \ @@ -106,7 +102,7 @@ jobs: if: steps.breaking-check.outcome == 'failure' id: report run: | - REPORT_DIR="fineract-provider/build/swagger-brake" + REPORT_DIR="current/fineract-provider/build/swagger-brake" python3 -c " import json, glob, os @@ -167,7 +163,7 @@ jobs: for (rule, det), items in sorted(groups.items()): desc = RULE_DESC.get(rule, '') eps = sorted(set( - f'{c.get(\"method\",\"\")} {c.get(\"path\",\"\")}' + f'{c.get(\"method\", \"\")} {c.get(\"path\", \"\")}' for c in items if c.get('path') )) ep_str = ', '.join(f'\`{e}\`' for e in eps[:5]) @@ -188,7 +184,6 @@ jobs: f.write(body) f.write('\n\n> **Note:** This check is informational only and does not block the PR.\n') - # Also write to step summary with open(os.environ['GITHUB_STEP_SUMMARY'], 'a') as f: f.write('## Breaking API Changes Detected\n\n') f.write(body) @@ -204,12 +199,10 @@ jobs: run: | MARKER="" - # Find existing comment by marker COMMENT_ID=$(gh api "repos/${{ github.repository }}/issues/${PR_NUMBER}/comments" \ --jq ".[] | select(.body | contains(\"${MARKER}\")) | .id" | head -1) if [ "${{ steps.breaking-check.outcome }}" == "failure" ] && [ -f "${GITHUB_WORKSPACE}/breaking-changes-report.md" ]; then - # Prepend marker to the report BODY="${MARKER} $(cat ${GITHUB_WORKSPACE}/breaking-changes-report.md)" @@ -220,7 +213,6 @@ jobs: gh pr comment "${PR_NUMBER}" --repo ${{ github.repository }} --body "${BODY}" fi elif [ -n "$COMMENT_ID" ]; then - # No breaking changes anymore, delete the old comment gh api "repos/${{ github.repository }}/issues/comments/${COMMENT_ID}" -X DELETE fi @@ -236,7 +228,7 @@ jobs: uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: api-compatibility-report - path: fineract-provider/build/swagger-brake/ + path: current/fineract-provider/build/swagger-brake/ retention-days: 30 - name: Fail if breaking changes detected