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 PersistentEntity, ?>, ? 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