From 7c8ef4ecd4c243a44e82e5c48bc262c22c07dc20 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 30 Jun 2026 21:31:46 +0530 Subject: [PATCH 01/63] FINERACT-2621: flip build to Spring Boot 4.0.7 Move the Spring Boot BOM and Gradle plugin to 4.0.7 (Spring Framework 7, Security 7, Batch 6, EclipseLink 5), apply the Boot 4 starter renames, drop the pins now managed by the BOM, and pin resilience4j-spring-boot4. Enable spring-boot-jackson2 so the Jersey layer stays on Jackson 2. Module sources are migrated in follow-up commits; the build is expected to break here. Signed-off-by: avinashvijayvargiya --- build.gradle | 2 +- .../org.apache.fineract.dependencies.gradle | 22 +++++++------------ fineract-accounting/dependencies.gradle | 6 ++--- fineract-branch/dependencies.gradle | 4 ++-- fineract-charge/dependencies.gradle | 4 ++-- fineract-cob/dependencies.gradle | 6 ++--- fineract-command-async/dependencies.gradle | 2 +- fineract-command-audit/dependencies.gradle | 2 +- .../dependencies.gradle | 2 +- fineract-command-jdbc/dependencies.gradle | 2 +- fineract-command-test/dependencies.gradle | 4 ++-- fineract-command/dependencies.gradle | 4 ++-- fineract-core/dependencies.gradle | 6 ++--- fineract-document/dependencies.gradle | 4 ++-- fineract-investor/dependencies.gradle | 4 ++-- fineract-loan-origination/dependencies.gradle | 4 ++-- fineract-loan/dependencies.gradle | 6 ++--- fineract-mix/dependencies.gradle | 4 ++-- fineract-progressive-loan/dependencies.gradle | 4 ++-- fineract-provider/dependencies.gradle | 16 ++++++++------ fineract-rates/dependencies.gradle | 4 ++-- fineract-report/dependencies.gradle | 4 ++-- fineract-savings/dependencies.gradle | 4 ++-- fineract-security/dependencies.gradle | 8 +++---- fineract-tax/dependencies.gradle | 4 ++-- .../dependencies.gradle | 4 ++-- 26 files changed, 66 insertions(+), 70 deletions(-) diff --git a/build.gradle b/build.gradle index fe693346622..aec353d394a 100644 --- a/build.gradle +++ b/build.gradle @@ -117,7 +117,7 @@ plugins { 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.2' apply false - id 'org.springframework.boot' version '3.5.15' apply false + id 'org.springframework.boot' version '4.0.7' 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 diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index a9e8a1a8820..6f81dd8ce23 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -25,7 +25,7 @@ dependencyManagement { mavenBom 'com.squareup.okhttp3:okhttp-bom:4.12.0' 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.15' + mavenBom 'org.springframework.boot:spring-boot-dependencies:4.0.7' 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' @@ -50,7 +50,7 @@ dependencyManagement { 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.9' + dependency 'org.eclipse.persistence:org.eclipse.persistence.jpa:5.0.0' 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' @@ -184,7 +184,7 @@ dependencyManagement { dependency 'com.vdurmont:semver4j:3.1.0' dependency 'org.beryx:text-io:3.4.1' - dependency ('org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.17') { + dependency ('org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.3') { exclude 'io.swagger.core.v3:swagger-core' } @@ -275,10 +275,7 @@ dependencyManagement { 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.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' + // spring-restdocs (4.0.x) now managed by the Spring Boot 4 BOM dependency 'com.lmax:disruptor:4.0.0' @@ -292,8 +289,9 @@ dependencyManagement { 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' - dependency 'org.springframework:spring-core:6.2.18' - dependency 'org.springframework.security:spring-security-core:6.5.10' + // spring-core & spring-security-core now come from the Spring Boot 4 BOM (Spring Framework 7 / Security 7) + // resilience4j-bom does not manage the spring-boot4 starter variant — pin it explicitly: + dependency 'io.github.resilience4j:resilience4j-spring-boot4:2.4.0' // Keep Netty on the 4.1 line for MockServer compatibility. dependency 'io.netty:netty-buffer:4.1.135.Final' dependency 'io.netty:netty-common:4.1.135.Final' @@ -312,10 +310,6 @@ dependencyManagement { dependency 'io.netty:netty-transport-classes-epoll:4.1.135.Final' dependency 'io.netty:netty-transport-native-unix-common:4.1.135.Final' dependency 'at.yawk.lz4:lz4-java:1.11.0' - dependency 'org.thymeleaf:thymeleaf:3.1.5.RELEASE' - dependency 'org.thymeleaf:thymeleaf-spring6:3.1.5.RELEASE' - dependency 'org.apache.tomcat.embed:tomcat-embed-core:10.1.55' - dependency 'org.apache.tomcat.embed:tomcat-embed-el:10.1.55' - dependency 'org.apache.tomcat.embed:tomcat-embed-websocket:10.1.55' + // thymeleaf + thymeleaf-spring7 and Tomcat 11 embed now come from the Spring Boot 4 BOM } } diff --git a/fineract-accounting/dependencies.gradle b/fineract-accounting/dependencies.gradle index 907e72eac20..5e4a86ba732 100644 --- a/fineract-accounting/dependencies.gradle +++ b/fineract-accounting/dependencies.gradle @@ -32,9 +32,9 @@ dependencies { ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', - 'org.springframework.boot:spring-boot-starter-batch', + 'org.springframework.boot:spring-boot-starter-batch-jdbc', 'org.springframework.batch:spring-batch-integration', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -53,7 +53,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' compileOnly 'org.projectlombok:lombok' diff --git a/fineract-branch/dependencies.gradle b/fineract-branch/dependencies.gradle index c5c3ff7b67d..455f08eba78 100644 --- a/fineract-branch/dependencies.gradle +++ b/fineract-branch/dependencies.gradle @@ -28,7 +28,7 @@ dependencies { implementation(project(path: ':fineract-accounting')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -47,7 +47,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-charge/dependencies.gradle b/fineract-charge/dependencies.gradle index 13291535f11..930359f1bf0 100644 --- a/fineract-charge/dependencies.gradle +++ b/fineract-charge/dependencies.gradle @@ -28,7 +28,7 @@ dependencies { implementation(project(path: ':fineract-tax')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -47,7 +47,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-cob/dependencies.gradle b/fineract-cob/dependencies.gradle index 8feb9c1a423..47428e4818c 100644 --- a/fineract-cob/dependencies.gradle +++ b/fineract-cob/dependencies.gradle @@ -31,10 +31,10 @@ dependencies { // implementation dependencies are directly used (compiled against) in src/main (and src/test) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'org.springframework.boot:spring-boot-starter-validation', - 'org.springframework.boot:spring-boot-starter-batch', + 'org.springframework.boot:spring-boot-starter-batch-jdbc', 'org.springframework.batch:spring-batch-integration', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -54,7 +54,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) implementation ('org.springframework.boot:spring-boot-starter-data-jpa') { diff --git a/fineract-command-async/dependencies.gradle b/fineract-command-async/dependencies.gradle index 5bb81412b22..633567fd51b 100644 --- a/fineract-command-async/dependencies.gradle +++ b/fineract-command-async/dependencies.gradle @@ -24,7 +24,7 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.commons:commons-lang3', diff --git a/fineract-command-audit/dependencies.gradle b/fineract-command-audit/dependencies.gradle index 36df91c4558..c005aefce31 100644 --- a/fineract-command-audit/dependencies.gradle +++ b/fineract-command-audit/dependencies.gradle @@ -24,7 +24,7 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.commons:commons-lang3', diff --git a/fineract-command-disruptor/dependencies.gradle b/fineract-command-disruptor/dependencies.gradle index 9314e5ecee3..89b26ea4f90 100644 --- a/fineract-command-disruptor/dependencies.gradle +++ b/fineract-command-disruptor/dependencies.gradle @@ -24,7 +24,7 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.commons:commons-lang3', diff --git a/fineract-command-jdbc/dependencies.gradle b/fineract-command-jdbc/dependencies.gradle index ccbad997b79..0154f378e32 100644 --- a/fineract-command-jdbc/dependencies.gradle +++ b/fineract-command-jdbc/dependencies.gradle @@ -25,7 +25,7 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter', 'org.springframework.boot:spring-boot-starter-data-jdbc', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'com.fasterxml.jackson.core:jackson-databind', diff --git a/fineract-command-test/dependencies.gradle b/fineract-command-test/dependencies.gradle index f7cb1bb8e72..728f1162655 100644 --- a/fineract-command-test/dependencies.gradle +++ b/fineract-command-test/dependencies.gradle @@ -25,9 +25,9 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter', 'org.springframework.boot:spring-boot-starter-data-jdbc', - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-validation', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'com.fasterxml.jackson.core:jackson-databind', diff --git a/fineract-command/dependencies.gradle b/fineract-command/dependencies.gradle index 363996356b8..82267b90194 100644 --- a/fineract-command/dependencies.gradle +++ b/fineract-command/dependencies.gradle @@ -21,9 +21,9 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter', 'org.springframework.boot:spring-boot-starter-validation', - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.security:spring-security-core', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'com.google.guava:guava', diff --git a/fineract-core/dependencies.gradle b/fineract-core/dependencies.gradle index 688b002c1dd..5566ad7db79 100644 --- a/fineract-core/dependencies.gradle +++ b/fineract-core/dependencies.gradle @@ -30,10 +30,10 @@ dependencies { // implementation dependencies are directly used (compiled against) in src/main (and src/test) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'org.springframework.boot:spring-boot-starter-validation', - 'org.springframework.boot:spring-boot-starter-batch', + 'org.springframework.boot:spring-boot-starter-batch-jdbc', 'org.springframework.batch:spring-batch-integration', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -53,7 +53,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) implementation ('org.springframework.boot:spring-boot-starter-data-jpa') { diff --git a/fineract-document/dependencies.gradle b/fineract-document/dependencies.gradle index 65c6ab23726..999e10976f4 100644 --- a/fineract-document/dependencies.gradle +++ b/fineract-document/dependencies.gradle @@ -30,7 +30,7 @@ dependencies { ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-validation', 'org.springframework.boot:spring-boot-starter-security', 'org.springframework.boot:spring-boot-starter-data-jdbc', @@ -44,7 +44,7 @@ dependencies { 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', 'org.apache.tika:tika-core', diff --git a/fineract-investor/dependencies.gradle b/fineract-investor/dependencies.gradle index 02f966e2847..dafca33c1ef 100644 --- a/fineract-investor/dependencies.gradle +++ b/fineract-investor/dependencies.gradle @@ -35,7 +35,7 @@ dependencies { ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'org.springframework.boot:spring-boot-starter-cache', 'jakarta.ws.rs:jakarta.ws.rs-api', @@ -55,7 +55,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.reflections:reflections:0.10.2', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-loan-origination/dependencies.gradle b/fineract-loan-origination/dependencies.gradle index e1af2fcc89d..ecf013a8ced 100644 --- a/fineract-loan-origination/dependencies.gradle +++ b/fineract-loan-origination/dependencies.gradle @@ -33,7 +33,7 @@ dependencies { implementation(project(path: ':fineract-working-capital-loan')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -52,7 +52,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-loan/dependencies.gradle b/fineract-loan/dependencies.gradle index f18abff8944..f7df32f6e07 100644 --- a/fineract-loan/dependencies.gradle +++ b/fineract-loan/dependencies.gradle @@ -32,9 +32,9 @@ dependencies { implementation(project(path: ':fineract-tax')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', - 'org.springframework.boot:spring-boot-starter-batch', + 'org.springframework.boot:spring-boot-starter-batch-jdbc', 'org.springframework.batch:spring-batch-integration', 'jakarta.ws.rs:jakarta.ws.rs-api', @@ -54,7 +54,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', 'org.apache.commons:commons-collections4' diff --git a/fineract-mix/dependencies.gradle b/fineract-mix/dependencies.gradle index 698ffa7e6fd..39266dcf33c 100644 --- a/fineract-mix/dependencies.gradle +++ b/fineract-mix/dependencies.gradle @@ -30,7 +30,7 @@ dependencies { ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-validation', 'org.springframework.boot:spring-boot-starter-security', 'org.springframework.boot:spring-boot-starter-data-jdbc', @@ -46,7 +46,7 @@ dependencies { 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' compileOnly 'org.projectlombok:lombok' diff --git a/fineract-progressive-loan/dependencies.gradle b/fineract-progressive-loan/dependencies.gradle index d98329ad42c..7ae59fe6eba 100644 --- a/fineract-progressive-loan/dependencies.gradle +++ b/fineract-progressive-loan/dependencies.gradle @@ -34,7 +34,7 @@ dependencies { ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -53,7 +53,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' compileOnly 'org.projectlombok:lombok' diff --git a/fineract-provider/dependencies.gradle b/fineract-provider/dependencies.gradle index 669f7b94e19..f165dec5211 100644 --- a/fineract-provider/dependencies.gradle +++ b/fineract-provider/dependencies.gradle @@ -46,7 +46,7 @@ dependencies { implementation(project(path: ':fineract-working-capital-loan')) implementation(project(path: ':fineract-mix')) - providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") + providedRuntime("org.springframework.boot:spring-boot-starter-tomcat-runtime") // Never use "compile" scope, but make all dependencies either 'implementation', 'runtimeOnly' or 'testCompile'. // Note that we never use 'api', because Fineract at least currently is a simple monolithic application ("WAR"), not a library. @@ -58,15 +58,15 @@ dependencies { project(path: ':fineract-avro-schemas') ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-validation', 'org.springframework.boot:spring-boot-starter-security', - 'org.springframework.boot:spring-boot-starter-oauth2-authorization-server', - 'org.springframework.boot:spring-boot-starter-oauth2-client', + 'org.springframework.boot:spring-boot-starter-security-oauth2-authorization-server', + 'org.springframework.boot:spring-boot-starter-security-oauth2-client', 'org.springframework.boot:spring-boot-starter-cache', - 'org.springframework.boot:spring-boot-starter-oauth2-resource-server', + 'org.springframework.boot:spring-boot-starter-security-oauth2-resource-server', 'org.springframework.boot:spring-boot-starter-actuator', - 'org.springframework.boot:spring-boot-starter-batch', + 'org.springframework.boot:spring-boot-starter-batch-jdbc', 'org.springframework.boot:spring-boot-starter-data-jdbc', 'org.springframework.batch:spring-batch-integration', 'org.springframework.boot:spring-boot-starter-integration', @@ -121,7 +121,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.reflections:reflections', ) @@ -140,6 +140,8 @@ dependencies { exclude group: 'org.hibernate.validator', module: 'hibernate-validator' exclude group: 'jakarta.activation', module: 'jakarta.activation-api' } + // Spring Boot 4 defaults to Jackson 3; re-enable Jackson 2 so the Jersey REST layer (Jackson-2 island) keeps working + implementation 'org.springframework.boot:spring-boot-jackson2' implementation('org.dom4j:dom4j') { exclude group: 'javax.xml.bind' } diff --git a/fineract-rates/dependencies.gradle b/fineract-rates/dependencies.gradle index 5cd90648d0e..8c1b3af62b7 100644 --- a/fineract-rates/dependencies.gradle +++ b/fineract-rates/dependencies.gradle @@ -27,7 +27,7 @@ dependencies { implementation(project(path: ':fineract-core')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -46,7 +46,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-report/dependencies.gradle b/fineract-report/dependencies.gradle index 5cd90648d0e..8c1b3af62b7 100644 --- a/fineract-report/dependencies.gradle +++ b/fineract-report/dependencies.gradle @@ -27,7 +27,7 @@ dependencies { implementation(project(path: ':fineract-core')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -46,7 +46,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-savings/dependencies.gradle b/fineract-savings/dependencies.gradle index b64450a5d1e..0e659f4e8e5 100644 --- a/fineract-savings/dependencies.gradle +++ b/fineract-savings/dependencies.gradle @@ -32,7 +32,7 @@ dependencies { implementation(project(path: ':fineract-tax')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -51,7 +51,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-security/dependencies.gradle b/fineract-security/dependencies.gradle index f9b779e3247..5afbe0af363 100644 --- a/fineract-security/dependencies.gradle +++ b/fineract-security/dependencies.gradle @@ -30,11 +30,11 @@ dependencies { // Spring Boot Security dependencies implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', - 'org.springframework.boot:spring-boot-starter-oauth2-authorization-server', - 'org.springframework.boot:spring-boot-starter-oauth2-resource-server', - 'org.springframework.boot:spring-boot-starter-oauth2-client', + 'org.springframework.boot:spring-boot-starter-security-oauth2-authorization-server', + 'org.springframework.boot:spring-boot-starter-security-oauth2-resource-server', + 'org.springframework.boot:spring-boot-starter-security-oauth2-client', 'org.springframework.boot:spring-boot-starter-cache', 'jakarta.ws.rs:jakarta.ws.rs-api', diff --git a/fineract-tax/dependencies.gradle b/fineract-tax/dependencies.gradle index 5cd90648d0e..8c1b3af62b7 100644 --- a/fineract-tax/dependencies.gradle +++ b/fineract-tax/dependencies.gradle @@ -27,7 +27,7 @@ dependencies { implementation(project(path: ':fineract-core')) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', @@ -46,7 +46,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', 'org.apache.httpcomponents:httpcore', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' diff --git a/fineract-working-capital-loan/dependencies.gradle b/fineract-working-capital-loan/dependencies.gradle index bcf32ae0763..9a0689ee922 100644 --- a/fineract-working-capital-loan/dependencies.gradle +++ b/fineract-working-capital-loan/dependencies.gradle @@ -29,7 +29,7 @@ dependencies { ) implementation( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-webmvc', 'org.springframework.boot:spring-boot-starter-security', 'org.springframework.batch:spring-batch-integration', 'org.springframework:spring-context-support', @@ -50,7 +50,7 @@ dependencies { 'org.springdoc:springdoc-openapi-starter-webmvc-ui', 'org.mapstruct:mapstruct', - 'io.github.resilience4j:resilience4j-spring-boot3', + 'io.github.resilience4j:resilience4j-spring-boot4', ) compileOnly 'com.github.spotbugs:spotbugs-annotations' compileOnly 'org.projectlombok:lombok' From 9d454e0e4f898035a0f391c1d2c162413d4aadba Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 30 Jun 2026 21:31:48 +0530 Subject: [PATCH 02/63] FINERACT-2621: migrate fineract-core to Spring Batch 6 Relocate the Spring Batch imports that moved in 6.0.x: the Job/Step types and parameters into core.job, core.step and core.job.parameters, and RepeatStatus into batch.infrastructure.repeat. fineract-core compiles on Spring Boot 4. Signed-off-by: avinashvijayvargiya --- .../commands/jobs/PurgeProcessedCommandsConfig.java | 6 +++--- .../commands/jobs/PurgeProcessedCommandsTasklet.java | 4 ++-- .../event/external/jobs/PurgeExternalEventsConfig.java | 6 +++--- .../event/external/jobs/PurgeExternalEventsTasklet.java | 4 ++-- .../event/external/jobs/SendAsynchronousEventsConfig.java | 6 +++--- .../event/external/jobs/SendAsynchronousEventsTasklet.java | 4 ++-- .../batch/core/scope/context/JobSynchronizationManager.java | 6 +++--- .../core/scope/context/StepSynchronizationManager.java | 4 ++-- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java index a0ff3247e79..56f53755e3f 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java @@ -20,10 +20,10 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.StepName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java index de7dc4bf2e4..11b1d747bcb 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java @@ -25,10 +25,10 @@ import org.apache.fineract.commands.domain.CommandSourceRepository; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.service.DateUtils; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java index 810d2bb705d..de85894aa5d 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java @@ -19,10 +19,10 @@ package org.apache.fineract.infrastructure.event.external.jobs; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java index 895cda3a23b..061e21a4fe5 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java @@ -25,10 +25,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.event.external.repository.ExternalEventRepository; import org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEventStatus; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java index 268c88fbe42..89f59886b12 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java @@ -20,10 +20,10 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.StepName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java index 474c2cd8d4c..501aa43eed5 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java @@ -46,10 +46,10 @@ import org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEventView; import org.apache.fineract.infrastructure.event.external.service.message.MessageFactory; import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; diff --git a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java index c4446ee5ebb..3db9989c126 100644 --- a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java +++ b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java @@ -19,9 +19,9 @@ package org.springframework.batch.core.scope.context; import org.apache.fineract.infrastructure.jobs.TenantAwareEqualsHashCodeAdvice; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobInstance; -import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.cglib.proxy.Enhancer; import org.springframework.lang.Nullable; diff --git a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java index ca9e995e92d..e9d003dec07 100644 --- a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java +++ b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java @@ -19,8 +19,8 @@ package org.springframework.batch.core.scope.context; import org.apache.fineract.infrastructure.jobs.TenantAwareEqualsHashCodeAdvice; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.step.StepExecution; import org.springframework.cglib.proxy.Enhancer; import org.springframework.lang.Nullable; From 9e1be52270cda82cac41bda9b7bbf69c3ceeab72 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 30 Jun 2026 22:58:24 +0530 Subject: [PATCH 03/63] FINERACT-2621: migrate fineract-cob to Spring Batch 6 Relocate the Spring Batch imports that moved in 6.0.x (Job/Step types into core.job, core.step and core.listener; the item.* and repeat.* subtrees into batch.infrastructure.*), and adapt CustomJobParameterResolver to the new JobParameters/JobParameter record API (parameters(), name(), value()). Signed-off-by: avinashvijayvargiya --- .../fineract/cob/common/CommonPartitioner.java | 4 ++-- .../cob/common/CustomJobParameterResolver.java | 12 ++++++------ .../fineract/cob/common/InitialisationTasklet.java | 4 ++-- .../fineract/cob/common/ResetContextTasklet.java | 4 ++-- .../cob/listener/AbstractLoanItemListener.java | 2 +- .../cob/listener/COBExecutionListenerRunner.java | 4 ++-- .../fineract/cob/listener/CobWorkerStepListener.java | 8 ++++---- .../cob/listener/FineractCOBAfterJobListener.java | 2 +- .../cob/listener/FineractCOBBeforeJobListener.java | 2 +- .../listener/JobExecutionContextCopyListener.java | 6 +++--- .../cob/processor/AbstractItemProcessor.java | 6 +++--- .../fineract/cob/resolver/BusinessDateResolver.java | 2 +- .../fineract/cob/resolver/CatchUpFlagResolver.java | 2 +- .../service/BeforeStepLockingItemReaderHelper.java | 4 ++-- .../fineract/cob/tasklet/ApplyCommonLockTasklet.java | 6 +++--- .../cob/tasklet/UnlockProcessedAccountsTasklet.java | 4 ++-- 16 files changed, 36 insertions(+), 36 deletions(-) diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java index 5d27f3973d7..4fec6151b88 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java @@ -33,11 +33,11 @@ import org.apache.fineract.cob.resolver.BusinessDateResolver; import org.apache.fineract.cob.resolver.CatchUpFlagResolver; import org.apache.fineract.cob.service.RetrieveIdService; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.launch.JobExecutionNotRunningException; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.NoSuchJobExecutionException; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.util.StopWatch; @Slf4j diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java index 05896b47859..e05797b4ca7 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java @@ -34,11 +34,11 @@ import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameter; import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.springbatch.SpringBatchJobConstants; -import org.springframework.batch.core.JobParameter; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.parameters.JobParameter; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.stereotype.Component; @Slf4j @@ -89,8 +89,8 @@ public Optional> getCustomJobParameterSet(StepExecution ste */ private Map getJobParameters(StepExecution stepExecution) { Map result = new HashMap<>(); - for (Map.Entry> entry : stepExecution.getJobParameters().getParameters().entrySet()) { - result.put(entry.getKey(), entry.getValue().getValue()); + for (JobParameter parameter : stepExecution.getJobParameters().parameters()) { + result.put(parameter.name(), parameter.value()); } return Collections.unmodifiableMap(result); } diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java index 4093608b7cd..5fe2e2f8cfe 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java @@ -30,10 +30,10 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java index bf2f9f90634..978b5650fc0 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java @@ -22,10 +22,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.domain.ActionContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; @Slf4j diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java index cfd853703bd..dc258451041 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java @@ -32,7 +32,7 @@ import org.springframework.batch.core.annotation.OnSkipInRead; import org.springframework.batch.core.annotation.OnSkipInWrite; import org.springframework.batch.core.annotation.OnWriteError; -import org.springframework.batch.item.Chunk; +import org.springframework.batch.infrastructure.item.Chunk; import org.springframework.lang.NonNull; import org.springframework.transaction.support.TransactionTemplate; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/COBExecutionListenerRunner.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/COBExecutionListenerRunner.java index 998da6e0e39..3bce6c6f462 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/COBExecutionListenerRunner.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/COBExecutionListenerRunner.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobExecutionListener; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.listener.JobExecutionListener; import org.springframework.context.ApplicationContext; public class COBExecutionListenerRunner implements JobExecutionListener { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java index 2079b31c8f8..0c79ccbca61 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java @@ -21,13 +21,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.core.listener.StepExecutionListener; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.scope.context.StepContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; /** diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBAfterJobListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBAfterJobListener.java index feb7cf319e2..620666211e6 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBAfterJobListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBAfterJobListener.java @@ -18,7 +18,7 @@ */ package org.apache.fineract.cob.listener; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; public interface FineractCOBAfterJobListener { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBBeforeJobListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBBeforeJobListener.java index 4261b05f882..a64702be479 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBBeforeJobListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/FineractCOBBeforeJobListener.java @@ -18,7 +18,7 @@ */ package org.apache.fineract.cob.listener; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; public interface FineractCOBBeforeJobListener { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java index 021ff8884f1..28531be854c 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java @@ -21,9 +21,9 @@ import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.core.listener.StepExecutionListener; +import org.springframework.batch.infrastructure.item.ExecutionContext; /** * {@link StepExecutionListener} to copy values from Job execution context into Step execution context. diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java index 9efdeb1d7e9..6d3e2262940 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java @@ -31,10 +31,10 @@ import org.apache.fineract.cob.resolver.BusinessDateResolver; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.annotation.AfterStep; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.infrastructure.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.ItemProcessor; import org.springframework.lang.NonNull; @RequiredArgsConstructor diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/BusinessDateResolver.java b/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/BusinessDateResolver.java index 7b57f89407e..4dc2067b15a 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/BusinessDateResolver.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/BusinessDateResolver.java @@ -20,7 +20,7 @@ import java.time.LocalDate; import org.apache.fineract.cob.COBConstant; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.step.StepExecution; public final class BusinessDateResolver { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/CatchUpFlagResolver.java b/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/CatchUpFlagResolver.java index 6ddf59df585..fa139e4dd34 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/CatchUpFlagResolver.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/resolver/CatchUpFlagResolver.java @@ -19,7 +19,7 @@ package org.apache.fineract.cob.resolver; import org.apache.fineract.cob.COBConstant; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.step.StepExecution; public final class CatchUpFlagResolver { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java b/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java index faae8819d74..2fb83f88167 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java @@ -30,8 +30,8 @@ import org.apache.fineract.cob.domain.LockOwner; import org.apache.fineract.cob.domain.LockingService; import org.apache.fineract.cob.resolver.CatchUpFlagResolver; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.lang.NonNull; @RequiredArgsConstructor diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java index cb996a93605..482e6ee35d9 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java @@ -34,11 +34,11 @@ import org.apache.fineract.cob.resolver.CatchUpFlagResolver; import org.apache.fineract.cob.service.RetrieveIdService; import org.apache.fineract.infrastructure.core.config.FineractProperties; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.item.ExecutionContext; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java index a93afd13d6b..9f438a89c4b 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java @@ -22,10 +22,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.domain.AccountLock; import org.apache.fineract.cob.service.AccountLockService; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; /** From 14812b5ecb888eceb96774e113eb3a97f695df36 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:18:12 +0530 Subject: [PATCH 04/63] FINERACT-2621: migrate fineract-security to Spring Framework 7 Signed-off-by: avinashvijayvargiya --- .../FineractJwtAuthenticationTokenConverter.java | 2 +- .../converter/FineractOidcJwtAuthenticationConverter.java | 2 +- .../security/filter/BusinessDateFilter.java | 2 +- .../security/filter/OidcTenantAwareFilter.java | 2 +- .../security/filter/TenantAwareAuthenticationFilter.java | 2 +- .../security/handler/OidcLogoutSuccessHandler.java | 8 ++++---- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractJwtAuthenticationTokenConverter.java b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractJwtAuthenticationTokenConverter.java index 900a8b3c6a5..d3fda15a38b 100644 --- a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractJwtAuthenticationTokenConverter.java +++ b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractJwtAuthenticationTokenConverter.java @@ -22,8 +22,8 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.security.data.FineractJwtAuthenticationToken; import org.apache.fineract.infrastructure.security.service.TenantAwareJpaPlatformUserDetailsService; +import org.jspecify.annotations.NonNull; import org.springframework.core.convert.converter.Converter; -import org.springframework.lang.NonNull; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; diff --git a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractOidcJwtAuthenticationConverter.java b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractOidcJwtAuthenticationConverter.java index 59da8c81816..45c95b97a13 100644 --- a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractOidcJwtAuthenticationConverter.java +++ b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/converter/FineractOidcJwtAuthenticationConverter.java @@ -24,8 +24,8 @@ import org.apache.fineract.infrastructure.security.exception.OidcUserNotFoundException; import org.apache.fineract.infrastructure.security.service.FineractOidcUserService; import org.apache.fineract.useradministration.domain.AppUser; +import org.jspecify.annotations.NonNull; import org.springframework.core.convert.converter.Converter; -import org.springframework.lang.NonNull; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.OAuth2Error; import org.springframework.security.oauth2.core.OAuth2ErrorCodes; diff --git a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/BusinessDateFilter.java b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/BusinessDateFilter.java index a9d9a5ee3d9..81fbeb07584 100644 --- a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/BusinessDateFilter.java +++ b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/BusinessDateFilter.java @@ -29,7 +29,7 @@ import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.infrastructure.businessdate.service.BusinessDateReadPlatformService; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.web.filter.OncePerRequestFilter; @RequiredArgsConstructor diff --git a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/OidcTenantAwareFilter.java b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/OidcTenantAwareFilter.java index 7b7c21719a7..231cafb8525 100644 --- a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/OidcTenantAwareFilter.java +++ b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/OidcTenantAwareFilter.java @@ -31,7 +31,7 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.security.service.AuthTenantDetailsService; import org.apache.fineract.infrastructure.security.service.TenantOidcConfigService; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareAuthenticationFilter.java b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareAuthenticationFilter.java index 133ba1b29f9..8fc101696ef 100644 --- a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareAuthenticationFilter.java +++ b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareAuthenticationFilter.java @@ -27,7 +27,7 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.security.service.AuthTenantDetailsService; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/handler/OidcLogoutSuccessHandler.java b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/handler/OidcLogoutSuccessHandler.java index c28bfa2a456..d6ccee34510 100644 --- a/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/handler/OidcLogoutSuccessHandler.java +++ b/fineract-security/src/main/java/org/apache/fineract/infrastructure/security/handler/OidcLogoutSuccessHandler.java @@ -68,16 +68,16 @@ private String buildLogoutUrl(String provider, FineractOidcUser oidcUser, HttpSe return switch (provider) { case "keycloak" -> - UriComponentsBuilder.fromHttpUrl(issuer).path("/protocol/openid-connect/logout").queryParam("id_token_hint", idToken) + UriComponentsBuilder.fromUriString(issuer).path("/protocol/openid-connect/logout").queryParam("id_token_hint", idToken) .queryParam("post_logout_redirect_uri", postLogoutUri).encode(StandardCharsets.UTF_8).toUriString(); - case "azure_ad" -> UriComponentsBuilder.fromHttpUrl(issuer).path("/oauth2/v2.0/logout") + case "azure_ad" -> UriComponentsBuilder.fromUriString(issuer).path("/oauth2/v2.0/logout") .queryParam("post_logout_redirect_uri", postLogoutUri).encode(StandardCharsets.UTF_8).toUriString(); - case "okta" -> UriComponentsBuilder.fromHttpUrl(issuer).path("/v1/logout").queryParam("id_token_hint", idToken) + case "okta" -> UriComponentsBuilder.fromUriString(issuer).path("/v1/logout").queryParam("id_token_hint", idToken) .queryParam("post_logout_redirect_uri", postLogoutUri).encode(StandardCharsets.UTF_8).toUriString(); - case "auth0" -> UriComponentsBuilder.fromHttpUrl(issuer).path("/v2/logout").queryParam("returnTo", postLogoutUri) + case "auth0" -> UriComponentsBuilder.fromUriString(issuer).path("/v2/logout").queryParam("returnTo", postLogoutUri) .encode(StandardCharsets.UTF_8).toUriString(); // "generic" and any unknown value: let Spring discover end_session_endpoint From da9e2e316ae6df0db2394e80d5d2b77d81fcca15 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:33:53 +0530 Subject: [PATCH 05/63] FINERACT-2621: migrate fineract-accounting to Spring Batch 6 Signed-off-by: avinashvijayvargiya --- .../UpdateTrialBalanceDetailsConfig.java | 6 +++--- .../UpdateTrialBalanceDetailsTasklet.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsConfig.java b/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsConfig.java index cb327cfb10e..2fbe59de054 100644 --- a/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsConfig.java +++ b/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsConfig.java @@ -24,11 +24,11 @@ import org.apache.fineract.accounting.journalentry.domain.JournalEntryRepository; import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java b/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java index e4718f3f580..e4cf5e6c857 100644 --- a/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java +++ b/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java @@ -30,10 +30,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.CollectionUtils; From dc0d88068079506d0d2c4714c58292454dff42a1 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:33:54 +0530 Subject: [PATCH 06/63] FINERACT-2621: migrate fineract-loan to Spring Batch 6 and Jackson 3 Signed-off-by: avinashvijayvargiya --- .../fineract/cob/loan/ContextAwareTaskDecorator.java | 2 +- .../service/DelinquencyReadPlatformService.java | 2 +- .../service/DelinquencyReadPlatformServiceImpl.java | 2 +- .../DelinquencyActionParseAndValidator.java | 2 +- .../interestpauses/data/InterestPauseRequestDto.java | 12 ++++++------ .../fineract/portfolio/loanaccount/domain/Loan.java | 2 +- .../LoanRepaymentScheduleProcessingWrapper.java | 2 +- .../AddPeriodicAccrualEntriesConfig.java | 6 +++--- .../AddPeriodicAccrualEntriesTasklet.java | 4 ++-- .../SetLoanDelinquencyTagsConfig.java | 6 +++--- .../SetLoanDelinquencyTagsTasklet.java | 4 ++-- .../UpdateLoanArrearsAgeingConfig.java | 6 +++--- .../UpdateLoanArrearsAgeingTasklet.java | 4 ++-- .../LoanAccrualActivityProcessingService.java | 2 +- .../service/LoanAccrualsProcessingService.java | 2 +- .../LoanBuyDownFeeAmortizationProcessingService.java | 2 +- ...pitalizedIncomeAmortizationProcessingService.java | 2 +- .../loanaccount/service/LoanReadPlatformService.java | 2 +- .../loanproduct/domain/LoanProductRepository.java | 2 +- 19 files changed, 33 insertions(+), 33 deletions(-) diff --git a/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java b/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java index 8cde28bbf33..e794d482019 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java +++ b/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java @@ -21,8 +21,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; +import org.jspecify.annotations.NonNull; import org.springframework.core.task.TaskDecorator; -import org.springframework.lang.NonNull; /** * Task decorator to ensure proper thread context propagation and cleanup diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformService.java index bad79f2e7b3..61a28853aa5 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformService.java @@ -28,7 +28,7 @@ import org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyAction; import org.apache.fineract.portfolio.loanaccount.data.CollectionData; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface DelinquencyReadPlatformService { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformServiceImpl.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformServiceImpl.java index a49b5dee7f5..cea927e2936 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformServiceImpl.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformServiceImpl.java @@ -67,7 +67,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct; import org.apache.fineract.portfolio.loanproduct.exception.LoanProductGeneralRuleException; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java index b3a3e0fec70..879296c2b4c 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java @@ -39,7 +39,7 @@ import org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyAction; import org.apache.fineract.portfolio.delinquency.helper.DelinquencyEffectivePauseHelper; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Component; @RequiredArgsConstructor diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/data/InterestPauseRequestDto.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/data/InterestPauseRequestDto.java index 6763c2b8711..a00a15e79b8 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/data/InterestPauseRequestDto.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/interestpauses/data/InterestPauseRequestDto.java @@ -18,12 +18,12 @@ */ package org.apache.fineract.portfolio.interestpauses.data; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.json.JsonMapper; @Getter @AllArgsConstructor @@ -45,16 +45,16 @@ public class InterestPauseRequestDto { public String toJson() { try { - return new ObjectMapper().writeValueAsString(this); - } catch (JsonProcessingException e) { + return new JsonMapper().writeValueAsString(this); + } catch (JacksonException e) { throw new IllegalArgumentException("Error serializing request to JSON", e); } } public static InterestPauseRequestDto fromJson(String json) { try { - return new ObjectMapper().readValue(json, InterestPauseRequestDto.class); - } catch (JsonProcessingException e) { + return new JsonMapper().readValue(json, InterestPauseRequestDto.class); + } catch (JacksonException e) { throw new IllegalArgumentException("Error deserializing request from JSON", e); } } 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 b15f753eb16..a9728ac0267 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 @@ -83,7 +83,7 @@ import org.apache.fineract.portfolio.rate.domain.Rate; import org.apache.fineract.portfolio.repaymentwithpostdatedchecks.domain.PostDatedChecks; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @Entity @Table(name = "m_loan", uniqueConstraints = { @UniqueConstraint(columnNames = { "account_no" }, name = "loan_account_no_UNIQUE"), diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java index a3972d84687..865fea3eced 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java @@ -28,7 +28,7 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; /** * A wrapper around loan schedule related data exposing needed behaviour by loan. diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesConfig.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesConfig.java index 49a0d29af78..68ac302bf43 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesConfig.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesConfig.java @@ -21,11 +21,11 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesTasklet.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesTasklet.java index 405b513522a..5a81d486019 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesTasklet.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentries/AddPeriodicAccrualEntriesTasklet.java @@ -25,10 +25,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsConfig.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsConfig.java index f15ead37acb..ee1cdbaed97 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsConfig.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsConfig.java @@ -25,11 +25,11 @@ import org.apache.fineract.portfolio.delinquency.service.DelinquencyWritePlatformService; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsTasklet.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsTasklet.java index ccf54f3dd00..2de29014357 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsTasklet.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/setloandelinquencytags/SetLoanDelinquencyTagsTasklet.java @@ -37,10 +37,10 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingConfig.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingConfig.java index 063285c1826..59d9ada6280 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingConfig.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingConfig.java @@ -20,11 +20,11 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingTasklet.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingTasklet.java index ce8fb3d88b5..718cd682720 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingTasklet.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/updateloanarrearsageing/UpdateLoanArrearsAgeingTasklet.java @@ -20,10 +20,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingService.java index aa4769f5f59..9ff430874b2 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingService.java @@ -21,7 +21,7 @@ import java.time.LocalDate; import org.apache.fineract.portfolio.loanaccount.domain.ChangedTransactionDetail; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.transaction.annotation.Transactional; public interface LoanAccrualActivityProcessingService { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingService.java index be7e05a4ae1..148dd95a594 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingService.java @@ -23,7 +23,7 @@ import org.apache.fineract.infrastructure.core.exception.MultiException; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface LoanAccrualsProcessingService { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingService.java index 56317052f49..67688d6d72b 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingService.java @@ -21,7 +21,7 @@ import java.time.LocalDate; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface LoanBuyDownFeeAmortizationProcessingService { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java index 4ba74b279d5..46ea70207a0 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java @@ -21,7 +21,7 @@ import java.time.LocalDate; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface LoanCapitalizedIncomeAmortizationProcessingService { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java index f372b117b30..bf488ebaae7 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -42,8 +42,8 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.Pageable; -import org.springframework.lang.NonNull; public interface LoanReadPlatformService { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRepository.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRepository.java index d7fb487ec94..c450756e36a 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRepository.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRepository.java @@ -23,11 +23,11 @@ import java.util.List; import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket; +import org.jspecify.annotations.NonNull; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.springframework.lang.NonNull; public interface LoanProductRepository extends JpaRepository, JpaSpecificationExecutor { From 2a5d5e87cbd2f6603a1e43701a6be924f193dce3 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:33:54 +0530 Subject: [PATCH 07/63] FINERACT-2621: switch fineract-investor to JSpecify annotations Signed-off-by: avinashvijayvargiya --- .../investor/cob/loan/LoanAccountOwnerTransferBusinessStep.java | 2 +- .../apache/fineract/investor/service/AccountingServiceImpl.java | 2 +- .../serializer/investor/InvestorBusinessEventSerializer.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/cob/loan/LoanAccountOwnerTransferBusinessStep.java b/fineract-investor/src/main/java/org/apache/fineract/investor/cob/loan/LoanAccountOwnerTransferBusinessStep.java index a0c275eed5a..59b7389ed14 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/cob/loan/LoanAccountOwnerTransferBusinessStep.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/cob/loan/LoanAccountOwnerTransferBusinessStep.java @@ -47,9 +47,9 @@ import org.apache.fineract.portfolio.loanaccount.service.LoanCapitalizedIncomeAmortizationProcessingService; import org.apache.fineract.portfolio.loanaccount.service.LoanJournalEntryPoster; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.jspecify.annotations.Nullable; import org.springframework.context.annotation.Conditional; import org.springframework.data.domain.Sort; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; @Component diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java b/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java index 98dcc227356..b839dbbcb03 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java @@ -44,7 +44,7 @@ import org.apache.fineract.portfolio.PortfolioProductType; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; @Service diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/service/serialization/serializer/investor/InvestorBusinessEventSerializer.java b/fineract-investor/src/main/java/org/apache/fineract/investor/service/serialization/serializer/investor/InvestorBusinessEventSerializer.java index 2d3378f9579..baf7b15a587 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/service/serialization/serializer/investor/InvestorBusinessEventSerializer.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/service/serialization/serializer/investor/InvestorBusinessEventSerializer.java @@ -48,7 +48,7 @@ import org.apache.fineract.investor.service.ExternalAssetOwnersReadService; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Component; @Component From 4c7cf55659f944927753f31fabca500ebd76b33b Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:42:21 +0530 Subject: [PATCH 08/63] FINERACT-2621: migrate fineract-working-capital-loan to Spring Batch 6 Signed-off-by: avinashvijayvargiya --- .../cob/internal/InternalTestCobJobAfterListener.java | 2 +- .../cob/internal/InternalTestCobJobBeforeListener.java | 2 +- .../AbstractWorkingCapitalLoanCOBWorkerItemWriter.java | 6 +++--- ...gCapitalLoanCOBCustomJobParametersResolverTasklet.java | 6 +++--- .../WorkingCapitalLoanCOBManagerConfiguration.java | 8 ++++---- .../WorkingCapitalLoanCOBPartitioner.java | 8 ++++---- .../WorkingCapitalLoanCOBWorkerConfiguration.java | 2 +- .../WorkingCapitalLoanCOBWorkerItemProcessor.java | 2 +- .../WorkingCapitalLoanCOBWorkerItemReader.java | 8 ++++---- .../WorkingCapitalLoanInlineCOBWorkerItemProcessor.java | 2 +- .../DefaultProjectedAmortizationScheduleCalculator.java | 2 +- .../calc/ProjectedAmortizationScheduleCalculator.java | 2 +- .../ProjectedAmortizationScheduleModelParserService.java | 4 ++-- ...tedAmortizationScheduleModelParserServiceGsonImpl.java | 4 ++-- .../ProjectedAmortizationScheduleRepositoryWrapper.java | 2 +- ...rojectedAmortizationScheduleRepositoryWrapperImpl.java | 2 +- ...ngCapitalLoanAmortizationScheduleWriteServiceImpl.java | 2 +- ...orkingCapitalAdvancedPaymentAllocationsJsonParser.java | 2 +- 18 files changed, 33 insertions(+), 33 deletions(-) diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobAfterListener.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobAfterListener.java index 519f73993e8..2de10febad7 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobAfterListener.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobAfterListener.java @@ -23,7 +23,7 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.cob.listener.FineractCOBAfterJobListener; import org.apache.fineract.infrastructure.core.boot.FineractProfiles; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobBeforeListener.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobBeforeListener.java index 25fefe9379c..2b4ecdd6ddd 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobBeforeListener.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/internal/InternalTestCobJobBeforeListener.java @@ -24,7 +24,7 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.cob.listener.FineractCOBBeforeJobListener; import org.apache.fineract.infrastructure.core.boot.FineractProfiles; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/AbstractWorkingCapitalLoanCOBWorkerItemWriter.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/AbstractWorkingCapitalLoanCOBWorkerItemWriter.java index 7c71fa59dcb..5a8d17639de 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/AbstractWorkingCapitalLoanCOBWorkerItemWriter.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/AbstractWorkingCapitalLoanCOBWorkerItemWriter.java @@ -25,8 +25,8 @@ import org.apache.fineract.cob.domain.LockingService; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; -import org.springframework.batch.item.Chunk; -import org.springframework.batch.item.data.RepositoryItemWriter; +import org.springframework.batch.infrastructure.item.Chunk; +import org.springframework.batch.infrastructure.item.data.RepositoryItemWriter; import org.springframework.data.repository.CrudRepository; @Slf4j @@ -36,8 +36,8 @@ public abstract class AbstractWorkingCapitalLoanCOBWorkerItemWriter extends Repo public AbstractWorkingCapitalLoanCOBWorkerItemWriter(LockingService loanLockingService, CrudRepository repository) { + super(repository); this.loanLockingService = loanLockingService; - setRepository(repository); } @Override diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBCustomJobParametersResolverTasklet.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBCustomJobParametersResolverTasklet.java index 32622c13d34..62384c660da 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBCustomJobParametersResolverTasklet.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBCustomJobParametersResolverTasklet.java @@ -23,11 +23,11 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.cob.common.CustomJobParameterResolver; -import org.springframework.batch.core.StepContribution; +import org.jspecify.annotations.Nullable; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.lang.Nullable; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @RequiredArgsConstructor public class WorkingCapitalLoanCOBCustomJobParametersResolverTasklet implements Tasklet { diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBManagerConfiguration.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBManagerConfiguration.java index 30312cdea86..c2dea2ec5aa 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBManagerConfiguration.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBManagerConfiguration.java @@ -34,14 +34,14 @@ import org.apache.fineract.cob.listener.COBExecutionListenerRunner; import org.apache.fineract.cob.service.AccountLockService; import org.apache.fineract.infrastructure.springbatch.PropertyService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.launch.JobOperator; -import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.integration.config.annotation.EnableBatchIntegration; import org.springframework.batch.integration.partition.RemotePartitioningManagerStepBuilderFactory; diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBPartitioner.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBPartitioner.java index ed03b523adf..05043fc1215 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBPartitioner.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBPartitioner.java @@ -29,11 +29,11 @@ import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.cob.workingcapitalloan.businessstep.WorkingCapitalLoanCOBBusinessStep; import org.apache.fineract.infrastructure.springbatch.PropertyService; -import org.springframework.batch.core.StepExecution; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.launch.JobOperator; -import org.springframework.batch.core.partition.support.Partitioner; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.lang.NonNull; +import org.springframework.batch.core.partition.Partitioner; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; @Slf4j public class WorkingCapitalLoanCOBPartitioner extends CommonPartitioner implements Partitioner { diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java index 978fd6db012..e938baa9385 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java @@ -35,8 +35,8 @@ import org.apache.fineract.infrastructure.springbatch.PropertyService; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; -import org.springframework.batch.core.Step; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.SimpleStepBuilder; import org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilderFactory; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java index 2819e8862a4..d54569646a0 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java @@ -19,8 +19,8 @@ package org.apache.fineract.cob.workingcapitalloan; import org.apache.fineract.cob.COBBusinessStepService; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.step.StepExecution; public class WorkingCapitalLoanCOBWorkerItemProcessor extends AbstractWorkingCapitalLoanCOBWorkerItemProcessor { diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemReader.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemReader.java index 103e6af89c9..1c7fd066684 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemReader.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemReader.java @@ -28,11 +28,11 @@ import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; -import org.springframework.batch.core.StepExecution; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.springframework.batch.core.annotation.BeforeStep; -import org.springframework.batch.item.ItemReader; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ItemReader; @Slf4j @RequiredArgsConstructor diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java index ef5756c82c0..4e085e8be6e 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java @@ -19,8 +19,8 @@ package org.apache.fineract.cob.workingcapitalloan; import org.apache.fineract.cob.COBBusinessStepService; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.step.StepExecution; public class WorkingCapitalLoanInlineCOBWorkerItemProcessor extends AbstractWorkingCapitalLoanCOBWorkerItemProcessor { diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/DefaultProjectedAmortizationScheduleCalculator.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/DefaultProjectedAmortizationScheduleCalculator.java index b4b6e7cb091..b4058a32df1 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/DefaultProjectedAmortizationScheduleCalculator.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/DefaultProjectedAmortizationScheduleCalculator.java @@ -23,7 +23,7 @@ import java.time.LocalDate; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.monetary.data.CurrencyData; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Component; /** diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/ProjectedAmortizationScheduleCalculator.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/ProjectedAmortizationScheduleCalculator.java index 3012b6ee099..b740c2e6028 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/ProjectedAmortizationScheduleCalculator.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/calc/ProjectedAmortizationScheduleCalculator.java @@ -22,7 +22,7 @@ import java.math.MathContext; import java.time.LocalDate; import org.apache.fineract.organisation.monetary.data.CurrencyData; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; /** * Calculator service for Working Capital loan projected amortization schedule. Analogous to {@code EMICalculator} for diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserService.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserService.java index b983065213c..4e147057ae9 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserService.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserService.java @@ -21,8 +21,8 @@ import java.math.MathContext; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.workingcapitalloan.calc.ProjectedAmortizationScheduleModel; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; public interface ProjectedAmortizationScheduleModelParserService { diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserServiceGsonImpl.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserServiceGsonImpl.java index a905b5dc16f..ce23dc49228 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserServiceGsonImpl.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleModelParserServiceGsonImpl.java @@ -33,8 +33,8 @@ import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.workingcapitalloan.calc.ProjectedAmortizationScheduleModel; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapper.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapper.java index fa2fc4c4e99..085f2a64a01 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapper.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapper.java @@ -23,7 +23,7 @@ import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.workingcapitalloan.calc.ProjectedAmortizationScheduleModel; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface ProjectedAmortizationScheduleRepositoryWrapper { diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapperImpl.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapperImpl.java index e4f54607494..72b77ffe036 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapperImpl.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/ProjectedAmortizationScheduleRepositoryWrapperImpl.java @@ -28,7 +28,7 @@ import org.apache.fineract.portfolio.workingcapitalloan.domain.ProjectedAmortizationLoanModel; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; import org.apache.fineract.portfolio.workingcapitalloan.repository.ProjectedAmortizationLoanModelRepository; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanAmortizationScheduleWriteServiceImpl.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanAmortizationScheduleWriteServiceImpl.java index 28cc34226a0..10e73691662 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanAmortizationScheduleWriteServiceImpl.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanAmortizationScheduleWriteServiceImpl.java @@ -36,7 +36,7 @@ import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoanDisbursementDetails; import org.apache.fineract.portfolio.workingcapitalloan.exception.WorkingCapitalLoanNotFoundException; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/domain/WorkingCapitalAdvancedPaymentAllocationsJsonParser.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/domain/WorkingCapitalAdvancedPaymentAllocationsJsonParser.java index 52d197966b5..07d01d35d54 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/domain/WorkingCapitalAdvancedPaymentAllocationsJsonParser.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/domain/WorkingCapitalAdvancedPaymentAllocationsJsonParser.java @@ -28,7 +28,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationTransactionType; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; @Service From b4d020bf91b16a7ae3966021a1b49e3f9051d295 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:42:22 +0530 Subject: [PATCH 09/63] FINERACT-2621: switch fineract-progressive-loan to JSpecify annotations Signed-off-by: avinashvijayvargiya --- .../domain/transactionprocessor/impl/ChangeOperation.java | 2 +- ...ogressiveLoanInterestScheduleModelParserServiceGsonImpl.java | 2 +- .../fineract/portfolio/loanproduct/calc/data/InterestRate.java | 2 +- .../domain/AdvancedPaymentAllocationsJsonParser.java | 2 +- .../loanproduct/domain/CreditAllocationsJsonParser.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/ChangeOperation.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/ChangeOperation.java index 9042dfec10d..2abc412fdfc 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/ChangeOperation.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/ChangeOperation.java @@ -27,7 +27,7 @@ import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData; import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @Getter public class ChangeOperation implements Comparable { diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanInterestScheduleModelParserServiceGsonImpl.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanInterestScheduleModelParserServiceGsonImpl.java index 75711508ea0..2514c193cee 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanInterestScheduleModelParserServiceGsonImpl.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanInterestScheduleModelParserServiceGsonImpl.java @@ -37,7 +37,7 @@ import org.apache.fineract.portfolio.loanproduct.calc.data.ProgressiveLoanInterestScheduleModel; import org.apache.fineract.portfolio.loanproduct.calc.data.RepaymentPeriod; import org.apache.fineract.portfolio.loanproduct.domain.ILoanConfigurationDetails; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @Slf4j @RequiredArgsConstructor diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/InterestRate.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/InterestRate.java index 382aacc1878..f0c8573d8e5 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/InterestRate.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/InterestRate.java @@ -20,7 +20,7 @@ import java.math.BigDecimal; import java.time.LocalDate; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public record InterestRate(// LocalDate effectiveFrom, // diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParser.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParser.java index 035939afd7b..38ecedfd3fc 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParser.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParser.java @@ -27,7 +27,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.tuple.Pair; import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; @Service diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationsJsonParser.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationsJsonParser.java index bab9a2e327f..e6abd0618c9 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationsJsonParser.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationsJsonParser.java @@ -27,7 +27,7 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.tuple.Pair; import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; @Service From a5e599b9c99e39e45cbd1657e0de96f127d0f9c6 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:42:22 +0530 Subject: [PATCH 10/63] FINERACT-2621: switch fineract-savings to JSpecify annotations Signed-off-by: avinashvijayvargiya --- .../service/SavingsAccountInterestPostingServiceImpl.java | 2 +- .../service/search/SavingsAccountTransactionSearchService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountInterestPostingServiceImpl.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountInterestPostingServiceImpl.java index 61e90337c2e..3682364b1a1 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountInterestPostingServiceImpl.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountInterestPostingServiceImpl.java @@ -48,7 +48,7 @@ import org.apache.fineract.portfolio.savings.domain.interest.PostingPeriod; import org.apache.fineract.portfolio.tax.data.TaxComponentData; import org.apache.fineract.portfolio.tax.service.TaxUtils; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @RequiredArgsConstructor public class SavingsAccountInterestPostingServiceImpl implements SavingsAccountInterestPostingService { diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionSearchService.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionSearchService.java index d55a3278af0..7bd14a45c5a 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionSearchService.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionSearchService.java @@ -23,8 +23,8 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; import org.apache.fineract.portfolio.search.data.AdvancedQueryRequest; import org.apache.fineract.portfolio.search.data.TransactionSearchRequest; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.Page; -import org.springframework.lang.NonNull; public interface SavingsAccountTransactionSearchService { From 95ee4724d0ed792c12b64f48749692d145395fb3 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:51:20 +0530 Subject: [PATCH 11/63] FINERACT-2621: migrate fineract-core to Jackson 3 and JSpecify Signed-off-by: avinashvijayvargiya --- .../batch/service/BatchApiServiceImpl.java | 2 +- .../jobs/PurgeProcessedCommandsConfig.java | 2 +- .../jobs/PurgeProcessedCommandsTasklet.java | 2 +- .../commands/service/CommandSourceService.java | 2 +- .../core/filters/IdempotencyStoreFilter.java | 2 +- .../ExtendedDataSourceTransactionManager.java | 2 +- .../infrastructure/core/service/DateUtils.java | 2 +- .../infrastructure/core/service/MathUtil.java | 2 +- .../database/DatabaseSpecificSQLGenerator.java | 2 +- .../core/service/database/JavaType.java | 2 +- .../core/service/database/JdbcJavaType.java | 2 +- .../core/service/database/SqlOperator.java | 2 +- .../service/DatatableReadService.java | 2 +- .../BusinessEventNotifierServiceImpl.java | 2 +- .../jobs/PurgeExternalEventsConfig.java | 2 +- .../jobs/PurgeExternalEventsTasklet.java | 2 +- .../jobs/SendAsynchronousEventsConfig.java | 2 +- .../jobs/SendAsynchronousEventsTasklet.java | 2 +- .../service/InternalExternalEventService.java | 18 ++++++++---------- .../service/SchedulerJobRunnerReadService.java | 8 ++++---- .../portfolio/search/service/SearchUtil.java | 2 +- .../context/JobSynchronizationManager.java | 2 +- .../context/StepSynchronizationManager.java | 2 +- 23 files changed, 33 insertions(+), 35 deletions(-) diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java index 04330e622a8..200e0dbd0d7 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java @@ -59,10 +59,10 @@ import org.apache.fineract.infrastructure.core.filters.BatchFilter; import org.apache.fineract.infrastructure.core.filters.BatchRequestPreprocessor; import org.apache.fineract.infrastructure.core.persistence.ExtendedJpaTransactionManager; +import org.jspecify.annotations.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.dao.NonTransientDataAccessException; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionException; diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java index 56f53755e3f..194c0cbf957 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsConfig.java @@ -21,10 +21,10 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.StepName; import org.springframework.batch.core.job.Job; -import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java index 11b1d747bcb..420791a43b8 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTasklet.java @@ -25,8 +25,8 @@ import org.apache.fineract.commands.domain.CommandSourceRepository; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.service.DateUtils; -import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java index 7127be695f9..0b560528706 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java @@ -41,7 +41,7 @@ import org.apache.fineract.infrastructure.core.exception.IdempotentCommandProcessUnderProcessingException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/filters/IdempotencyStoreFilter.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/filters/IdempotencyStoreFilter.java index 675a27bb49a..1ff207c46d4 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/filters/IdempotencyStoreFilter.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/filters/IdempotencyStoreFilter.java @@ -32,7 +32,7 @@ import org.apache.fineract.commands.service.SynchronousCommandProcessingService; import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.core.domain.FineractRequestContextHolder; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingResponseWrapper; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/persistence/ExtendedDataSourceTransactionManager.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/persistence/ExtendedDataSourceTransactionManager.java index 439bb6fb143..57fad2a5c9c 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/persistence/ExtendedDataSourceTransactionManager.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/persistence/ExtendedDataSourceTransactionManager.java @@ -22,8 +22,8 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import lombok.Getter; +import org.jspecify.annotations.NonNull; import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.lang.NonNull; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.DefaultTransactionStatus; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java index 3ee0af288da..8bc1d911b95 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java @@ -43,7 +43,7 @@ import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.serialization.JsonParserHelper; import org.apache.logging.log4j.util.Strings; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public final class DateUtils { diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java index bf56d652adb..23a352a319a 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MathUtil.java @@ -23,7 +23,7 @@ import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.organisation.monetary.domain.MoneyHelper; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public final class MathUtil { diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java index 9d66e68216a..59cf52d95a6 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java @@ -31,10 +31,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData; import org.apache.logging.log4j.util.Strings; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.Sort; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @Component diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JavaType.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JavaType.java index 193a0c99c72..86017123b24 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JavaType.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JavaType.java @@ -40,8 +40,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException; import org.apache.fineract.organisation.monetary.domain.MoneyHelper; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.Persistable; -import org.springframework.lang.NonNull; public enum JavaType { diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JdbcJavaType.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JdbcJavaType.java index 493bd7b640e..75d95f1068b 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JdbcJavaType.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/JdbcJavaType.java @@ -22,7 +22,7 @@ import java.io.Serializable; import java.sql.JDBCType; import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public enum JdbcJavaType { diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/SqlOperator.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/SqlOperator.java index ec33b9c6db2..550a9acab78 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/SqlOperator.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/SqlOperator.java @@ -26,7 +26,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @AllArgsConstructor @Getter diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadService.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadService.java index 0956276431a..5dcaf4a6940 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadService.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadService.java @@ -26,8 +26,8 @@ import org.apache.fineract.infrastructure.dataqueries.data.EntityTables; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; import org.apache.fineract.portfolio.search.data.AdvancedQueryData; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.Page; -import org.springframework.lang.NonNull; public interface DatatableReadService { diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java index be44e057329..4edbc559ccb 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java @@ -35,8 +35,8 @@ import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.NoExternalEvent; import org.apache.fineract.infrastructure.event.external.service.ExternalEventService; +import org.jspecify.annotations.NonNull; import org.springframework.beans.factory.InitializingBean; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionExecution; import org.springframework.transaction.TransactionExecutionListener; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java index de85894aa5d..ead312cec93 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsConfig.java @@ -20,10 +20,10 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.springframework.batch.core.job.Job; -import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java index 061e21a4fe5..d70b83241c0 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTasklet.java @@ -25,8 +25,8 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.event.external.repository.ExternalEventRepository; import org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEventStatus; -import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java index 89f59886b12..8cf1c2abf63 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsConfig.java @@ -21,10 +21,10 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.StepName; import org.springframework.batch.core.job.Job; -import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java index 501aa43eed5..da9a31f6f5b 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java @@ -46,8 +46,8 @@ import org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEventView; import org.apache.fineract.infrastructure.event.external.service.message.MessageFactory; import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter; -import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/service/InternalExternalEventService.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/service/InternalExternalEventService.java index 722919c0520..13daab2bfff 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/service/InternalExternalEventService.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/service/InternalExternalEventService.java @@ -18,9 +18,6 @@ */ package org.apache.fineract.infrastructure.event.external.service; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import java.lang.reflect.InvocationTargetException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -37,6 +34,9 @@ import org.springframework.context.annotation.Profile; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Service @Profile(FineractProfiles.TEST) @@ -76,8 +76,7 @@ public List getAllExternalEvents(String idempotencyKey, S try { return convertToReadableFormat(externalEvents); - } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException - | JsonProcessingException e) { + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException | JacksonException e) { throw new RuntimeException("Error while converting external events to readable format", e); } } @@ -98,8 +97,8 @@ private Specification hasAggregateRootId(Long aggregateRootId) { return (root, query, cb) -> cb.equal(root.get("aggregateRootId"), aggregateRootId); } - private List convertToReadableFormat(List externalEvents) throws ClassNotFoundException, - NoSuchMethodException, InvocationTargetException, IllegalAccessException, JsonProcessingException { + private List convertToReadableFormat(List externalEvents) + throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, JacksonException { var eventMessages = new ArrayList(); for (var externalEvent : externalEvents) { var payLoadClass = Class.forName(externalEvent.getSchema()); @@ -138,8 +137,7 @@ private List convertToReadableFormat(List } private ExternalEventResponse retrieveBulkMessage(BulkMessageItemV1 messageItem, ExternalEvent externalEvent) - throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException, - JsonProcessingException { + throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException, JacksonException { var messageBulkMessagePayLoad = Class.forName(messageItem.getDataschema()); var methodForPayLoad = messageBulkMessagePayLoad.getMethod("fromByteBuffer", ByteBuffer.class); var payLoadBulkItem = methodForPayLoad.invoke(null, messageItem.getData()); @@ -148,7 +146,7 @@ private ExternalEventResponse retrieveBulkMessage(BulkMessageItemV1 messageItem, externalEvent.getSchema(), externalEvent.getAggregateRootId()); } - private Map toJsonMap(String json) throws JsonProcessingException { + private Map toJsonMap(String json) throws JacksonException { return mapper.readValue(json, new TypeReference<>() {}); } diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadService.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadService.java index e8e0710a81c..be620991ab8 100755 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadService.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadService.java @@ -24,19 +24,19 @@ import org.apache.fineract.infrastructure.core.service.SearchParameters; import org.apache.fineract.infrastructure.jobs.data.JobDetailData; import org.apache.fineract.infrastructure.jobs.data.JobDetailHistoryData; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface SchedulerJobRunnerReadService { List findAllJobDetails(); - JobDetailData retrieveOne(@NonNull IdTypeResolver.IdType idType, String identifier); + JobDetailData retrieveOne(IdTypeResolver.@NonNull IdType idType, String identifier); - Page retrieveJobHistory(@NonNull IdTypeResolver.IdType idType, String identifier, + Page retrieveJobHistory(IdTypeResolver.@NonNull IdType idType, String identifier, SearchParameters searchParameters); @NonNull - Long retrieveId(@NonNull IdTypeResolver.IdType idType, String identifier); + Long retrieveId(IdTypeResolver.@NonNull IdType idType, String identifier); boolean isUpdatesAllowed(); } diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/search/service/SearchUtil.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/search/service/SearchUtil.java index 0107308eb6a..8097bcc4a00 100644 --- a/fineract-core/src/main/java/org/apache/fineract/portfolio/search/service/SearchUtil.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/search/service/SearchUtil.java @@ -54,8 +54,8 @@ import org.apache.fineract.infrastructure.security.service.SqlValidator; import org.apache.fineract.portfolio.search.data.ColumnFilterData; import org.apache.fineract.portfolio.search.data.FilterData; +import org.jspecify.annotations.NonNull; import org.springframework.jdbc.support.rowset.SqlRowSet; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java index 3db9989c126..6d56b746bd0 100644 --- a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java +++ b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java @@ -19,11 +19,11 @@ package org.springframework.batch.core.scope.context; import org.apache.fineract.infrastructure.jobs.TenantAwareEqualsHashCodeAdvice; +import org.jspecify.annotations.Nullable; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.job.JobInstance; import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.cglib.proxy.Enhancer; -import org.springframework.lang.Nullable; // Temporary solution until spring-batch fixes the concurrency issue // https://github.com/spring-projects/spring-batch/issues/4774 diff --git a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java index e9d003dec07..07fca6e4edf 100644 --- a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java +++ b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java @@ -19,10 +19,10 @@ package org.springframework.batch.core.scope.context; import org.apache.fineract.infrastructure.jobs.TenantAwareEqualsHashCodeAdvice; +import org.jspecify.annotations.Nullable; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.step.StepExecution; import org.springframework.cglib.proxy.Enhancer; -import org.springframework.lang.Nullable; // Temporary solution until spring-batch fixes the concurrency issue // https://github.com/spring-projects/spring-batch/issues/4774 From 7caed5be1450fbfe5020b03ff787cdca71d4288e Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:51:20 +0530 Subject: [PATCH 12/63] FINERACT-2621: switch fineract-cob to JSpecify annotations Signed-off-by: avinashvijayvargiya --- .../org/apache/fineract/cob/COBBusinessStepService.java | 2 +- .../org/apache/fineract/cob/COBBusinessStepServiceImpl.java | 2 +- .../org/apache/fineract/cob/common/CommonPartitioner.java | 2 +- .../fineract/cob/common/CustomJobParameterResolver.java | 2 +- .../apache/fineract/cob/common/InitialisationTasklet.java | 4 ++-- .../org/apache/fineract/cob/common/ResetContextTasklet.java | 4 ++-- .../fineract/cob/listener/AbstractLoanItemListener.java | 2 +- .../apache/fineract/cob/listener/CobWorkerStepListener.java | 6 +++--- .../cob/listener/JobExecutionContextCopyListener.java | 2 +- .../fineract/cob/processor/AbstractItemProcessor.java | 4 ++-- .../cob/service/BeforeStepLockingItemReaderHelper.java | 2 +- .../apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java | 4 ++-- .../cob/tasklet/UnlockProcessedAccountsTasklet.java | 4 ++-- 13 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java b/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java index 2b815260cbd..6ec059bed24 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java @@ -22,7 +22,7 @@ import java.util.TreeMap; import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface COBBusinessStepService { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java b/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java index 74cf32105ed..a4c9031f31a 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java @@ -36,9 +36,9 @@ import org.apache.fineract.infrastructure.core.domain.ActionContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; +import org.jspecify.annotations.NonNull; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.ApplicationContext; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; @Service diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java index 4fec6151b88..312da4999d9 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java @@ -33,10 +33,10 @@ import org.apache.fineract.cob.resolver.BusinessDateResolver; import org.apache.fineract.cob.resolver.CatchUpFlagResolver; import org.apache.fineract.cob.service.RetrieveIdService; -import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.launch.JobExecutionNotRunningException; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.NoSuchJobExecutionException; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.util.StopWatch; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java index e05797b4ca7..eebe285ad24 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CustomJobParameterResolver.java @@ -35,9 +35,9 @@ import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.springbatch.SpringBatchJobConstants; import org.springframework.batch.core.job.parameters.JobParameter; +import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.StepExecution; -import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.stereotype.Component; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java index 5fe2e2f8cfe..cc04e0500ea 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java @@ -30,11 +30,11 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper; -import org.springframework.batch.core.step.StepContribution; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java index 978b5650fc0..6469ba580e0 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/ResetContextTasklet.java @@ -22,11 +22,11 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.domain.ActionContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; -import org.springframework.batch.core.step.StepContribution; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; @Slf4j @RequiredArgsConstructor diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java index dc258451041..da8cd2ff7a0 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java @@ -26,6 +26,7 @@ import org.apache.fineract.cob.exceptions.LockedReadException; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.infrastructure.core.serialization.ThrowableSerialization; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.annotation.OnProcessError; import org.springframework.batch.core.annotation.OnReadError; import org.springframework.batch.core.annotation.OnSkipInProcess; @@ -33,7 +34,6 @@ import org.springframework.batch.core.annotation.OnSkipInWrite; import org.springframework.batch.core.annotation.OnWriteError; import org.springframework.batch.infrastructure.item.Chunk; -import org.springframework.lang.NonNull; import org.springframework.transaction.support.TransactionTemplate; @Slf4j diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java index 0c79ccbca61..916072e2dae 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/CobWorkerStepListener.java @@ -20,15 +20,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.step.StepContribution; -import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.listener.StepExecutionListener; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.scope.context.StepContext; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; /** * Runs COB worker setup and teardown without a {@link org.springframework.batch.core.job.flow.FlowStep}. A flow uses diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java index 28531be854c..e9545f38a7f 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListener.java @@ -21,8 +21,8 @@ import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; -import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.listener.StepExecutionListener; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; /** diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java index 6d3e2262940..e30829ceddd 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java @@ -30,12 +30,12 @@ import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.cob.resolver.BusinessDateResolver; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.annotation.AfterStep; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.batch.infrastructure.item.ItemProcessor; -import org.springframework.lang.NonNull; @RequiredArgsConstructor public abstract class AbstractItemProcessor> implements ItemProcessor { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java b/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java index 2fb83f88167..efd165b075e 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/service/BeforeStepLockingItemReaderHelper.java @@ -30,9 +30,9 @@ import org.apache.fineract.cob.domain.LockOwner; import org.apache.fineract.cob.domain.LockingService; import org.apache.fineract.cob.resolver.CatchUpFlagResolver; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; -import org.springframework.lang.NonNull; @RequiredArgsConstructor public class BeforeStepLockingItemReaderHelper { diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java index 482e6ee35d9..3c54c6c60d9 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/ApplyCommonLockTasklet.java @@ -34,12 +34,12 @@ import org.apache.fineract.cob.resolver.CatchUpFlagResolver; import org.apache.fineract.cob.service.RetrieveIdService; import org.apache.fineract.infrastructure.core.config.FineractProperties; -import org.springframework.batch.core.step.StepContribution; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java index 9f438a89c4b..0c0d6febd9e 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/tasklet/UnlockProcessedAccountsTasklet.java @@ -22,11 +22,11 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.domain.AccountLock; import org.apache.fineract.cob.service.AccountLockService; -import org.springframework.batch.core.step.StepContribution; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; /** * Tasklet that unlocks accounts which were successfully processed during COB but whose locks were not removed. From 2fc1ffbf6551988db32ed430365fa5918f260d29 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 6 Jul 2026 19:51:21 +0530 Subject: [PATCH 13/63] FINERACT-2621: migrate fineract-command-jdbc to Jackson 3 Signed-off-by: avinashvijayvargiya --- fineract-command-jdbc/dependencies.gradle | 2 +- .../command/jdbc/store/JdbcCommandStore.java | 2 +- .../store/converter/JsonNodeReadingConverter.java | 4 ++-- .../store/converter/JsonNodeWritingConverter.java | 4 ++-- .../command/jdbc/store/domain/CommandEntity.java | 2 +- .../jdbc/store/mapping/CommandJsonMapper.java | 12 ++++++------ 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fineract-command-jdbc/dependencies.gradle b/fineract-command-jdbc/dependencies.gradle index 0154f378e32..2ce3c9269e0 100644 --- a/fineract-command-jdbc/dependencies.gradle +++ b/fineract-command-jdbc/dependencies.gradle @@ -27,7 +27,7 @@ dependencies { 'org.springframework.boot:spring-boot-starter-data-jdbc', 'io.github.resilience4j:resilience4j-spring-boot4', - 'com.fasterxml.jackson.core:jackson-databind', + 'tools.jackson.core:jackson-databind', 'org.liquibase:liquibase-core', diff --git a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/JdbcCommandStore.java b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/JdbcCommandStore.java index 929fbd423ed..c4d9adcc8fd 100644 --- a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/JdbcCommandStore.java +++ b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/JdbcCommandStore.java @@ -23,7 +23,6 @@ import static org.apache.fineract.command.core.CommandConstants.COMMAND_JSON_CLASS_ATTRIBUTE; import static org.apache.fineract.command.core.CommandState.UNKNOWN; -import com.fasterxml.jackson.databind.ObjectMapper; import io.github.resilience4j.retry.annotation.Retry; import java.io.IOException; import java.nio.file.Path; @@ -44,6 +43,7 @@ import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import tools.jackson.databind.ObjectMapper; @Slf4j @RequiredArgsConstructor diff --git a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeReadingConverter.java b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeReadingConverter.java index 2cd7e738ec4..bd9eeaf62e3 100644 --- a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeReadingConverter.java +++ b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeReadingConverter.java @@ -18,13 +18,13 @@ */ package org.apache.fineract.command.jdbc.store.converter; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; import org.springframework.stereotype.Component; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; @Component @RequiredArgsConstructor diff --git a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeWritingConverter.java b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeWritingConverter.java index 25ff040245e..ae4c23447e3 100644 --- a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeWritingConverter.java +++ b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/converter/JsonNodeWritingConverter.java @@ -18,13 +18,13 @@ */ package org.apache.fineract.command.jdbc.store.converter; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.WritingConverter; import org.springframework.stereotype.Component; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; @Component @RequiredArgsConstructor diff --git a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/domain/CommandEntity.java b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/domain/CommandEntity.java index b9e5929a54f..c25c79baa74 100644 --- a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/domain/CommandEntity.java +++ b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/domain/CommandEntity.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.command.jdbc.store.domain; -import com.fasterxml.jackson.databind.JsonNode; import java.io.Serial; import java.io.Serializable; import java.time.Instant; @@ -29,6 +28,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; +import tools.jackson.databind.JsonNode; @Getter @Setter diff --git a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/mapping/CommandJsonMapper.java b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/mapping/CommandJsonMapper.java index f2fa378b9ce..dfcd2103836 100644 --- a/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/mapping/CommandJsonMapper.java +++ b/fineract-command-jdbc/src/main/java/org/apache/fineract/command/jdbc/store/mapping/CommandJsonMapper.java @@ -20,13 +20,13 @@ import static org.apache.fineract.command.core.CommandConstants.COMMAND_JSON_CLASS_ATTRIBUTE; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; @Slf4j @RequiredArgsConstructor @@ -41,7 +41,7 @@ public T map(JsonNode source) { return null; } - var canonicalName = source.get(COMMAND_JSON_CLASS_ATTRIBUTE).asText(); + var canonicalName = source.get(COMMAND_JSON_CLASS_ATTRIBUTE).asString(); try { return (T) mapper.convertValue(source, Class.forName(canonicalName)); @@ -59,7 +59,7 @@ public JsonNode map(Object source) { var json = mapper.convertValue(source, ObjectNode.class); - json.set(COMMAND_JSON_CLASS_ATTRIBUTE, new TextNode(source.getClass().getCanonicalName())); + json.set(COMMAND_JSON_CLASS_ATTRIBUTE, new StringNode(source.getClass().getCanonicalName())); return json; } From 0ab49ac12caf7bd9fd4ebb18043c161993727a91 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 00:11:14 +0530 Subject: [PATCH 14/63] FINERACT-2621: migrate fineract-provider core config to Spring Boot 4 and Framework 7 Signed-off-by: avinashvijayvargiya --- fineract-provider/dependencies.gradle | 2 ++ .../org/apache/fineract/ServerApplication.java | 2 +- ...eractLiquibaseOnlyApplicationConfiguration.java | 2 +- .../boot/FineractWebApplicationConfiguration.java | 14 +++++++------- .../core/config/JdbcTransactionConfig.java | 2 +- .../infrastructure/core/config/SecurityConfig.java | 2 +- .../config/cache/TransactionBoundCacheManager.java | 6 +++--- .../infrastructure/core/config/jpa/JPAConfig.java | 8 ++++---- .../core/config/jpa/JpaTransactionConfig.java | 2 +- .../migration/ExtendedSpringLiquibaseBuilder.java | 2 +- .../migration/ExtendedSpringLiquibaseFactory.java | 2 +- .../migration/TenantDatabaseStateVerifier.java | 2 +- 12 files changed, 24 insertions(+), 22 deletions(-) diff --git a/fineract-provider/dependencies.gradle b/fineract-provider/dependencies.gradle index f165dec5211..c3be088b619 100644 --- a/fineract-provider/dependencies.gradle +++ b/fineract-provider/dependencies.gradle @@ -68,6 +68,8 @@ dependencies { 'org.springframework.boot:spring-boot-starter-actuator', 'org.springframework.boot:spring-boot-starter-batch-jdbc', 'org.springframework.boot:spring-boot-starter-data-jdbc', + 'org.springframework.boot:spring-boot-liquibase', + 'org.springframework.boot:spring-boot-gson', 'org.springframework.batch:spring-batch-integration', 'org.springframework.boot:spring-boot-starter-integration', 'org.springframework.integration:spring-integration-event', diff --git a/fineract-provider/src/main/java/org/apache/fineract/ServerApplication.java b/fineract-provider/src/main/java/org/apache/fineract/ServerApplication.java index f95ad1c23c5..96fc772a522 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/ServerApplication.java +++ b/fineract-provider/src/main/java/org/apache/fineract/ServerApplication.java @@ -21,8 +21,8 @@ import java.io.IOException; import org.apache.fineract.infrastructure.core.boot.FineractLiquibaseOnlyApplicationConfiguration; import org.apache.fineract.infrastructure.core.boot.FineractWebApplicationConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.jdbc.autoconfigure.DataSourceProperties; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Import; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractLiquibaseOnlyApplicationConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractLiquibaseOnlyApplicationConfiguration.java index 78f5e7d45a4..f820b326a28 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractLiquibaseOnlyApplicationConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractLiquibaseOnlyApplicationConfiguration.java @@ -24,8 +24,8 @@ import org.apache.fineract.infrastructure.core.config.HikariCpConfig; import org.apache.fineract.infrastructure.core.config.JdbcConfig; import org.springframework.beans.factory.InitializingBean; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseProperties; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Import; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractWebApplicationConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractWebApplicationConfiguration.java index 73ec21230b7..49a961cfd3a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractWebApplicationConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/boot/FineractWebApplicationConfiguration.java @@ -23,14 +23,14 @@ import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.gson.autoconfigure.GsonAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.JdbcTemplateAutoConfiguration; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseAutoConfiguration; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseProperties; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcTransactionConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcTransactionConfig.java index e6cac7499c1..c0f08c8e28e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcTransactionConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcTransactionConfig.java @@ -27,7 +27,7 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; +import org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java index 27a328d7b8c..c4fef8aa0b7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java @@ -50,7 +50,7 @@ import org.apache.fineract.notification.service.UserNotificationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.web.server.autoconfigure.ServerProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/cache/TransactionBoundCacheManager.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/cache/TransactionBoundCacheManager.java index 713903bd859..a434ba9ad98 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/cache/TransactionBoundCacheManager.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/cache/TransactionBoundCacheManager.java @@ -31,15 +31,15 @@ public class TransactionBoundCacheManager implements TransactionLifecycleCallbac @Override public void afterCompletion() { - resetCaches(); + clearAllCaches(); } @Override public void afterBegin() { - resetCaches(); + clearAllCaches(); } - private void resetCaches() { + private void clearAllCaches() { Collection cacheNames = delegate.getCacheNames(); cacheNames.forEach(c -> { Cache cache = delegate.getCache(c); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java index c77515dad31..a8234abc61d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java @@ -32,11 +32,11 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.eclipse.persistence.config.PersistenceUnitProperties; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer; -import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.boot.jpa.EntityManagerFactoryBuilder; +import org.springframework.boot.jpa.autoconfigure.EntityManagerFactoryBuilderCustomizer; +import org.springframework.boot.jpa.autoconfigure.JpaBaseConfiguration; +import org.springframework.boot.jpa.autoconfigure.JpaProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JpaTransactionConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JpaTransactionConfig.java index 58cb36b5d9f..915265a791a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JpaTransactionConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JpaTransactionConfig.java @@ -26,7 +26,7 @@ import org.apache.fineract.infrastructure.core.persistence.ExtendedJpaTransactionManager; import org.apache.fineract.infrastructure.core.persistence.TransactionLifecycleCallback; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; +import org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseBuilder.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseBuilder.java index 3c9486275c4..0318285d75a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseBuilder.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseBuilder.java @@ -29,7 +29,7 @@ import java.util.List; import java.util.Map; import javax.sql.DataSource; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseProperties; import org.springframework.core.io.ResourceLoader; public class ExtendedSpringLiquibaseBuilder { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseFactory.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseFactory.java index 85de2b3c655..3ff146d86ae 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseFactory.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/ExtendedSpringLiquibaseFactory.java @@ -20,7 +20,7 @@ import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseProperties; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Component; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java index 6ef80b9d0fb..d12a66df6ce 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java @@ -24,7 +24,7 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService; import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseProperties; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Component; From e749ade7009665b0da69556397401e43a43b7d02 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 00:11:21 +0530 Subject: [PATCH 15/63] FINERACT-2621: migrate fineract-provider to Security 7 and Jersey 4 Signed-off-by: avinashvijayvargiya --- .../src/main/groovy/org.apache.fineract.dependencies.gradle | 2 +- .../fineract/infrastructure/core/jersey/JerseyConfig.java | 2 +- .../security/config/AuthorizationServerConfig.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index 6f81dd8ce23..1c59017379c 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -36,7 +36,7 @@ dependencyManagement { 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' + mavenBom 'org.glassfish.jersey:jersey-bom:4.0.2' } dependencies { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyConfig.java index 0bb82fa9506..f0475eed51f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyConfig.java @@ -25,7 +25,7 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.ext.Provider; import org.apache.fineract.infrastructure.core.api.jersey.PageableParamProvider; -import org.glassfish.jersey.internal.inject.AbstractBinder; +import org.glassfish.jersey.inject.hk2.AbstractBinder; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ServerProperties; import org.glassfish.jersey.server.spi.internal.ValueParamProvider; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/config/AuthorizationServerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/config/AuthorizationServerConfig.java index d0c40a44ace..b55aa3450ef 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/config/AuthorizationServerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/config/AuthorizationServerConfig.java @@ -62,6 +62,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization.OAuth2AuthorizationServerConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.crypto.factory.PasswordEncoderFactories; @@ -71,7 +72,6 @@ import org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository; import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; -import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; import org.springframework.security.oauth2.server.authorization.settings.ClientSettings; import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer; From 1942beb56c96460f3d568a50707242339b348a27 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 00:11:34 +0530 Subject: [PATCH 16/63] FINERACT-2621: migrate fineract-provider to Spring Batch 6 Signed-off-by: avinashvijayvargiya --- .../AccountRunningBalanceUpdateConfig.java | 6 +-- .../AccountRunningBalanceUpdateTasklet.java | 4 +- .../cob/loan/AbstractLoanItemReader.java | 4 +- .../cob/loan/AbstractLoanItemWriter.java | 12 +++-- .../cob/loan/InlineCOBLoanItemProcessor.java | 2 +- .../cob/loan/InlineCOBLoanItemReader.java | 4 +- .../cob/loan/InlineCOBLoanItemWriter.java | 6 ++- ...neLoanCOBBuildExecutionContextTasklet.java | 4 +- .../cob/loan/LoanCOBManagerConfiguration.java | 8 ++-- .../fineract/cob/loan/LoanCOBPartitioner.java | 6 +-- .../cob/loan/LoanCOBWorkerConfiguration.java | 6 +-- .../cob/loan/LoanInlineCOBConfig.java | 10 ++-- .../fineract/cob/loan/LoanItemProcessor.java | 2 +- .../fineract/cob/loan/LoanItemReader.java | 2 +- .../fineract/cob/loan/LoanItemWriter.java | 6 ++- ...olveLoanCOBCustomJobParametersTasklet.java | 4 +- .../cob/loan/StayedLockedLoansTasklet.java | 4 +- ...WorkingCapitalInlineCOBLoanItemReader.java | 4 +- .../WorkingCapitalLoanInlineCOBConfig.java | 6 +-- .../AsyncCommonCOBExecutorService.java | 14 +++--- ...nlineCommonLockableCOBExecutorService.java | 33 ++++++++----- .../InlineLoanCOBExecutorServiceImpl.java | 6 +-- ...kingCapitalLoanCOBExecutorServiceImpl.java | 6 +-- .../jobs/executeemail/ExecuteEmailConfig.java | 6 +-- .../executeemail/ExecuteEmailTasklet.java | 4 +- .../ExecuteReportMailingJobsConfig.java | 6 +-- .../ExecuteReportMailingJobsTasklet.java | 4 +- ...etDeliveryReportsFromSmsGatewayConfig.java | 6 +-- ...tDeliveryReportsFromSmsGatewayTasklet.java | 4 +- .../SendMessageToSmsGatewayConfig.java | 6 +-- .../SendMessageToSmsGatewayTasklet.java | 4 +- ...mailOutboundWithCampaignMessageConfig.java | 6 +-- ...ailOutboundWithCampaignMessageTasklet.java | 4 +- ...eSmsOutboundWithCampaignMessageConfig.java | 6 +-- ...SmsOutboundWithCampaignMessageTasklet.java | 4 +- .../jobs/ScheduledJobRunnerConfig.java | 6 +-- ...ctDataFieldMaxValueIncrementerFactory.java | 10 ++-- .../jobs/service/JobRegisterServiceImpl.java | 2 +- .../jobs/service/JobStarter.java | 47 ++++++++++++------- ...urnalEntryAggregationJobConfiguration.java | 6 +-- ...alEntryAggregationJobExecutionDecider.java | 4 +- .../JournalEntryAggregationJobReader.java | 19 +++----- .../JournalEntryAggregationJobWriter.java | 8 ++-- .../JournalEntryAggregationJobListener.java | 6 +-- ...ournalEntryAggregationTrackingTasklet.java | 8 ++-- .../ExecuteAllDirtyJobsConfig.java | 6 +-- .../ExecuteAllDirtyJobsTasklet.java | 4 +- .../IncreaseBusinessDateBy1DayConfig.java | 4 +- .../IncreaseBusinessDateBy1DayTasklet.java | 4 +- .../IncreaseCobDateBy1DayConfig.java | 6 +-- .../IncreaseCobDateBy1DayTasklet.java | 4 +- .../JobParameterProvider.java | 2 +- .../LoanCOBJobParameterProvider.java | 5 +- .../RetainedEarningJobConfiguration.java | 6 +-- .../RetainedEarningJobReader.java | 8 ++-- .../RetainedEarningJobWriter.java | 8 ++-- .../listener/RetainedEarningJobListener.java | 6 +-- .../service/updatenpa/UpdateNpaConfig.java | 6 +-- .../service/updatenpa/UpdateNpaTasklet.java | 4 +- .../StepExecutionRequestHandler.java | 11 ++--- .../ExecuteStandingInstructionsConfig.java | 6 +-- .../ExecuteStandingInstructionsTasklet.java | 4 +- .../AccrualActivityPostingConfig.java | 6 +-- .../AccrualActivityPostingTasklet.java | 4 +- .../AddAccrualEntriesConfig.java | 6 +-- .../AddAccrualEntriesTasklet.java | 4 +- ...dPeriodicAccrualEntriesForLoansConfig.java | 6 +-- ...PeriodicAccrualEntriesForLoansTasklet.java | 4 +- ...yChargeToOverdueLoanInstallmentConfig.java | 6 +-- ...ChargeToOverdueLoanInstallmentTasklet.java | 4 +- .../ApplyHolidaysToLoansConfig.java | 6 +-- .../ApplyHolidaysToLoansTasklet.java | 4 +- .../GenerateLoanlossProvisioningConfig.java | 6 +-- .../GenerateLoanlossProvisioningTasklet.java | 4 +- .../RecalculateInterestForLoanConfig.java | 6 +-- .../RecalculateInterestForLoanTasklet.java | 15 +++--- .../TransferFeeChargeForLoansConfig.java | 6 +-- .../TransferFeeChargeForLoansTasklet.java | 4 +- ...AddAccrualTransactionForSavingsConfig.java | 6 +-- ...ddAccrualTransactionForSavingsTasklet.java | 4 +- .../ApplyAnnualFeeForSavingsConfig.java | 6 +-- .../ApplyAnnualFeeForSavingsTasklet.java | 4 +- .../GenerateAdhocClientScheduleConfig.java | 6 +-- .../GenerateAdhocClientScheduleTasklet.java | 4 +- .../GenerateRdScheduleConfig.java | 6 +-- .../GenerateRdScheduleTasklet.java | 4 +- .../PayDueSavingsChargesConfig.java | 6 +-- .../PayDueSavingsChargesTasklet.java | 4 +- .../PostInterestForSavingConfig.java | 6 +-- .../PostInterestForSavingTasklet.java | 4 +- .../TransferInterestToSavingsConfig.java | 6 +-- .../TransferInterestToSavingsTasklet.java | 4 +- ...eDepositsAccountMaturityDetailsConfig.java | 6 +-- ...DepositsAccountMaturityDetailsTasklet.java | 4 +- .../UpdateSavingsDormantAccountsConfig.java | 6 +-- .../UpdateSavingsDormantAccountsTasklet.java | 4 +- .../PostDividentsForSharesConfig.java | 6 +-- .../PostDividentsForSharesTasklet.java | 4 +- 98 files changed, 319 insertions(+), 301 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateConfig.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateConfig.java index 030138be2af..b24e018f54b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateConfig.java @@ -20,11 +20,11 @@ import org.apache.fineract.accounting.journalentry.service.JournalEntryRunningBalanceUpdateService; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateTasklet.java index b5708c07363..e78cf8e2b48 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/jobs/accountrunningbalanceupdate/AccountRunningBalanceUpdateTasklet.java @@ -21,10 +21,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.accounting.journalentry.service.JournalEntryRunningBalanceUpdateService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java index c9ad1c5b44f..9833b746623 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java @@ -27,9 +27,9 @@ import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.AfterStep; -import org.springframework.batch.item.ItemReader; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ItemReader; import org.springframework.data.repository.CrudRepository; import org.springframework.lang.NonNull; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java index 49559e8d758..cd1b8f65538 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java @@ -19,22 +19,26 @@ package org.apache.fineract.cob.loan; import java.util.List; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.domain.LockOwner; import org.apache.fineract.cob.domain.LockingService; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.portfolio.loanaccount.domain.Loan; -import org.springframework.batch.item.Chunk; -import org.springframework.batch.item.data.RepositoryItemWriter; +import org.springframework.batch.infrastructure.item.Chunk; +import org.springframework.batch.infrastructure.item.data.RepositoryItemWriter; +import org.springframework.data.repository.CrudRepository; import org.springframework.lang.NonNull; @Slf4j -@RequiredArgsConstructor public abstract class AbstractLoanItemWriter extends RepositoryItemWriter { private final LockingService loanLockingService; + protected AbstractLoanItemWriter(LockingService loanLockingService, CrudRepository repository) { + super(repository); + this.loanLockingService = loanLockingService; + } + @Override public void write(@NonNull Chunk items) throws Exception { if (!items.isEmpty()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java index 4326d84d98e..7f5d384bbb7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java @@ -20,8 +20,8 @@ import org.apache.fineract.cob.COBBusinessStepService; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanModelProcessingService; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.step.StepExecution; public class InlineCOBLoanItemProcessor extends AbstractLoanItemProcessor { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java index fc33af0c439..d30321de94d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java @@ -22,9 +22,9 @@ import java.util.concurrent.LinkedBlockingQueue; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.lang.NonNull; public class InlineCOBLoanItemReader extends AbstractLoanItemReader { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemWriter.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemWriter.java index f87d6a88c7d..33f155c9a69 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemWriter.java @@ -20,11 +20,13 @@ import org.apache.fineract.cob.domain.LockOwner; import org.apache.fineract.cob.domain.LockingService; +import org.apache.fineract.portfolio.loanaccount.domain.Loan; +import org.springframework.data.repository.CrudRepository; public class InlineCOBLoanItemWriter extends AbstractLoanItemWriter { - public InlineCOBLoanItemWriter(LockingService loanLockingService) { - super(loanLockingService); + public InlineCOBLoanItemWriter(LockingService loanLockingService, CrudRepository repository) { + super(loanLockingService, repository); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java index 3e7f7f2193f..e58c630f572 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java @@ -45,10 +45,10 @@ import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.springbatch.SpringBatchJobConstants; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java index 464ce7dedda..63809b024c9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java @@ -30,14 +30,14 @@ import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.springbatch.PropertyService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.launch.JobOperator; -import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.integration.config.annotation.EnableBatchIntegration; import org.springframework.batch.integration.partition.RemotePartitioningManagerStepBuilderFactory; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java index 9bd2559f348..134c77eeda2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java @@ -26,10 +26,10 @@ import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.cob.service.RetrieveIdService; import org.apache.fineract.infrastructure.springbatch.PropertyService; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.launch.JobOperator; -import org.springframework.batch.core.partition.support.Partitioner; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.partition.Partitioner; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.lang.NonNull; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java index 5322acb10a5..711f349e1f8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java @@ -34,9 +34,9 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanModelProcessingService; import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper; -import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.SimpleStepBuilder; import org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilderFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -169,8 +169,6 @@ public LoanItemProcessor cobWorkerItemProcessor() { @Bean @StepScope public LoanItemWriter cobWorkerItemWriter() { - LoanItemWriter repositoryItemWriter = new LoanItemWriter(loanLockingService); - repositoryItemWriter.setRepository(loanRepository); - return repositoryItemWriter; + return new LoanItemWriter(loanLockingService, loanRepository); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java index bcc459cae18..e73a1054f20 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java @@ -30,13 +30,13 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanModelProcessingService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobScope; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.listener.ExecutionContextPromotionListener; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.integration.config.annotation.EnableBatchIntegration; import org.springframework.beans.factory.annotation.Autowired; @@ -122,9 +122,7 @@ public Step inlineCOBResetContextStep() { @Bean public InlineCOBLoanItemWriter inlineCobWorkerItemWriter() { - InlineCOBLoanItemWriter repositoryItemWriter = new InlineCOBLoanItemWriter(loanLockingService); - repositoryItemWriter.setRepository(loanRepository); - return repositoryItemWriter; + return new InlineCOBLoanItemWriter(loanLockingService, loanRepository); } @Bean diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java index 4e7c340d5c0..26fa4658271 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java @@ -20,8 +20,8 @@ import org.apache.fineract.cob.COBBusinessStepService; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanModelProcessingService; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.step.StepExecution; public class LoanItemProcessor extends AbstractLoanItemProcessor { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java index 038c3b507b8..5fbdc7cfd79 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java @@ -22,8 +22,8 @@ import org.apache.fineract.cob.service.BeforeStepLockingItemReaderHelper; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.step.StepExecution; import org.springframework.lang.NonNull; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemWriter.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemWriter.java index 8ed0f6fa354..8a4c3c391a9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemWriter.java @@ -20,11 +20,13 @@ import org.apache.fineract.cob.domain.LockOwner; import org.apache.fineract.cob.domain.LockingService; +import org.apache.fineract.portfolio.loanaccount.domain.Loan; +import org.springframework.data.repository.CrudRepository; public class LoanItemWriter extends AbstractLoanItemWriter { - public LoanItemWriter(LockingService loanLockingService) { - super(loanLockingService); + public LoanItemWriter(LockingService loanLockingService, CrudRepository repository) { + super(loanLockingService, repository); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ResolveLoanCOBCustomJobParametersTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ResolveLoanCOBCustomJobParametersTasklet.java index f0924f1a016..0ea11ab96e5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ResolveLoanCOBCustomJobParametersTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ResolveLoanCOBCustomJobParametersTasklet.java @@ -21,10 +21,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.common.CustomJobParameterResolver; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/StayedLockedLoansTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/StayedLockedLoansTasklet.java index b23e58148f6..a4e22810962 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/StayedLockedLoansTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/StayedLockedLoansTasklet.java @@ -30,10 +30,10 @@ import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java index cea82913a1d..eb3a97ddf48 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java @@ -23,9 +23,9 @@ import org.apache.fineract.cob.COBConstant; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.lang.NonNull; public class WorkingCapitalInlineCOBLoanItemReader extends AbstractLoanItemReader { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java index 2d052e4bb6f..69f041fa472 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java @@ -35,13 +35,13 @@ import org.apache.fineract.infrastructure.springbatch.PropertyService; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobScope; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.listener.ExecutionContextPromotionListener; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.integration.config.annotation.EnableBatchIntegration; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java index b9897d72099..d76923e250a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java @@ -40,13 +40,13 @@ import org.apache.fineract.infrastructure.jobs.service.JobStarter; import org.apache.fineract.infrastructure.jobs.service.SchedulerServiceConstants; import org.quartz.JobExecutionException; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobParametersInvalidException; import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.job.parameters.InvalidJobParametersException; +import org.springframework.batch.core.launch.JobExecutionAlreadyRunningException; +import org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException; +import org.springframework.batch.core.launch.JobRestartException; import org.springframework.batch.core.launch.NoSuchJobException; -import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; -import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; -import org.springframework.batch.core.repository.JobRestartException; import org.springframework.scheduling.annotation.Async; @Slf4j @@ -76,7 +76,7 @@ public void executeLoanCOBCatchUpAsync(FineractContext context) { } catch (NoSuchJobException e) { // Throwing an error here is useless as it will be swallowed hence it is async method log.error("Job not found: {}", getJobName(), new JobNotFoundException(getJobName(), e)); - } catch (JobInstanceAlreadyCompleteException | JobRestartException | JobParametersInvalidException + } catch (JobInstanceAlreadyCompleteException | JobRestartException | InvalidJobParametersException | JobExecutionAlreadyRunningException | JobExecutionException e) { // Throwing an error here is useless as it will be swallowed hence it is async method log.error("Error executing job", e); @@ -91,7 +91,7 @@ public void executeLoanCOBCatchUpAsync(FineractContext context) { private void executeLoanCOBDayByDayUntilCOBBusinessDate(LocalDate oldestCOBProcessedDate, LocalDate cobBusinessDate) throws NoSuchJobException, JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, - JobParametersInvalidException, JobRestartException, JobExecutionException { + InvalidJobParametersException, JobRestartException, JobExecutionException { Job job = jobLocator.getJob(getJobName()); ScheduledJobDetail scheduledJobDetail = scheduledJobDetailRepository.findByJobName(getJobHumanReadableName()); LocalDate executingBusinessDate = oldestCOBProcessedDate.plusDays(1); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java index 61314a03f2f..a8fdde71635 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -57,15 +58,16 @@ import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.springbatch.SpringBatchJobConstants; import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameter; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.configuration.JobLocator; -import org.springframework.batch.core.explore.JobExplorer; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameter; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.job.parameters.JobParametersBuilder; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.NoSuchJobException; +import org.springframework.batch.core.repository.JobRepository; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; @@ -79,7 +81,7 @@ public abstract class InlineCommonLockableCOBExecutorService loanIds, String jobName, LocalDate businessDate) } catch (NoSuchJobException e) { throw new JobNotFoundException(jobName, e); } - JobParameters jobParameters = new JobParametersBuilder(jobExplorer).getNextJobParameters(inlineLoanCOBJob) - .addJobParameters(new JobParameters(getJobParametersMap(loanIds, businessDate))).toJobParameters(); + JobParameters jobParameters = new JobParametersBuilder(getNextJobParameters(inlineLoanCOBJob)) + .addJobParameters(new JobParameters(new HashSet<>(getJobParametersMap(loanIds, businessDate).values()))).toJobParameters(); JobExecution jobExecution; try { jobExecution = jobLauncher.run(inlineLoanCOBJob, jobParameters); @@ -205,11 +207,20 @@ private Map> getJobParametersMap(List loanIds, Loc Long businessDateJobParameterId = saveCustomJobParameter(COBConstant.BUSINESS_DATE_PARAMETER_NAME, businessDate.format(DateTimeFormatter.ISO_DATE)); Map> jobParameterMap = new HashMap<>(); - jobParameterMap.put(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, new JobParameter<>(loanIdsJobParameterId, Long.class)); - jobParameterMap.put(COBConstant.BUSINESS_DATE_PARAMETER_NAME, new JobParameter<>(businessDateJobParameterId, Long.class)); + jobParameterMap.put(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, + new JobParameter<>(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, loanIdsJobParameterId, Long.class)); + jobParameterMap.put(COBConstant.BUSINESS_DATE_PARAMETER_NAME, + new JobParameter<>(COBConstant.BUSINESS_DATE_PARAMETER_NAME, businessDateJobParameterId, Long.class)); return jobParameterMap; } + private JobParameters getNextJobParameters(Job job) { + JobInstance lastInstance = jobRepository.getLastJobInstance(job.getName()); + JobExecution lastExecution = lastInstance == null ? null : jobRepository.getLastJobExecution(lastInstance); + JobParameters parameters = lastExecution == null ? new JobParameters() : lastExecution.getJobParameters(); + return job.getJobParametersIncrementer() == null ? parameters : job.getJobParametersIncrementer().getNext(parameters); + } + private void lockLoanAccounts(List loanIds, LocalDate businessDate) { requiresNewTransactionTemplate.executeWithoutResult(status -> { List loanAccountLocks = getLoanAccountLocks(loanIds, businessDate); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java index 00336d315b0..e527f1be3bd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java @@ -28,8 +28,8 @@ import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.springframework.batch.core.configuration.JobLocator; -import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Conditional; import org.springframework.stereotype.Service; @@ -41,11 +41,11 @@ public class InlineLoanCOBExecutorServiceImpl extends InlineCommonLockableCOBExecutorService { public InlineLoanCOBExecutorServiceImpl(LoanAccountLockRepository loanAccountLockRepository, - InlineLoanCOBExecutionDataParser dataParser, JobLauncher jobLauncher, JobLocator jobLocator, JobExplorer jobExplorer, + InlineLoanCOBExecutionDataParser dataParser, JobLauncher jobLauncher, JobLocator jobLocator, JobRepository jobRepository, @Qualifier("requiresNewTransactionTemplate") TransactionTemplate requiresNewTransactionTemplate, CustomJobParameterRepository customJobParameterRepository, PlatformSecurityContext context, RetrieveLoanIdService retrieveIdService, FineractProperties fineractProperties) { - super(loanAccountLockRepository, dataParser, jobLauncher, jobLocator, jobExplorer, requiresNewTransactionTemplate, + super(loanAccountLockRepository, dataParser, jobLauncher, jobLocator, jobRepository, requiresNewTransactionTemplate, customJobParameterRepository, context, retrieveIdService, fineractProperties); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java index 07104d860f2..57eac8bc033 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java @@ -29,8 +29,8 @@ import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.springframework.batch.core.configuration.JobLocator; -import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Conditional; import org.springframework.stereotype.Service; @@ -42,11 +42,11 @@ public class InlineWorkingCapitalLoanCOBExecutorServiceImpl extends InlineCommonLockableCOBExecutorService { public InlineWorkingCapitalLoanCOBExecutorServiceImpl(WorkingCapitalAccountLockRepository loanAccountLockRepository, - InlineLoanCOBExecutionDataParser dataParser, JobLauncher jobLauncher, JobLocator jobLocator, JobExplorer jobExplorer, + InlineLoanCOBExecutionDataParser dataParser, JobLauncher jobLauncher, JobLocator jobLocator, JobRepository jobRepository, @Qualifier("requiresNewTransactionTemplate") TransactionTemplate requiresNewTransactionTemplate, CustomJobParameterRepository customJobParameterRepository, PlatformSecurityContext context, WorkingCapitalLoanRetrieveIdService retrieveIdService, FineractProperties fineractProperties) { - super(loanAccountLockRepository, dataParser, jobLauncher, jobLocator, jobExplorer, requiresNewTransactionTemplate, + super(loanAccountLockRepository, dataParser, jobLauncher, jobLocator, jobRepository, requiresNewTransactionTemplate, customJobParameterRepository, context, retrieveIdService, fineractProperties); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailConfig.java index 576813881e6..7710d60291a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executeemail/ExecuteEmailConfig.java @@ -27,11 +27,11 @@ import org.apache.fineract.infrastructure.reportmailingjob.validation.ReportMailingJobValidator; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; 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 031e651ded4..9944ce35221 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 @@ -51,10 +51,10 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsConfig.java index 82121d0a59a..85d63b9ee4d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/executereportmailingjobs/ExecuteReportMailingJobsConfig.java @@ -26,11 +26,11 @@ import org.apache.fineract.infrastructure.reportmailingjob.domain.ReportMailingJobRunHistoryRepository; import org.apache.fineract.infrastructure.reportmailingjob.service.ReportMailingJobEmailService; import org.apache.fineract.infrastructure.reportmailingjob.validation.ReportMailingJobValidator; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; 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 8aa35255af7..1599dea86a1 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 @@ -55,10 +55,10 @@ import org.apache.fineract.infrastructure.reportmailingjob.validation.ReportMailingJobValidator; import org.apache.fineract.portfolio.calendar.service.CalendarUtils; import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayConfig.java index b7352783f04..61e8364b8e2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayConfig.java @@ -22,11 +22,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.sms.domain.SmsMessageRepository; import org.apache.fineract.infrastructure.sms.service.SmsReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayTasklet.java index 1a23d474e31..74fb6dd2f49 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/getdeliveryreportsfromsmsgateway/GetDeliveryReportsFromSmsGatewayTasklet.java @@ -32,10 +32,10 @@ import org.apache.fineract.infrastructure.sms.domain.SmsMessageRepository; import org.apache.fineract.infrastructure.sms.domain.SmsMessageStatusType; import org.apache.fineract.infrastructure.sms.service.SmsReadPlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayConfig.java index 5fff6f6b38d..bbff18142f2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayConfig.java @@ -23,11 +23,11 @@ import org.apache.fineract.infrastructure.gcm.service.NotificationSenderService; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.sms.domain.SmsMessageRepository; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayTasklet.java index 4ef12fcf7af..1662d7c2ad7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/sendmessagetosmsgateway/SendMessageToSmsGatewayTasklet.java @@ -38,10 +38,10 @@ import org.apache.fineract.infrastructure.sms.domain.SmsMessage; import org.apache.fineract.infrastructure.sms.domain.SmsMessageRepository; import org.apache.fineract.infrastructure.sms.domain.SmsMessageStatusType; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; import org.springframework.core.ParameterizedTypeReference; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageConfig.java index fa73c7051c9..6592f57b7b9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageConfig.java @@ -24,11 +24,11 @@ import org.apache.fineract.infrastructure.campaigns.email.service.EmailCampaignWritePlatformService; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java index 2a3f6964730..895d0150a2a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java @@ -47,10 +47,10 @@ import org.apache.fineract.portfolio.calendar.service.CalendarUtils; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageConfig.java index 0ac5215602f..f37ab51ac27 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.campaigns.sms.domain.SmsCampaignRepository; import org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageTasklet.java index e24a42fb729..a28d8b0739c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updatesmsoutboundwithcampaignmessage/UpdateSmsOutboundWithCampaignMessageTasklet.java @@ -32,10 +32,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.calendar.service.CalendarUtils; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java index 6b03b518d02..82a997ae6b0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java @@ -21,13 +21,13 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.apache.fineract.infrastructure.jobs.config.FineractDataFieldMaxValueIncrementerFactory; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; -import org.springframework.batch.core.explore.JobExplorer; -import org.springframework.batch.core.explore.support.JobExplorerFactoryBean; import org.springframework.batch.core.launch.support.TaskExecutorJobLauncher; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer; +import org.springframework.batch.core.repository.explore.JobExplorer; +import org.springframework.batch.core.repository.explore.support.JobExplorerFactoryBean; import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; -import org.springframework.batch.item.database.support.DataFieldMaxValueIncrementerFactory; +import org.springframework.batch.infrastructure.item.database.support.DataFieldMaxValueIncrementerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractDataFieldMaxValueIncrementerFactory.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractDataFieldMaxValueIncrementerFactory.java index 8efe5476a37..42302fd796e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractDataFieldMaxValueIncrementerFactory.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractDataFieldMaxValueIncrementerFactory.java @@ -18,15 +18,15 @@ */ package org.apache.fineract.infrastructure.jobs.config; -import static org.springframework.batch.support.DatabaseType.MARIADB; -import static org.springframework.batch.support.DatabaseType.MYSQL; -import static org.springframework.batch.support.DatabaseType.POSTGRES; +import static org.springframework.batch.infrastructure.support.DatabaseType.MARIADB; +import static org.springframework.batch.infrastructure.support.DatabaseType.MYSQL; +import static org.springframework.batch.infrastructure.support.DatabaseType.POSTGRES; import java.util.List; import javax.sql.DataSource; import lombok.RequiredArgsConstructor; -import org.springframework.batch.item.database.support.DataFieldMaxValueIncrementerFactory; -import org.springframework.batch.support.DatabaseType; +import org.springframework.batch.infrastructure.item.database.support.DataFieldMaxValueIncrementerFactory; +import org.springframework.batch.infrastructure.support.DatabaseType; import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer; import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer; import org.springframework.jdbc.support.incrementer.PostgresSequenceMaxValueIncrementer; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java index a832c7311be..b9bdc1d65d1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java @@ -48,8 +48,8 @@ import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerListener; -import org.springframework.batch.core.Job; import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.launch.NoSuchJobException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java index df917536588..9b52d6ca207 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java @@ -21,6 +21,7 @@ import java.time.LocalDate; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -43,17 +44,18 @@ import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper; import org.quartz.JobExecutionException; import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameter; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.batch.core.JobParametersInvalidException; -import org.springframework.batch.core.explore.JobExplorer; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.InvalidJobParametersException; +import org.springframework.batch.core.job.parameters.JobParameter; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.job.parameters.JobParametersBuilder; +import org.springframework.batch.core.launch.JobExecutionAlreadyRunningException; +import org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException; import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; -import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; -import org.springframework.batch.core.repository.JobRestartException; +import org.springframework.batch.core.launch.JobRestartException; +import org.springframework.batch.core.repository.JobRepository; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @@ -63,7 +65,7 @@ @RequiredArgsConstructor public class JobStarter { - private final JobExplorer jobExplorer; + private final JobRepository jobRepository; private final JobLauncher jobLauncher; private final JobParameterRepository jobParameterRepository; private final List> jobParameterProviders; @@ -77,7 +79,7 @@ public class JobStarter { public JobExecution run(Job job, ScheduledJobDetail scheduledJobDetail, Set jobParameterDTOSet, String tenantIdentifier) throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, - JobParametersInvalidException, JobRestartException, JobExecutionException { + InvalidJobParametersException, JobRestartException, JobExecutionException { boolean contextInitialized = false; final FineractPlatformTenant existingTenant = ThreadLocalContextUtil.getTenant(); @@ -97,11 +99,11 @@ public JobExecution run(Job job, ScheduledJobDetail scheduledJobDetail, Set> jobParameterMap = getJobParameter(scheduledJobDetail); - JobParameters jobParameters = new JobParametersBuilder(jobExplorer).getNextJobParameters(job) - .addJobParameters(new JobParameters(jobParameterMap)) - .addJobParameters(new JobParameters(provideCustomJobParameters( + JobParameters jobParameters = new JobParametersBuilder(getNextJobParameters(job)) + .addJobParameters(new JobParameters(new HashSet<>(jobParameterMap.values()))) + .addJobParameters(new JobParameters(new HashSet<>(provideCustomJobParameters( jobNameService.getJobByHumanReadableName(scheduledJobDetail.getJobName()).getEnumStyleName(), - jobParameterDTOSet))) + jobParameterDTOSet).values()))) .toJobParameters(); JobExecution result = jobLauncher.run(job, jobParameters); if (FAILED_STATUSES.contains(result.getStatus())) { @@ -115,12 +117,21 @@ public JobExecution run(Job job, ScheduledJobDetail scheduledJobDetail, Set> getJobParameter(ScheduledJobDetail scheduledJobDetail) { + private JobParameters getNextJobParameters(Job job) { + JobInstance lastInstance = jobRepository.getLastJobInstance(job.getName()); + JobExecution lastExecution = lastInstance == null ? null : jobRepository.getLastJobExecution(lastInstance); + JobParameters parameters = lastExecution == null ? new JobParameters() : lastExecution.getJobParameters(); + return job.getJobParametersIncrementer() == null ? parameters : job.getJobParametersIncrementer().getNext(parameters); + } + + protected Map> getJobParameter( + ScheduledJobDetail scheduledJobDetail) { List jobParameterList = jobParameterRepository .findJobParametersByJobId(scheduledJobDetail.getId()); Map> jobParameterMap = new HashMap<>(); for (org.apache.fineract.infrastructure.jobs.domain.JobParameter jobParameter : jobParameterList) { - jobParameterMap.put(jobParameter.getParameterName(), new JobParameter<>(jobParameter.getParameterValue(), String.class)); + jobParameterMap.put(jobParameter.getParameterName(), + new JobParameter<>(jobParameter.getParameterName(), jobParameter.getParameterValue(), String.class)); } return jobParameterMap; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java index fbb61af0ec8..f2feb5a99e0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java @@ -28,11 +28,11 @@ import org.apache.fineract.infrastructure.jobs.service.aggregationjob.data.JournalEntryAggregationSummaryData; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.listener.JournalEntryAggregationJobListener; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.tasklet.JournalEntryAggregationTrackingTasklet; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java index e0615bbd28a..d68a820648b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java @@ -22,10 +22,10 @@ import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.job.flow.FlowExecutionStatus; import org.springframework.batch.core.job.flow.JobExecutionDecider; +import org.springframework.batch.core.step.StepExecution; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReader.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReader.java index ef395997c00..8b15a9f6f20 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReader.java @@ -21,33 +21,28 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; import org.apache.fineract.infrastructure.core.service.migration.TenantDataSourceFactory; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.data.JournalEntryAggregationSummaryData; -import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.BeforeStep; import org.springframework.batch.core.configuration.annotation.StepScope; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.item.database.JdbcCursorItemReader; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.database.JdbcCursorItemReader; import org.springframework.stereotype.Component; @Component @StepScope public class JournalEntryAggregationJobReader extends JdbcCursorItemReader { - private final DatabaseTypeResolver databaseTypeResolver; private LocalDate aggregatedOnDateFrom; private LocalDate aggregatedOnDateTo; public JournalEntryAggregationJobReader(TenantDataSourceFactory tenantDataSourceFactory, DatabaseTypeResolver databaseTypeResolver) { - this.databaseTypeResolver = databaseTypeResolver; - FineractPlatformTenant tenant = ThreadLocalContextUtil.getTenant(); - setDataSource(tenantDataSourceFactory.create(tenant)); - setSql(buildAggregationQuery()); - setRowMapper(this::mapRow); + super(tenantDataSourceFactory.create(ThreadLocalContextUtil.getTenant()), buildAggregationQuery(databaseTypeResolver), + JournalEntryAggregationJobReader::mapRow); } @BeforeStep @@ -64,7 +59,7 @@ public void beforeStep(StepExecution stepExecution) { } - private JournalEntryAggregationSummaryData mapRow(ResultSet rs, int rowNum) throws SQLException { + private static JournalEntryAggregationSummaryData mapRow(ResultSet rs, int rowNum) throws SQLException { return JournalEntryAggregationSummaryData.builder() // .glAccountId(rs.getLong("glAccountId")) // .productId(rs.getLong("productId")) // @@ -81,7 +76,7 @@ private JournalEntryAggregationSummaryData mapRow(ResultSet rs, int rowNum) thro .build(); // } - private String buildAggregationQuery() { + private static String buildAggregationQuery(DatabaseTypeResolver databaseTypeResolver) { String aggregateFunction = databaseTypeResolver.isMySQL() ? "GROUP_CONCAT(DISTINCT mlo.external_id ORDER BY mlo.external_id SEPARATOR ', ')" : "STRING_AGG(DISTINCT mlo.external_id, ', ' ORDER BY mlo.external_id)"; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java index 3324a9bbb8d..31929f104ca 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java @@ -23,11 +23,11 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.data.JournalEntryAggregationSummaryData; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.services.JournalEntryAggregationWriterService; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; import org.springframework.batch.core.configuration.annotation.StepScope; -import org.springframework.batch.item.Chunk; -import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.core.listener.StepExecutionListener; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.Chunk; +import org.springframework.batch.infrastructure.item.ItemWriter; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListener.java index 0d3dfc30973..eabfba5a674 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListener.java @@ -35,9 +35,9 @@ import org.apache.fineract.infrastructure.jobs.service.aggregationjob.domain.JournalEntryAggregationTrackingRepository; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.services.JournalEntryAggregationWriterService; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobExecutionListener; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.listener.JobExecutionListener; +import org.springframework.batch.core.step.StepExecution; import org.springframework.stereotype.Component; @Component diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java index bd8ba1e2b37..8c4f59d9083 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java @@ -26,12 +26,12 @@ import org.apache.fineract.infrastructure.jobs.service.aggregationjob.JournalEntryAggregationJobConstant; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.data.JournalEntryAggregationTrackingData; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.services.JournalEntryAggregationWriterService; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsConfig.java index d33bba8f7f1..37580fec9b2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsConfig.java @@ -19,11 +19,11 @@ package org.apache.fineract.infrastructure.jobs.service.executealldirtyjobs; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsTasklet.java index 53c87824513..5074cef93b2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/executealldirtyjobs/ExecuteAllDirtyJobsTasklet.java @@ -24,10 +24,10 @@ import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetail; import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetailRepository; import org.apache.fineract.infrastructure.jobs.service.JobRegisterService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayConfig.java index fbd7d47327a..9b2fe9e874c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayConfig.java @@ -21,9 +21,9 @@ import org.apache.fineract.infrastructure.businessdate.service.BusinessDateWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTasklet.java index c22bf2060a9..2808bd51944 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTasklet.java @@ -24,10 +24,10 @@ import org.apache.fineract.infrastructure.businessdate.service.BusinessDateWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayConfig.java index 7d356682a22..509cb4ce86b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayConfig.java @@ -22,11 +22,11 @@ import org.apache.fineract.infrastructure.businessdate.service.BusinessDateWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTasklet.java index 94c4145c531..672cc27ffb7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTasklet.java @@ -24,10 +24,10 @@ import org.apache.fineract.infrastructure.businessdate.service.BusinessDateWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/JobParameterProvider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/JobParameterProvider.java index a4e12e5a026..08cd8f43b07 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/JobParameterProvider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/JobParameterProvider.java @@ -21,7 +21,7 @@ import java.util.Map; import java.util.Set; import org.apache.fineract.infrastructure.jobs.data.JobParameterDTO; -import org.springframework.batch.core.JobParameter; +import org.springframework.batch.core.job.parameters.JobParameter; public interface JobParameterProvider { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/LoanCOBJobParameterProvider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/LoanCOBJobParameterProvider.java index 554f4a8837a..b5dd4ded598 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/LoanCOBJobParameterProvider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/jobparameterprovider/LoanCOBJobParameterProvider.java @@ -33,7 +33,7 @@ import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.springbatch.SpringBatchJobConstants; -import org.springframework.batch.core.JobParameter; +import org.springframework.batch.core.job.parameters.JobParameter; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -48,7 +48,8 @@ public class LoanCOBJobParameterProvider extends AbstractJobParameterProvider> provide(Set jobParameterDTOSet) { Map> jobParameterMap = new HashMap<>(); Long customJobParameterId = customJobParameterRepository.save(getJobParameterDTOListWithCorrectBusinessDate(jobParameterDTOSet)); - jobParameterMap.put(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, new JobParameter<>(customJobParameterId, Long.class)); + jobParameterMap.put(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, + new JobParameter<>(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, customJobParameterId, Long.class)); return jobParameterMap; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java index 93efe9b2e1c..7f04cd4aece 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java @@ -25,11 +25,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.retainedearning.data.AccountGLJournalEntryAnnualSummaryData; import org.apache.fineract.infrastructure.jobs.service.retainedearning.listener.RetainedEarningJobListener; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReader.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReader.java index 264a84c1a0b..850988f7dcd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReader.java @@ -26,11 +26,11 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.jobs.service.retainedearning.data.AccountGLJournalEntryAnnualSummaryData; import org.apache.fineract.infrastructure.jobs.service.retainedearning.services.RetainedEarningDataService; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; import org.springframework.batch.core.configuration.annotation.StepScope; -import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.support.ListItemReader; +import org.springframework.batch.core.listener.StepExecutionListener; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ItemReader; +import org.springframework.batch.infrastructure.item.support.ListItemReader; import org.springframework.stereotype.Component; /** diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriter.java index 8f023373132..ff1770bd58b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriter.java @@ -30,11 +30,11 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.jobs.service.retainedearning.data.AccountGLJournalEntryAnnualSummaryData; import org.apache.fineract.infrastructure.jobs.service.retainedearning.services.RetainedEarningDataService; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; import org.springframework.batch.core.configuration.annotation.StepScope; -import org.springframework.batch.item.Chunk; -import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.core.listener.StepExecutionListener; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.Chunk; +import org.springframework.batch.infrastructure.item.ItemWriter; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListener.java index 953e682d7a7..f9756090f28 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListener.java @@ -26,8 +26,8 @@ import java.time.temporal.ChronoUnit; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobExecutionListener; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.listener.JobExecutionListener; import org.springframework.stereotype.Component; /** @@ -45,7 +45,7 @@ public class RetainedEarningJobListener implements JobExecutionListener { */ @Override public void beforeJob(JobExecution jobExecution) { - log.info("Starting Retained Earning Job: {}", jobExecution.getJobId()); + log.info("Starting Retained Earning Job: {}", jobExecution.getJobInstanceId()); } /** diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaConfig.java index 80d2766c9e2..da76d7e6108 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaConfig.java @@ -23,11 +23,11 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaTasklet.java index 55b664e4862..c7d16cf169e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/updatenpa/UpdateNpaTasklet.java @@ -27,10 +27,10 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.jdbc.core.JdbcTemplate; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/StepExecutionRequestHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/StepExecutionRequestHandler.java index 126039fd0ce..89afcbf789a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/StepExecutionRequestHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/StepExecutionRequestHandler.java @@ -20,11 +20,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.JobInterruptedException; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.explore.JobExplorer; +import org.springframework.batch.core.job.JobInterruptedException; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; +import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.step.StepLocator; import org.springframework.batch.integration.partition.StepExecutionRequest; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -38,15 +37,13 @@ public class StepExecutionRequestHandler { private final JobRepository jobRepository; private final StepLocator stepLocator; - private final JobExplorer jobExplorer; public void handle(StepExecutionRequest request) { - Long jobExecutionId = request.getJobExecutionId(); Long stepExecutionId = request.getStepExecutionId(); String stepName = request.getStepName(); - StepExecution stepExecution = jobExplorer.getStepExecution(jobExecutionId, stepExecutionId); + StepExecution stepExecution = jobRepository.getStepExecution(stepExecutionId); if (stepExecution == null) { throw new IllegalStateException("stepExecution cannot be null"); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsConfig.java index 69fecbdb4c4..f4ca0ba31f3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsConfig.java @@ -22,11 +22,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.account.service.AccountTransfersWritePlatformService; import org.apache.fineract.portfolio.account.service.StandingInstructionReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsTasklet.java index bb99a47ae0f..2bceadc3e74 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/jobs/executestandinginstructions/ExecuteStandingInstructionsTasklet.java @@ -45,10 +45,10 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.ScheduledDateGenerator; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.exception.InsufficientAccountBalanceException; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.jdbc.core.JdbcTemplate; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingConfig.java index fdb9ae16407..f63d9a147c9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingConfig.java @@ -20,11 +20,11 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingTasklet.java index 8b721deedc9..ac9d5020050 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/accrualactivityposting/AccrualActivityPostingTasklet.java @@ -30,10 +30,10 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualActivityProcessingService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesConfig.java index 50902ad8f32..cd0e442aa10 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesConfig.java @@ -19,11 +19,11 @@ package org.apache.fineract.portfolio.loanaccount.jobs.addaccrualentries; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java index ef4b06310bc..cc0ea101da3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java @@ -25,10 +25,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansConfig.java index 27fb15cdf99..b238c50632e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansTasklet.java index 68d3e5d799d..b6a343cf087 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addperiodicaccrualentriesforloanswithincomepostedastransactions/AddPeriodicAccrualEntriesForLoansTasklet.java @@ -27,10 +27,10 @@ import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentConfig.java index 056a2b76042..52cc1bf0f8b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentConfig.java @@ -22,11 +22,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeWritePlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTasklet.java index 0477ab170ee..7be6eb915bd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTasklet.java @@ -33,10 +33,10 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeWritePlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansConfig.java index fe8c357e9bc..f51b3e7bf3a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansConfig.java @@ -19,11 +19,11 @@ package org.apache.fineract.portfolio.loanaccount.jobs.applyholidaystoloans; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansTasklet.java index ee14d9ce43a..55acf9a42d6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/applyholidaystoloans/ApplyHolidaysToLoansTasklet.java @@ -44,10 +44,10 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms; import org.apache.fineract.portfolio.loanaccount.mapper.LoanTermVariationsMapper; import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningConfig.java index 564549fceae..4a934945f0f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.accounting.provisioning.service.ProvisioningEntriesWritePlatformService; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.organisation.provisioning.service.ProvisioningCriteriaReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTasklet.java index a444c45429f..b2187ac0218 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTasklet.java @@ -28,10 +28,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaData; import org.apache.fineract.organisation.provisioning.service.ProvisioningCriteriaReadPlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanConfig.java index b07942ad92d..c9ba504ba14 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanConfig.java @@ -24,11 +24,11 @@ import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService; import org.apache.fineract.portfolio.loanaccount.service.RecalculateInterestPoster; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanTasklet.java index 844a6c0b10a..66dd64e85a5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/recalculateinterestforloan/RecalculateInterestForLoanTasklet.java @@ -22,7 +22,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -39,11 +38,11 @@ import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanWritePlatformService; import org.apache.fineract.portfolio.loanaccount.service.RecalculateInterestPoster; -import org.springframework.batch.core.JobParameter; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -61,9 +60,9 @@ public class RecalculateInterestForLoanTasklet implements Tasklet { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - Map> jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters().getParameters(); + JobParameters jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters(); if (!jobParameters.isEmpty()) { - final String officeId = (String) jobParameters.get("officeId").getValue(); + final String officeId = jobParameters.getString("officeId"); log.debug("recalculateInterest: officeId={}", officeId); Long officeIdLong = Long.valueOf(officeId); @@ -71,8 +70,8 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon if (office == null) { throw new OfficeNotFoundException(officeIdLong); } - final int threadPoolSize = Integer.parseInt((String) jobParameters.get("thread-pool-size").getValue()); - final int batchSize = Integer.parseInt((String) jobParameters.get("batch-size").getValue()); + final int threadPoolSize = Integer.parseInt(jobParameters.getString("thread-pool-size")); + final int batchSize = Integer.parseInt(jobParameters.getString("batch-size")); recalculateInterest(office, threadPoolSize, batchSize); } else { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansConfig.java index 76d3fc9cc8a..d34a8ae8082 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansConfig.java @@ -22,11 +22,11 @@ import org.apache.fineract.portfolio.account.service.AccountAssociationsReadPlatformService; import org.apache.fineract.portfolio.account.service.AccountTransfersWritePlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansTasklet.java index b0c30566979..d252ce79239 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/transferfeechargeforloans/TransferFeeChargeForLoansTasklet.java @@ -39,10 +39,10 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService; import org.apache.fineract.portfolio.loanproduct.exception.LinkedAccountRequiredException; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsConfig.java index b9b61ccea86..d4d0fb6a18d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsConfig.java @@ -20,11 +20,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.savings.service.SavingsAccrualWritePlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsTasklet.java index 5638221996b..0143661e481 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/addaccrualtransactionforsavings/AddAccrualTransactionForSavingsTasklet.java @@ -24,10 +24,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.portfolio.savings.service.SavingsAccrualWritePlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @RequiredArgsConstructor public class AddAccrualTransactionForSavingsTasklet implements Tasklet { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsConfig.java index f2170bcba51..1c31d2ef3de 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsTasklet.java index eb929d523ac..83e02ec2a09 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/applyannualfeeforsavings/ApplyAnnualFeeForSavingsTasklet.java @@ -28,10 +28,10 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountAnnualFeeData; import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleConfig.java index f49661a690d..1696216f858 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleConfig.java @@ -20,11 +20,11 @@ import org.apache.fineract.adhocquery.service.AdHocReadPlatformService; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleTasklet.java index e5c71132469..9be457639c1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generateadhocclientschhedule/GenerateAdhocClientScheduleTasklet.java @@ -30,10 +30,10 @@ import org.apache.fineract.adhocquery.service.AdHocReadPlatformService; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.jdbc.core.JdbcTemplate; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleConfig.java index 64cc452ce31..2b60a0b0a3f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleConfig.java @@ -22,11 +22,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleTasklet.java index e49ffe3ce5e..eab90cbb85c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/generaterdschedule/GenerateRdScheduleTasklet.java @@ -37,10 +37,10 @@ import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.savings.DepositAccountUtils; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.jdbc.core.JdbcTemplate; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesConfig.java index 8da16a36593..87c9f6d13b2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesTasklet.java index 0fb54dbaeab..8bfe5d2da98 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/payduesavingscharges/PayDueSavingsChargesTasklet.java @@ -30,10 +30,10 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountAnnualFeeData; import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingConfig.java index b82dd2397b3..4102cab7877 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingConfig.java @@ -25,11 +25,11 @@ import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; import org.apache.fineract.portfolio.savings.service.SavingsSchedularInterestPosterTask; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingTasklet.java index e579456ec3c..6b1433a0261 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/postinterestforsavings/PostInterestForSavingTasklet.java @@ -38,10 +38,10 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountData; import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsSchedularInterestPosterTask; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsConfig.java index 255b4912deb..e41ccb90ec4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.account.service.AccountTransfersWritePlatformService; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsTasklet.java index 0632438c1e2..75da073df66 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/transferinteresttosavings/TransferInterestToSavingsTasklet.java @@ -29,10 +29,10 @@ import org.apache.fineract.portfolio.account.service.AccountTransfersWritePlatformService; import org.apache.fineract.portfolio.savings.exception.InsufficientAccountBalanceException; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsConfig.java index 0a02bfc7705..d86cbcf7947 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.DepositAccountWritePlatformService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsTasklet.java index 5f956586a40..1dc6561e6c0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatedepositsaccountmaturitydetails/UpdateDepositsAccountMaturityDetailsTasklet.java @@ -29,10 +29,10 @@ import org.apache.fineract.portfolio.savings.data.DepositAccountData; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.DepositAccountWritePlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsConfig.java index 87222732432..233e454e919 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsConfig.java @@ -19,11 +19,11 @@ package org.apache.fineract.portfolio.savings.jobs.updatesavingsdormantaccounts; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsTasklet.java index 29c751cd613..76663e7a3ba 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/jobs/updatesavingsdormantaccounts/UpdateSavingsDormantAccountsTasklet.java @@ -25,10 +25,10 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountWritePlatformService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesConfig.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesConfig.java index 48e8c6152c1..83395f8d938 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesConfig.java @@ -21,11 +21,11 @@ import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.portfolio.shareaccounts.service.ShareAccountDividendReadPlatformService; import org.apache.fineract.portfolio.shareaccounts.service.ShareAccountSchedularService; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesTasklet.java index a85515b7c0f..34c9077735f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/jobs/postdividentsforshares/PostDividentsForSharesTasklet.java @@ -29,10 +29,10 @@ import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.portfolio.shareaccounts.service.ShareAccountDividendReadPlatformService; import org.apache.fineract.portfolio.shareaccounts.service.ShareAccountSchedularService; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @Slf4j @RequiredArgsConstructor From cb6f441eb9d28f473cf76625217c0f6428b7f2b4 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 00:11:41 +0530 Subject: [PATCH 17/63] FINERACT-2621: force spring-core 6.2 on the buildscript classpath Signed-off-by: avinashvijayvargiya --- build.gradle | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.gradle b/build.gradle index aec353d394a..17134efac85 100644 --- a/build.gradle +++ b/build.gradle @@ -97,6 +97,15 @@ buildscript { maven { url 'https://plugins.gradle.org/m2/' } } + configurations.classpath { + resolutionStrategy { + // The Spring Boot 4 Gradle plugin pulls spring-core 7.x onto the shared buildscript + // classpath, but the hierynomus license plugin's transitive license-maven-plugin:3.0 + // needs a PropertyPlaceholderHelper constructor that Spring Framework 7 removed. + force 'org.springframework:spring-core:6.2.18' + } + } + dependencies { classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0' classpath 'org.eclipse.persistence:eclipselink:4.0.9' From 19f836842bbf5086d0d08c09f265f1f8102243e8 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 00:11:42 +0530 Subject: [PATCH 18/63] FINERACT-2621: migrate custom acme job to Spring Batch 6 Signed-off-by: avinashvijayvargiya --- .../acme/fineract/loan/job/AcmeNoopJobConfiguration.java | 6 +++--- .../java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java index e6545cdc0ee..696758f0d39 100644 --- a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java +++ b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java @@ -19,10 +19,10 @@ package com.acme.fineract.loan.job; import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; -import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; diff --git a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java index 4c644e1cec2..3086426b5df 100644 --- a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java +++ b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java @@ -19,10 +19,10 @@ package com.acme.fineract.loan.job; import lombok.extern.slf4j.Slf4j; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Slf4j From e141ebad0a77061a60f8188b3e19cba39d9fe50a Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 09:09:30 +0530 Subject: [PATCH 19/63] FINERACT-2621: migrate fineract-provider server code to Jackson 3 Signed-off-by: avinashvijayvargiya --- .../email/data/EmailDataValidator.java | 4 ++-- .../EmailCampaignDomainServiceImpl.java | 16 ++++++------- ...mpaignWritePlatformCommandHandlerImpl.java | 15 ++++++------ .../EmailCampaignWritePlatformService.java | 3 +-- ...ailOutboundWithCampaignMessageTasklet.java | 8 +++---- .../service/SmsCampaignDomainServiceImpl.java | 10 ++++---- ...msCampaignWritePlatformServiceJpaImpl.java | 23 +++++++++---------- .../hooks/processor/TwilioHookProcessor.java | 2 +- .../jobs/ScheduledJobRunnerConfig.java | 10 ++++---- .../jobs/filter/COBFilterApiMatcher.java | 8 ++++--- .../jobs/filter/LoanCOBFilterHelperImpl.java | 14 +++-------- .../ProgressiveLoanModelCheckerHelper.java | 17 +++----------- ...WorkingCapitalLoanCOBFilterHelperImpl.java | 18 +++------------ .../retainedearning/helper/DataParser.java | 8 +++---- .../validation/ReportMailingJobValidator.java | 4 ++-- .../service/TemplateMergeServiceImpl.java | 2 +- 16 files changed, 65 insertions(+), 97 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/data/EmailDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/data/EmailDataValidator.java index d598811027f..32c46996a8c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/data/EmailDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/data/EmailDataValidator.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.campaigns.email.data; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Splitter; import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; @@ -45,6 +43,8 @@ import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Component public final class EmailDataValidator { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignDomainServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignDomainServiceImpl.java index 4b098de2570..35f65b43234 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignDomainServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignDomainServiceImpl.java @@ -18,10 +18,7 @@ */ package org.apache.fineract.infrastructure.campaigns.email.service; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; -import java.io.IOException; import java.util.HashMap; import java.util.List; import lombok.RequiredArgsConstructor; @@ -37,6 +34,9 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.springframework.stereotype.Service; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Service @RequiredArgsConstructor @@ -62,7 +62,7 @@ public void onBusinessEvent(LoanTransactionMakeRepaymentPostBusinessEvent event) LoanTransaction loanTransaction = event.get(); try { notifyLoanOwner(loanTransaction, "Loan Repayment"); - } catch (IOException e) { + } catch (JacksonException e) { log.error("Exception when trying to send triggered email: {}", e.getMessage()); } } @@ -75,7 +75,7 @@ public void onBusinessEvent(LoanRejectedBusinessEvent event) { Loan loan = event.get(); try { notifyLoanOwner(loan, "Loan Rejected"); - } catch (IOException e) { + } catch (JacksonException e) { log.error("Exception when trying to send triggered email: {}", e.getMessage()); } } @@ -88,13 +88,13 @@ public void onBusinessEvent(LoanApprovedBusinessEvent event) { Loan loan = event.get(); try { notifyLoanOwner(loan, "Loan Approved"); - } catch (IOException e) { + } catch (JacksonException e) { log.error("Exception when trying to send triggered email: {}", e.getMessage()); } } } - private void notifyLoanOwner(LoanTransaction loanTransaction, String paramValue) throws IOException { + private void notifyLoanOwner(LoanTransaction loanTransaction, String paramValue) { List campaigns = this.retrieveEmailCampaigns(paramValue); for (EmailCampaign emailCampaign : campaigns) { HashMap campaignParams = new ObjectMapper().readValue(emailCampaign.getParamValue(), @@ -106,7 +106,7 @@ private void notifyLoanOwner(LoanTransaction loanTransaction, String paramValue) } } - private void notifyLoanOwner(Loan loan, String paramValue) throws IOException { + private void notifyLoanOwner(Loan loan, String paramValue) { List campaigns = this.retrieveEmailCampaigns(paramValue); for (EmailCampaign emailCampaign : campaigns) { HashMap campaignParams = new ObjectMapper().readValue(emailCampaign.getParamValue(), diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java index dad30bdd368..cf80612ebad 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java @@ -18,15 +18,12 @@ */ package org.apache.fineract.infrastructure.campaigns.email.service; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import com.google.gson.Gson; import jakarta.mail.internet.AddressException; import jakarta.mail.internet.InternetAddress; -import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.time.LocalDate; @@ -76,6 +73,9 @@ import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Service @Slf4j @@ -213,7 +213,7 @@ public void insertDirectCampaignIntoEmailOutboundTable(final Loan loan, final Em } } } - } catch (final IOException e) { + } catch (final JacksonException e) { // TODO throw something here } @@ -246,7 +246,7 @@ private void insertDirectCampaignIntoEmailOutboundTable(final String emailParams } } } - } catch (final IOException e) { + } catch (final JacksonException e) { // TODO throw something here } @@ -353,8 +353,7 @@ private String compileEmailTemplate(final String textMessageTemplate, final Stri @SuppressWarnings({ "unused", "rawtypes" }) @Override - public List> getRunReportByServiceImpl(final String reportName, final Map queryParams) - throws IOException { + public List> getRunReportByServiceImpl(final String reportName, final Map queryParams) { final String reportType = "report"; List> resultList; @@ -409,7 +408,7 @@ public PreviewCampaignMessage previewMessage(final JsonQuery query) { } } } - } catch (final IOException e) { + } catch (final JacksonException e) { // TODO throw something here } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformService.java index 14ad6559e96..56f1f2b98bd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformService.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.infrastructure.campaigns.email.service; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,7 +43,7 @@ public interface EmailCampaignWritePlatformService { CommandProcessingResult reactivateEmailCampaign(Long campaignId, JsonCommand command); @SuppressWarnings({ "unused", "rawtypes" }) - List> getRunReportByServiceImpl(String reportName, Map queryParams) throws IOException; + List> getRunReportByServiceImpl(String reportName, Map queryParams); PreviewCampaignMessage previewMessage(JsonQuery query); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java index 895d0150a2a..a53afe559a3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/jobs/updateemailoutboundwithcampaignmessage/UpdateEmailOutboundWithCampaignMessageTasklet.java @@ -18,14 +18,11 @@ */ package org.apache.fineract.infrastructure.campaigns.jobs.updateemailoutboundwithcampaignmessage; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import jakarta.mail.internet.AddressException; import jakarta.mail.internet.InternetAddress; -import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.time.LocalDateTime; @@ -51,6 +48,9 @@ import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Slf4j @RequiredArgsConstructor @@ -104,7 +104,7 @@ private void insertDirectCampaignIntoEmailOutboundTable(final String emailParams } } } - } catch (IOException e) { + } catch (JacksonException e) { throw new EmailParamMappingException(e); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java index ec8aa53abdd..f98bff045c5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java @@ -19,10 +19,7 @@ package org.apache.fineract.infrastructure.campaigns.sms.service; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; -import java.io.IOException; import java.security.InvalidParameterException; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; @@ -69,6 +66,9 @@ import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; import org.springframework.stereotype.Service; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Service @Slf4j @@ -224,7 +224,7 @@ private void sendSmsForLoanRepayment(LoanTransaction loanTransaction) { } } } - } catch (final IOException e) { + } catch (final JacksonException e) { log.error("smsParams does not contain the key: ", e); } catch (final RuntimeException e) { log.debug("Client Office Id and SMS Campaign Office id doesn't match ", e); @@ -283,7 +283,7 @@ private void sendSmsForSavingsTransaction(final SavingsAccountTransaction saving smsDataMap.put(smsCampaign, messages); this.smsMessageScheduledJobService.sendTriggeredMessages(smsDataMap); } - } catch (final IOException e) { + } catch (final JacksonException e) { log.error("smsParams does not contain the key: ", e); } catch (final RuntimeException e) { log.debug("Client Office Id and SMS Campaign Office id doesn't match ", e); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java index 695466680bb..062bb885bd5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java @@ -18,14 +18,10 @@ */ package org.apache.fineract.infrastructure.campaigns.sms.service; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import com.google.gson.JsonElement; -import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.time.LocalDate; @@ -82,6 +78,10 @@ import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import tools.jackson.core.JacksonException; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Service @Slf4j @@ -232,7 +232,7 @@ public void insertDirectCampaignIntoSmsOutboundTable(SmsCampaign smsCampaign) { } } } - } catch (final IOException e) { + } catch (final JacksonException e) { log.error("Error occurred.", e); } @@ -294,7 +294,7 @@ public void insertDirectCampaignIntoSmsOutboundTable(final Loan loan, final SmsC } } } - } catch (final IOException | RuntimeException e) { + } catch (final RuntimeException e) { log.error("Error occured.", e); } } @@ -336,7 +336,7 @@ public void insertDirectCampaignIntoSmsOutboundTable(final Client client, final } } } - } catch (final IOException | RuntimeException e) { + } catch (final RuntimeException e) { log.error("Error occured.", e); } } @@ -377,7 +377,7 @@ public void insertDirectCampaignIntoSmsOutboundTable(final SavingsAccount saving } } } - } catch (final IOException | RuntimeException e) { + } catch (final RuntimeException e) { log.error("Error occured.", e); } } @@ -463,8 +463,7 @@ public String compileSmsTemplate(final String textMessageTemplate, final String return stringWriter.toString(); } - private List> getRunReportByServiceImpl(final String reportName, final Map queryParams) - throws IOException { + private List> getRunReportByServiceImpl(final String reportName, final Map queryParams) { final String reportType = "report"; List> resultList = new ArrayList<>(); @@ -474,7 +473,7 @@ private List> getRunReportByServiceImpl(final String rep try { final String response = this.genericDataService.generateJsonFromGenericResultsetData(results); resultList = new ObjectMapper().readValue(response, new TypeReference>>() {}); - } catch (JsonParseException e) { + } catch (StreamReadException e) { log.warn("Conversion of report query results to JSON failed", e); return resultList; } @@ -525,7 +524,7 @@ public CampaignPreviewData previewMessage(final JsonQuery query) { } else { campaignMessage = new CampaignPreviewData(textMessageTemplate, 0); } - } catch (final IOException e) { + } catch (final JacksonException e) { // TODO throw something here } return campaignMessage; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java index b1b00e8b80f..7154ec2b2db 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java @@ -22,7 +22,6 @@ import static org.apache.fineract.commands.domain.CommandWrapperConstants.ENTITY_SMS; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -41,6 +40,7 @@ import org.apache.fineract.template.service.TemplateMergeService; import org.springframework.stereotype.Service; import retrofit2.Callback; +import tools.jackson.databind.ObjectMapper; @Service @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java index 82a997ae6b0..0e909c4d08b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java @@ -23,7 +23,7 @@ import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.launch.support.TaskExecutorJobLauncher; import org.springframework.batch.core.repository.JobRepository; -import org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer; +import org.springframework.batch.core.repository.dao.JacksonExecutionContextStringSerializer; import org.springframework.batch.core.repository.explore.JobExplorer; import org.springframework.batch.core.repository.explore.support.JobExplorerFactoryBean; import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; @@ -38,8 +38,8 @@ public class ScheduledJobRunnerConfig { @Bean - public Jackson2ExecutionContextStringSerializer executionContextSerializer() { - return new Jackson2ExecutionContextStringSerializer(); + public JacksonExecutionContextStringSerializer executionContextSerializer() { + return new JacksonExecutionContextStringSerializer(); } @Bean @@ -52,7 +52,7 @@ public DataFieldMaxValueIncrementerFactory incrementerFactory(RoutingDataSource @Bean public JobRepository jobRepository(RoutingDataSource routingDataSource, @Qualifier("jdbcTransactionManager") PlatformTransactionManager transactionManager, - Jackson2ExecutionContextStringSerializer executionContextSerializer, DataFieldMaxValueIncrementerFactory incrementerFactory) + JacksonExecutionContextStringSerializer executionContextSerializer, DataFieldMaxValueIncrementerFactory incrementerFactory) throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(routingDataSource); @@ -73,7 +73,7 @@ public JobRepository jobRepository(RoutingDataSource routingDataSource, @Bean public JobExplorer jobExplorer(RoutingDataSource routingDataSource, @Qualifier("jdbcTransactionManager") PlatformTransactionManager transactionManager, - Jackson2ExecutionContextStringSerializer executionContextSerializer) throws Exception { + JacksonExecutionContextStringSerializer executionContextSerializer) throws Exception { JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); jobExplorerFactoryBean.setDataSource(routingDataSource); jobExplorerFactoryBean.setTransactionManager(transactionManager); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/COBFilterApiMatcher.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/COBFilterApiMatcher.java index d837252626d..169910f3e65 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/COBFilterApiMatcher.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/COBFilterApiMatcher.java @@ -20,17 +20,19 @@ import static org.apache.fineract.batch.command.CommandStrategyUtils.isRelativeUrlVersioned; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.batch.domain.BatchRequest; import org.apache.fineract.infrastructure.core.http.BodyCachingHttpServletRequestWrapper; +import tools.jackson.core.json.JsonReadFeature; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; public abstract class COBFilterApiMatcher implements COBFilterHelper { - protected final ObjectMapper objectMapper = new ObjectMapper(); + protected final ObjectMapper objectMapper = JsonMapper.builder().enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS).build(); @Override public boolean isOnApiList(BodyCachingHttpServletRequestWrapper request) throws IOException { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java index fc3543acbf5..c5345dd4d50 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java @@ -19,9 +19,6 @@ package org.apache.fineract.infrastructure.jobs.filter; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.json.JsonReadFeature; -import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Lists; import java.io.IOException; import java.math.BigDecimal; @@ -51,16 +48,16 @@ import org.apache.fineract.portfolio.loanaccount.domain.GLIMAccountInfoRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequestRepository; -import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Conditional; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import tools.jackson.databind.JsonNode; @RequiredArgsConstructor @Component @Conditional(LoanCOBEnabledCondition.class) -public class LoanCOBFilterHelperImpl extends COBFilterApiMatcher implements LoanCOBFilterHelper, InitializingBean { +public class LoanCOBFilterHelperImpl extends COBFilterApiMatcher implements LoanCOBFilterHelper { private final GLIMAccountInfoRepository glimAccountInfoRepository; private final LoanAccountLockService loanAccountLockService; @@ -191,7 +188,7 @@ private List getLoanIdsFromBatchApi(BodyCachingHttpServletRequestWrapper r return loanIds; } - private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) throws JsonProcessingException { + private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) { String body = batchRequest.getBody(); if (StringUtils.isNotBlank(body)) { JsonNode jsonNode = objectMapper.readTree(body); @@ -229,9 +226,4 @@ public void executeInlineCob(List loanIds) { inlineLoanCOBExecutorService.execute(loanIds, LoanCOBConstant.INLINE_LOAN_COB_JOB_NAME); } - @Override - public void afterPropertiesSet() throws Exception { - objectMapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true); - } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java index ac299192146..cd83bc5b6d5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java @@ -18,10 +18,6 @@ */ package org.apache.fineract.infrastructure.jobs.filter; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.json.JsonReadFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; @@ -38,21 +34,19 @@ import org.apache.fineract.portfolio.loanaccount.domain.GLIMAccountInfoRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequestRepository; -import org.springframework.beans.factory.InitializingBean; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import tools.jackson.databind.JsonNode; @RequiredArgsConstructor @Component -public class ProgressiveLoanModelCheckerHelper extends COBFilterApiMatcher implements InitializingBean { +public class ProgressiveLoanModelCheckerHelper extends COBFilterApiMatcher { private final GLIMAccountInfoRepository glimAccountInfoRepository; private final LoanRepository loanRepository; private final LoanRescheduleRequestRepository loanRescheduleRequestRepository; - private final ObjectMapper objectMapper = new ObjectMapper(); - private static final List HTTP_METHODS = List.of(HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE); public static final Pattern IGNORE_LOAN_PATH_PATTERN = Pattern.compile("/v[1-9][0-9]*/loans/catch-up"); @@ -133,7 +127,7 @@ private List getLoanIdsFromBatchApi(BodyCachingHttpServletRequestWrapper r return loanIds; } - private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) throws JsonProcessingException { + private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) { String body = batchRequest.getBody(); if (StringUtils.isNotBlank(body)) { JsonNode jsonNode = objectMapper.readTree(body); @@ -161,11 +155,6 @@ private List getLoanIdList(String pathInfo) { } } - @Override - public void afterPropertiesSet() throws Exception { - objectMapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true); - } - @Override public boolean isBypassUser() { throw new NotImplementedException(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java index bdfa252d898..8872db6ff19 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java @@ -19,10 +19,6 @@ package org.apache.fineract.infrastructure.jobs.filter; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.json.JsonReadFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; @@ -50,17 +46,16 @@ import org.apache.fineract.infrastructure.jobs.exception.LoanIdsHardLockedException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; -import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Conditional; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import tools.jackson.databind.JsonNode; @RequiredArgsConstructor @Component @Conditional(LoanCOBEnabledCondition.class) -public class WorkingCapitalLoanCOBFilterHelperImpl extends COBFilterApiMatcher - implements WorkingCapitalLoanCOBFilterHelper, InitializingBean { +public class WorkingCapitalLoanCOBFilterHelperImpl extends COBFilterApiMatcher implements WorkingCapitalLoanCOBFilterHelper { private final AbstractAccountLockService loanAccountLockService; private final PlatformSecurityContext context; @@ -69,8 +64,6 @@ public class WorkingCapitalLoanCOBFilterHelperImpl extends COBFilterApiMatcher private final FineractProperties fineractProperties; private final WorkingCapitalLoanRetrieveIdService retrieveIdService; - private final ObjectMapper objectMapper = new ObjectMapper(); - private static final List HTTP_METHODS = List.of(HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE); public static final Pattern IGNORE_LOAN_PATH_PATTERN = Pattern.compile("/v[1-9][0-9]*/working-capital-loans/catch-up"); @@ -171,7 +164,7 @@ private List getLoanIdsFromBatchApi(BodyCachingHttpServletRequestWrapper r return loanIds; } - private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) throws JsonProcessingException { + private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) { String body = batchRequest.getBody(); if (StringUtils.isNotBlank(body)) { JsonNode jsonNode = objectMapper.readTree(body); @@ -204,9 +197,4 @@ public void executeInlineCob(List loanIds) { inlineLoanCOBExecutorService.execute(loanIds, WorkingCapitalLoanCOBConstant.INLINE_WORKING_CAPITAL_LOAN_COB_JOB_NAME); } - @Override - public void afterPropertiesSet() throws Exception { - objectMapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true); - } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/helper/DataParser.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/helper/DataParser.java index f7d0cab5895..d0b30255fb3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/helper/DataParser.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/helper/DataParser.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.jobs.service.retainedearning.helper; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -30,6 +28,8 @@ import org.apache.fineract.infrastructure.core.service.ExternalIdFactory; import org.apache.fineract.infrastructure.jobs.service.retainedearning.model.AccountGLJournalEntryAnnualSummaryRecord; import org.springframework.stereotype.Component; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; @Component public class DataParser { @@ -52,7 +52,7 @@ public List parse(final String json) t // Get column names in order final List columns = new ArrayList<>(); columns.addAll(StreamSupport.stream(root.path("columnHeaders").spliterator(), false) - .map(header -> header.path("columnName").asText()).collect(Collectors.toList())); + .map(header -> header.path("columnName").asString()).collect(Collectors.toList())); final List records = StreamSupport.stream(root.path("data").spliterator(), false) .map(data -> { @@ -60,7 +60,7 @@ public List parse(final String json) t // Create row dataMap Map Map rowData = IntStream.range(0, Math.min(columns.size(), row.size())).boxed() - .collect(Collectors.toMap(i -> columns.get(i), i -> row.get(i).asText())); + .collect(Collectors.toMap(i -> columns.get(i), i -> row.get(i).asString())); // Build record return AccountGLJournalEntryAnnualSummaryRecord.builder().postingDate(rowData.get("postingdate")) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/validation/ReportMailingJobValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/validation/ReportMailingJobValidator.java index 92608f51020..f9f82399823 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/validation/ReportMailingJobValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/validation/ReportMailingJobValidator.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.reportmailingjob.validation; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Splitter; import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; @@ -45,6 +43,8 @@ import org.apache.fineract.infrastructure.reportmailingjob.data.ReportMailingJobEmailAttachmentFileFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Component public class ReportMailingJobValidator { diff --git a/fineract-provider/src/main/java/org/apache/fineract/template/service/TemplateMergeServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/template/service/TemplateMergeServiceImpl.java index e484401ee02..7a7b49b7dbe 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/template/service/TemplateMergeServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/template/service/TemplateMergeServiceImpl.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.template.service; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; @@ -51,6 +50,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import tools.jackson.databind.ObjectMapper; @Slf4j @RequiredArgsConstructor From f18b455e312782058ab78f5c30c7f007aea716a2 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 09:17:39 +0530 Subject: [PATCH 20/63] FINERACT-2621: switch fineract-provider to JSpecify annotations Signed-off-by: avinashvijayvargiya --- .../fineract/cob/loan/AbstractLoanItemProcessor.java | 2 +- .../fineract/cob/loan/AbstractLoanItemReader.java | 2 +- .../fineract/cob/loan/AbstractLoanItemWriter.java | 2 +- .../fineract/cob/loan/InlineCOBLoanItemReader.java | 2 +- .../apache/fineract/cob/loan/LoanCOBPartitioner.java | 2 +- .../org/apache/fineract/cob/loan/LoanItemReader.java | 2 +- .../loan/WorkingCapitalInlineCOBLoanItemReader.java | 2 +- .../core/auditing/CustomAuditingHandler.java | 2 +- ...reditBureauIntegrationWritePlatformServiceImpl.java | 2 +- .../dataqueries/service/DatatableReadServiceImpl.java | 2 +- .../dataqueries/service/DatatableUtil.java | 2 +- .../dataqueries/service/DatatableWriteServiceImpl.java | 2 +- .../EntityDatatableChecksReadPlatformServiceImpl.java | 2 +- .../dataqueries/service/GenericDataServiceImpl.java | 2 +- .../service/export/DatatableExportUtil.java | 2 +- .../service/SchedulerJobRunnerReadServiceImpl.java | 10 +++++----- .../infrastructure/jobs/service/StuckJobListener.java | 2 +- .../JournalEntryAggregationJobExecutionDecider.java | 2 +- .../JournalEntryAggregationJobWriter.java | 2 +- .../JournalEntryAggregationTrackingTasklet.java | 2 +- .../springbatch/InputChannelInterceptor.java | 2 +- .../springbatch/OutputChannelInterceptor.java | 2 +- .../interoperation/service/InteropService.java | 2 +- .../interoperation/service/InteropServiceImpl.java | 2 +- .../SpringNotificationEventListener.java | 2 +- .../addaccrualentries/AddAccrualEntriesTasklet.java | 2 +- .../serialization/LoanTransactionValidatorImpl.java | 2 +- .../LoanAccrualActivityProcessingServiceImpl.java | 2 +- .../service/LoanAccrualsProcessingServiceImpl.java | 2 +- ...oanBuyDownFeeAmortizationProcessingServiceImpl.java | 2 +- ...talizedIncomeAmortizationProcessingServiceImpl.java | 2 +- .../loanaccount/service/LoanDisbursementService.java | 2 +- .../loanaccount/service/LoanTransactionAssembler.java | 2 +- .../service/LoanProductReadPlatformServiceImpl.java | 2 +- .../SavingsAccountTransactionsSearchServiceImpl.java | 4 ++-- 35 files changed, 40 insertions(+), 40 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java index 8a5ae95ec44..ee1d6ebd5f7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java @@ -23,7 +23,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanModelProcessingService; import org.apache.fineract.portfolio.loanproduct.calc.data.ProgressiveLoanInterestScheduleModel; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public abstract class AbstractLoanItemProcessor extends AbstractItemProcessor { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java index 9833b746623..f363aef38fc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java @@ -26,12 +26,12 @@ import org.apache.fineract.cob.exceptions.LockedReadException; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.annotation.AfterStep; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ItemReader; import org.springframework.data.repository.CrudRepository; -import org.springframework.lang.NonNull; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java index cd1b8f65538..726c2edc394 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemWriter.java @@ -24,10 +24,10 @@ import org.apache.fineract.cob.domain.LockingService; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.portfolio.loanaccount.domain.Loan; +import org.jspecify.annotations.NonNull; import org.springframework.batch.infrastructure.item.Chunk; import org.springframework.batch.infrastructure.item.data.RepositoryItemWriter; import org.springframework.data.repository.CrudRepository; -import org.springframework.lang.NonNull; @Slf4j public abstract class AbstractLoanItemWriter extends RepositoryItemWriter { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java index d30321de94d..1ad2deb3023 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java @@ -22,10 +22,10 @@ import java.util.concurrent.LinkedBlockingQueue; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.annotation.BeforeStep; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; -import org.springframework.lang.NonNull; public class InlineCOBLoanItemReader extends AbstractLoanItemReader { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java index 134c77eeda2..bcc1ab557b9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java @@ -26,11 +26,11 @@ import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.cob.service.RetrieveIdService; import org.apache.fineract.infrastructure.springbatch.PropertyService; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.partition.Partitioner; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; -import org.springframework.lang.NonNull; @Slf4j public class LoanCOBPartitioner extends CommonPartitioner implements Partitioner { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java index 5fbdc7cfd79..8a55e64daab 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java @@ -22,9 +22,9 @@ import org.apache.fineract.cob.service.BeforeStepLockingItemReaderHelper; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.annotation.BeforeStep; import org.springframework.batch.core.step.StepExecution; -import org.springframework.lang.NonNull; @Slf4j public class LoanItemReader extends AbstractLoanItemReader { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java index eb3a97ddf48..8c4ed456bc5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java @@ -23,10 +23,10 @@ import org.apache.fineract.cob.COBConstant; import org.apache.fineract.portfolio.workingcapitalloan.domain.WorkingCapitalLoan; import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.annotation.BeforeStep; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; -import org.springframework.lang.NonNull; public class WorkingCapitalInlineCOBLoanItemReader extends AbstractLoanItemReader { 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 8503c2824dc..490ed5a4004 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 @@ -19,6 +19,7 @@ package org.apache.fineract.infrastructure.core.auditing; import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; +import org.jspecify.annotations.NonNull; import org.springframework.data.auditing.AuditableBeanWrapper; import org.springframework.data.auditing.AuditingHandler; import org.springframework.data.auditing.DateTimeProvider; @@ -27,7 +28,6 @@ import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.PersistentEntities; -import org.springframework.lang.NonNull; import org.springframework.util.Assert; public class CustomAuditingHandler extends AuditingHandler { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImpl.java index 64c52a7248c..9eea963d570 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ExternalCreditBureauIntegrationWritePlatformServiceImpl.java @@ -66,7 +66,7 @@ import org.apache.fineract.infrastructure.creditbureau.serialization.CreditBureauTokenCommandFromApiJsonDeserializer; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImpl.java index 5d38c4a9a2e..f36fd0e4806 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableReadServiceImpl.java @@ -41,13 +41,13 @@ import org.apache.fineract.portfolio.search.data.AdvancedQueryData; import org.apache.fineract.portfolio.search.data.ColumnFilterData; import org.apache.fineract.portfolio.search.service.SearchUtil; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.support.PageableExecutionUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.SqlRowSet; -import org.springframework.lang.NonNull; import org.springframework.transaction.annotation.Transactional; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableUtil.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableUtil.java index 6577513d3e4..bdf4a3f57f2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableUtil.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableUtil.java @@ -43,9 +43,9 @@ import org.apache.fineract.infrastructure.security.utils.ColumnValidator; import org.apache.fineract.portfolio.search.service.SearchUtil; import org.apache.fineract.useradministration.domain.AppUser; +import org.jspecify.annotations.NonNull; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.SqlRowSet; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableWriteServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableWriteServiceImpl.java index d28916bf3cf..522e6d760b2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableWriteServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/DatatableWriteServiceImpl.java @@ -105,13 +105,13 @@ import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.search.service.SearchUtil; +import org.jspecify.annotations.NonNull; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.lang.NonNull; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksReadPlatformServiceImpl.java index f3ac77f6a07..45a2cf6c86f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksReadPlatformServiceImpl.java @@ -44,9 +44,9 @@ import org.apache.fineract.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.apache.fineract.portfolio.savings.data.SavingsProductData; import org.apache.fineract.portfolio.savings.service.SavingsProductReadPlatformService; +import org.jspecify.annotations.NonNull; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; @Service diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java index 76aacc6c452..8de7558a596 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java @@ -48,11 +48,11 @@ import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnValueData; import org.apache.fineract.infrastructure.dataqueries.data.ResultsetRowData; import org.apache.fineract.infrastructure.dataqueries.exception.DatatableNotFoundException; +import org.jspecify.annotations.NonNull; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.jdbc.support.rowset.SqlRowSetMetaData; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; @Service diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/DatatableExportUtil.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/DatatableExportUtil.java index 3b333a9a473..c2040d3f0b4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/DatatableExportUtil.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/export/DatatableExportUtil.java @@ -23,7 +23,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.service.DateUtils; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public final class DatatableExportUtil { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadServiceImpl.java index bd708b125fb..8a465c0cb25 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobRunnerReadServiceImpl.java @@ -34,10 +34,10 @@ import org.apache.fineract.infrastructure.jobs.exception.JobNotFoundException; import org.apache.fineract.infrastructure.jobs.exception.OperationNotAllowedException; import org.apache.fineract.infrastructure.security.utils.ColumnValidator; +import org.jspecify.annotations.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -71,7 +71,7 @@ public List findAllJobDetails() { } @Override - public JobDetailData retrieveOne(@NonNull IdTypeResolver.IdType idType, String identifier) { + public JobDetailData retrieveOne(IdTypeResolver.@NonNull IdType idType, String identifier) { JobDetailData jobDetail = switch (idType) { case ID -> jobDetailRepository.getDataById(Long.valueOf(identifier)); case SHORT_NAME -> jobDetailRepository.getDataByShortName(identifier); @@ -84,7 +84,7 @@ public JobDetailData retrieveOne(@NonNull IdTypeResolver.IdType idType, String i } @Override - public Page retrieveJobHistory(@NonNull IdTypeResolver.IdType idType, String identifier, + public Page retrieveJobHistory(IdTypeResolver.@NonNull IdType idType, String identifier, SearchParameters searchParameters) { if (!isJobExist(idType, identifier)) { throw new JobNotFoundException(idType, identifier); @@ -128,7 +128,7 @@ public Page retrieveJobHistory(@NonNull IdTypeResolver.IdT @Override @NonNull - public Long retrieveId(@NonNull IdTypeResolver.IdType idType, String identifier) { + public Long retrieveId(IdTypeResolver.@NonNull IdType idType, String identifier) { return switch (idType) { case ID -> Long.valueOf(identifier); case SHORT_NAME -> @@ -149,7 +149,7 @@ public boolean isUpdatesAllowed() { return true; } - private boolean isJobExist(@NonNull IdTypeResolver.IdType idType, @NonNull String jobId) { + private boolean isJobExist(IdTypeResolver.@NonNull IdType idType, @NonNull String jobId) { return switch (idType) { case ID -> jobDetailRepository.existsById(Long.valueOf(jobId)); case SHORT_NAME -> jobDetailRepository.existsByShortName(jobId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/StuckJobListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/StuckJobListener.java index c705a5582c3..15f06f12bc6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/StuckJobListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/StuckJobListener.java @@ -31,12 +31,12 @@ import org.apache.fineract.infrastructure.jobs.domain.JobExecutionRepository; import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java index d68a820648b..362dc0d2295 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDecider.java @@ -21,12 +21,12 @@ import java.time.LocalDate; import java.util.Objects; import lombok.extern.slf4j.Slf4j; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.job.flow.FlowExecutionStatus; import org.springframework.batch.core.job.flow.JobExecutionDecider; import org.springframework.batch.core.step.StepExecution; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java index 31929f104ca..a7e73b3c24b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriter.java @@ -23,12 +23,12 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.data.JournalEntryAggregationSummaryData; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.services.JournalEntryAggregationWriterService; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.listener.StepExecutionListener; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.Chunk; import org.springframework.batch.infrastructure.item.ItemWriter; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @Component diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java index 8c4f59d9083..9614440eb50 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTasklet.java @@ -26,13 +26,13 @@ import org.apache.fineract.infrastructure.jobs.service.aggregationjob.JournalEntryAggregationJobConstant; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.data.JournalEntryAggregationTrackingData; import org.apache.fineract.infrastructure.jobs.service.aggregationjob.services.JournalEntryAggregationWriterService; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/InputChannelInterceptor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/InputChannelInterceptor.java index 271ef26fa1d..2ccc1b80676 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/InputChannelInterceptor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/InputChannelInterceptor.java @@ -21,8 +21,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.domain.ActionContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; +import org.jspecify.annotations.NonNull; import org.springframework.batch.integration.partition.StepExecutionRequest; -import org.springframework.lang.NonNull; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/OutputChannelInterceptor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/OutputChannelInterceptor.java index fb8166e9e8c..41a590f9398 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/OutputChannelInterceptor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/OutputChannelInterceptor.java @@ -19,9 +19,9 @@ package org.apache.fineract.infrastructure.springbatch; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; +import org.jspecify.annotations.NonNull; import org.springframework.batch.integration.async.StepExecutionInterceptor; import org.springframework.batch.integration.partition.StepExecutionRequest; -import org.springframework.lang.NonNull; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.support.GenericMessage; diff --git a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java index a2e79a5ddfc..52459ea69ac 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropService.java @@ -29,7 +29,7 @@ import org.apache.fineract.interoperation.data.InteropTransactionsData; import org.apache.fineract.interoperation.data.InteropTransferResponseData; import org.apache.fineract.interoperation.domain.InteropIdentifierType; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; public interface InteropService { diff --git a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java index a8414585e63..ce3321ccad2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java @@ -108,11 +108,11 @@ import org.apache.fineract.portfolio.savings.exception.SavingsAccountNotFoundException; import org.apache.fineract.portfolio.savings.service.SavingsAccountDomainService; import org.apache.fineract.useradministration.domain.AppUser; +import org.jspecify.annotations.NonNull; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; -import org.springframework.lang.NonNull; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java index b01903eabae..c81dd0a342c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java @@ -22,9 +22,9 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.notification.data.NotificationData; +import org.jspecify.annotations.NonNull; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Profile; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @Component diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java index cc0ea101da3..138d20479a7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/jobs/addaccrualentries/AddAccrualEntriesTasklet.java @@ -25,11 +25,11 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.portfolio.loanaccount.service.LoanAccrualsProcessingService; +import org.jspecify.annotations.NonNull; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; @Slf4j diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java index a2795e600fd..886d609f3ff 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java @@ -94,7 +94,7 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService; import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Component; @Component("loanTransactionValidator") diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingServiceImpl.java index 474648b4f8d..79bd021a70e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingServiceImpl.java @@ -52,8 +52,8 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRelationTypeEnum; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; +import org.jspecify.annotations.NonNull; import org.springframework.data.domain.PageRequest; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java index fbb50eeaa1c..c78b6224d0e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java @@ -87,8 +87,8 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleGeneratorFactory; import org.apache.fineract.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail; +import org.jspecify.annotations.NonNull; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.lang.NonNull; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingServiceImpl.java index 07d410cd094..2010e3a4400 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanBuyDownFeeAmortizationProcessingServiceImpl.java @@ -44,7 +44,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository; import org.apache.fineract.portfolio.loanaccount.util.BuyDownFeeAmortizationUtil; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java index 2674b36015f..aa41ced6335 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java @@ -45,7 +45,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository; import org.apache.fineract.portfolio.loanaccount.util.CapitalizedIncomeAmortizationUtil; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDisbursementService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDisbursementService.java index 66b40cd6797..7e4bd334666 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDisbursementService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDisbursementService.java @@ -59,7 +59,7 @@ import org.apache.fineract.portfolio.loanaccount.serialization.LoanChargeValidator; import org.apache.fineract.portfolio.loanaccount.serialization.LoanDisbursementValidator; import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @Slf4j @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionAssembler.java index d199848968b..e6b1ab1eb21 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionAssembler.java @@ -35,7 +35,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; import org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @RequiredArgsConstructor public class LoanTransactionAssembler { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java index cd86e81bfd1..18e54b85c7f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -71,10 +71,10 @@ import org.apache.fineract.portfolio.loanproduct.exception.LoanProductNotFoundException; import org.apache.fineract.portfolio.rate.data.RateData; import org.apache.fineract.portfolio.rate.service.RateReadService; +import org.jspecify.annotations.NonNull; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; -import org.springframework.lang.NonNull; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java index 562f9883c2d..19fbc4dff85 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java @@ -49,14 +49,14 @@ import org.apache.fineract.portfolio.search.data.TableQueryData; import org.apache.fineract.portfolio.search.data.TransactionSearchRequest; import org.apache.fineract.portfolio.search.service.SearchUtil; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.support.PageableExecutionUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.SqlRowSet; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; import org.springframework.transaction.annotation.Transactional; @Transactional(readOnly = true) From 5c33485c336a6aec4c79643312ee3ec66ff95f4a Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 09:45:14 +0530 Subject: [PATCH 21/63] FINERACT-2621: replace deprecated Spring Batch APIs in fineract-provider Signed-off-by: avinashvijayvargiya --- .../cob/loan/LoanCOBWorkerConfiguration.java | 10 ++++--- .../cob/loan/LoanInlineCOBConfig.java | 2 +- .../WorkingCapitalLoanInlineCOBConfig.java | 8 +++--- .../AsyncCommonCOBExecutorService.java | 9 ++++--- .../AsyncLoanCOBExecutorServiceImpl.java | 6 ++--- ...kingCapitalLoanCOBExecutorServiceImpl.java | 6 ++--- ...nlineCommonLockableCOBExecutorService.java | 19 ++++++------- .../InlineLoanCOBExecutorServiceImpl.java | 8 +++--- ...kingCapitalLoanCOBExecutorServiceImpl.java | 8 +++--- .../jobs/ScheduledJobRunnerConfig.java | 27 ++----------------- .../jobs/service/JobRegisterServiceImpl.java | 13 ++++----- .../jobs/service/JobStarter.java | 6 ++--- .../service/StuckJobExecutorServiceImpl.java | 6 +++-- ...urnalEntryAggregationJobConfiguration.java | 5 ++-- .../RetainedEarningJobConfiguration.java | 5 ++-- 15 files changed, 59 insertions(+), 79 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java index 711f349e1f8..32db2792cf6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java @@ -37,13 +37,14 @@ import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.Step; -import org.springframework.batch.core.step.builder.SimpleStepBuilder; +import org.springframework.batch.core.step.builder.ChunkOrientedStepBuilder; import org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilderFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.SyncTaskExecutor; import org.springframework.core.task.TaskExecutor; import org.springframework.integration.channel.QueueChannel; @@ -92,8 +93,9 @@ public class LoanCOBWorkerConfiguration { @Bean(name = LoanCOBConstant.LOAN_COB_WORKER_STEP) public Step loanCOBWorkerStep() { - final SimpleStepBuilder stepBuilder = stepBuilderFactory.get("Loan COB worker - Step").inputChannel(inboundRequests) - .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name()), transactionManager) // + final ChunkOrientedStepBuilder stepBuilder = stepBuilderFactory.get("Loan COB worker - Step") + .inputChannel(inboundRequests) // + .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name())) // .reader(cobWorkerItemReader()) // .processor(cobWorkerItemProcessor()) // .writer(cobWorkerItemWriter()) // @@ -107,7 +109,7 @@ public Step loanCOBWorkerStep() { .transactionManager(transactionManager); if (propertyService.getThreadPoolMaxPoolSize(LoanCOBConstant.JOB_NAME) > 1) { - stepBuilder.taskExecutor(cobTaskExecutor()); + stepBuilder.taskExecutor((AsyncTaskExecutor) cobTaskExecutor()); } return stepBuilder.build(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java index e73a1054f20..448c84faecb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java @@ -90,7 +90,7 @@ protected Step inlineCOBBuildExecutionContextStep() { @Bean public Step inlineLoanCOBStep() { return new StepBuilder("Inline Loan COB Step", jobRepository) - .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name()), transactionManager) + .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name())).transactionManager(transactionManager) .reader(inlineCobWorkerItemReader()).processor(inlineCobWorkerItemProcessor()).writer(inlineCobWorkerItemWriter()) .listener(inlineCobLoanItemListener()).build(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java index 69f041fa472..fefc1fd7cea 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java @@ -91,10 +91,10 @@ public Step inlineWorkingCapitalLoanCOBStep(WorkingCapitalInlineCOBLoanItemReade InlineWorkingCapitalLoanCOBWorkerItemWriter inlineWorkingCapitalLoanCobWorkerItemWriter, InlineWorkingCapitalLoanCOBWorkerItemListener inlineWorkingCapitalLoanCobLoanItemListener) { return new StepBuilder("Inline Working Capital Loan COB Step", jobRepository) - .chunk(propertyService.getChunkSize(JobName.WORKING_CAPITAL_LOAN_COB_JOB.name()), - transactionManager) - .reader(inlineWorkingCapitalLoanCobWorkerItemReader).processor(inlineWorkingCapitalLoanCobWorkerItemProcessor) - .writer(inlineWorkingCapitalLoanCobWorkerItemWriter).listener(inlineWorkingCapitalLoanCobLoanItemListener).build(); + .chunk(propertyService.getChunkSize(JobName.WORKING_CAPITAL_LOAN_COB_JOB.name())) + .transactionManager(transactionManager).reader(inlineWorkingCapitalLoanCobWorkerItemReader) + .processor(inlineWorkingCapitalLoanCobWorkerItemProcessor).writer(inlineWorkingCapitalLoanCobWorkerItemWriter) + .listener(inlineWorkingCapitalLoanCobLoanItemListener).build(); } @Bean(name = "inlineWorkingCapitalLoanCOBJob") diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java index d76923e250a..b0b1f9856f8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncCommonCOBExecutorService.java @@ -40,7 +40,7 @@ import org.apache.fineract.infrastructure.jobs.service.JobStarter; import org.apache.fineract.infrastructure.jobs.service.SchedulerServiceConstants; import org.quartz.JobExecutionException; -import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.parameters.InvalidJobParametersException; import org.springframework.batch.core.launch.JobExecutionAlreadyRunningException; @@ -53,7 +53,7 @@ @RequiredArgsConstructor public abstract class AsyncCommonCOBExecutorService implements AsyncCOBExecutorService { - private final JobLocator jobLocator; + private final JobRegistry jobRegistry; private final ScheduledJobDetailRepository scheduledJobDetailRepository; private final JobStarter jobStarter; private final RetrieveIdService retrieveIdService; @@ -92,7 +92,10 @@ public void executeLoanCOBCatchUpAsync(FineractContext context) { private void executeLoanCOBDayByDayUntilCOBBusinessDate(LocalDate oldestCOBProcessedDate, LocalDate cobBusinessDate) throws NoSuchJobException, JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, InvalidJobParametersException, JobRestartException, JobExecutionException { - Job job = jobLocator.getJob(getJobName()); + Job job = jobRegistry.getJob(getJobName()); + if (job == null) { + throw new NoSuchJobException("No job configuration with the name [" + getJobName() + "] was registered"); + } ScheduledJobDetail scheduledJobDetail = scheduledJobDetailRepository.findByJobName(getJobHumanReadableName()); LocalDate executingBusinessDate = oldestCOBProcessedDate.plusDays(1); String tenantIdentifier = ThreadLocalContextUtil.getTenant().getTenantIdentifier(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncLoanCOBExecutorServiceImpl.java index 9d53e73d80f..32458b6086f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncLoanCOBExecutorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncLoanCOBExecutorServiceImpl.java @@ -25,7 +25,7 @@ import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetailRepository; import org.apache.fineract.infrastructure.jobs.service.JobStarter; -import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.context.annotation.Conditional; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -35,9 +35,9 @@ @Conditional(LoanCOBEnabledCondition.class) public class AsyncLoanCOBExecutorServiceImpl extends AsyncCommonCOBExecutorService implements AsyncLoanCOBExecutorService { - public AsyncLoanCOBExecutorServiceImpl(JobLocator jobLocator, ScheduledJobDetailRepository scheduledJobDetailRepository, + public AsyncLoanCOBExecutorServiceImpl(JobRegistry jobRegistry, ScheduledJobDetailRepository scheduledJobDetailRepository, JobStarter jobStarter, RetrieveLoanIdService retrieveIdService) { - super(jobLocator, scheduledJobDetailRepository, jobStarter, retrieveIdService); + super(jobRegistry, scheduledJobDetailRepository, jobStarter, retrieveIdService); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncWorkingCapitalLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncWorkingCapitalLoanCOBExecutorServiceImpl.java index 4564712a900..3fb6e2c8081 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncWorkingCapitalLoanCOBExecutorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/AsyncWorkingCapitalLoanCOBExecutorServiceImpl.java @@ -27,7 +27,7 @@ import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetailRepository; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.jobs.service.JobStarter; -import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.context.annotation.Conditional; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -38,9 +38,9 @@ public class AsyncWorkingCapitalLoanCOBExecutorServiceImpl extends AsyncCommonCOBExecutorService implements AsyncWorkingCapitalLoanCOBExecutorService { - public AsyncWorkingCapitalLoanCOBExecutorServiceImpl(JobLocator jobLocator, ScheduledJobDetailRepository scheduledJobDetailRepository, + public AsyncWorkingCapitalLoanCOBExecutorServiceImpl(JobRegistry jobRegistry, ScheduledJobDetailRepository scheduledJobDetailRepository, JobStarter jobStarter, WorkingCapitalLoanRetrieveIdService retrieveIdService) { - super(jobLocator, scheduledJobDetailRepository, jobStarter, retrieveIdService); + super(jobRegistry, scheduledJobDetailRepository, jobStarter, retrieveIdService); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java index a8fdde71635..54e4a6223f9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java @@ -58,15 +58,14 @@ import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.springbatch.SpringBatchJobConstants; import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.job.JobInstance; import org.springframework.batch.core.job.parameters.JobParameter; import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.batch.core.job.parameters.JobParametersBuilder; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.batch.core.launch.NoSuchJobException; +import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.repository.JobRepository; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -79,8 +78,8 @@ public abstract class InlineCommonLockableCOBExecutorService loanAccountLockRepository; private final InlineLoanCOBExecutionDataParser dataParser; - private final JobLauncher jobLauncher; - private final JobLocator jobLocator; + private final JobOperator jobOperator; + private final JobRegistry jobRegistry; private final JobRepository jobRepository; private final TransactionTemplate requiresNewTransactionTemplate; private final CustomJobParameterRepository customJobParameterRepository; @@ -133,17 +132,15 @@ private List getLoanIdsToBeProcessed(List @SuppressFBWarnings("SLF4J_SIGN_ONLY_FORMAT") private void execute(List loanIds, String jobName, LocalDate businessDate) { lockLoanAccounts(loanIds, businessDate); - Job inlineLoanCOBJob; - try { - inlineLoanCOBJob = jobLocator.getJob(jobName); - } catch (NoSuchJobException e) { - throw new JobNotFoundException(jobName, e); + Job inlineLoanCOBJob = jobRegistry.getJob(jobName); + if (inlineLoanCOBJob == null) { + throw new JobNotFoundException(jobName); } JobParameters jobParameters = new JobParametersBuilder(getNextJobParameters(inlineLoanCOBJob)) .addJobParameters(new JobParameters(new HashSet<>(getJobParametersMap(loanIds, businessDate).values()))).toJobParameters(); JobExecution jobExecution; try { - jobExecution = jobLauncher.run(inlineLoanCOBJob, jobParameters); + jobExecution = jobOperator.start(inlineLoanCOBJob, jobParameters); } catch (Exception e) { log.error("{}{}", JOB_EXECUTION_FAILED_MESSAGE, jobName, e); throw new PlatformInternalServerException("error.msg.sheduler.job.execution.failed", JOB_EXECUTION_FAILED_MESSAGE, jobName, e); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java index e527f1be3bd..bbcf1c54a98 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineLoanCOBExecutorServiceImpl.java @@ -27,8 +27,8 @@ import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.springframework.batch.core.configuration.JobLocator; -import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.configuration.JobRegistry; +import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Conditional; @@ -41,11 +41,11 @@ public class InlineLoanCOBExecutorServiceImpl extends InlineCommonLockableCOBExecutorService { public InlineLoanCOBExecutorServiceImpl(LoanAccountLockRepository loanAccountLockRepository, - InlineLoanCOBExecutionDataParser dataParser, JobLauncher jobLauncher, JobLocator jobLocator, JobRepository jobRepository, + InlineLoanCOBExecutionDataParser dataParser, JobOperator jobOperator, JobRegistry jobRegistry, JobRepository jobRepository, @Qualifier("requiresNewTransactionTemplate") TransactionTemplate requiresNewTransactionTemplate, CustomJobParameterRepository customJobParameterRepository, PlatformSecurityContext context, RetrieveLoanIdService retrieveIdService, FineractProperties fineractProperties) { - super(loanAccountLockRepository, dataParser, jobLauncher, jobLocator, jobRepository, requiresNewTransactionTemplate, + super(loanAccountLockRepository, dataParser, jobOperator, jobRegistry, jobRepository, requiresNewTransactionTemplate, customJobParameterRepository, context, retrieveIdService, fineractProperties); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java index 57eac8bc033..6e21a3646a6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineWorkingCapitalLoanCOBExecutorServiceImpl.java @@ -28,8 +28,8 @@ import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.springframework.batch.core.configuration.JobLocator; -import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.configuration.JobRegistry; +import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Conditional; @@ -42,11 +42,11 @@ public class InlineWorkingCapitalLoanCOBExecutorServiceImpl extends InlineCommonLockableCOBExecutorService { public InlineWorkingCapitalLoanCOBExecutorServiceImpl(WorkingCapitalAccountLockRepository loanAccountLockRepository, - InlineLoanCOBExecutionDataParser dataParser, JobLauncher jobLauncher, JobLocator jobLocator, JobRepository jobRepository, + InlineLoanCOBExecutionDataParser dataParser, JobOperator jobOperator, JobRegistry jobRegistry, JobRepository jobRepository, @Qualifier("requiresNewTransactionTemplate") TransactionTemplate requiresNewTransactionTemplate, CustomJobParameterRepository customJobParameterRepository, PlatformSecurityContext context, WorkingCapitalLoanRetrieveIdService retrieveIdService, FineractProperties fineractProperties) { - super(loanAccountLockRepository, dataParser, jobLauncher, jobLocator, jobRepository, requiresNewTransactionTemplate, + super(loanAccountLockRepository, dataParser, jobOperator, jobRegistry, jobRepository, requiresNewTransactionTemplate, customJobParameterRepository, context, retrieveIdService, fineractProperties); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java index 0e909c4d08b..4126d8893ce 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java @@ -21,12 +21,9 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.apache.fineract.infrastructure.jobs.config.FineractDataFieldMaxValueIncrementerFactory; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; -import org.springframework.batch.core.launch.support.TaskExecutorJobLauncher; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.dao.JacksonExecutionContextStringSerializer; -import org.springframework.batch.core.repository.explore.JobExplorer; -import org.springframework.batch.core.repository.explore.support.JobExplorerFactoryBean; -import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.batch.core.repository.support.JdbcJobRepositoryFactoryBean; import org.springframework.batch.infrastructure.item.database.support.DataFieldMaxValueIncrementerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; @@ -54,7 +51,7 @@ public JobRepository jobRepository(RoutingDataSource routingDataSource, @Qualifier("jdbcTransactionManager") PlatformTransactionManager transactionManager, JacksonExecutionContextStringSerializer executionContextSerializer, DataFieldMaxValueIncrementerFactory incrementerFactory) throws Exception { - JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); + JdbcJobRepositoryFactoryBean factory = new JdbcJobRepositoryFactoryBean(); factory.setDataSource(routingDataSource); factory.setTransactionManager(transactionManager); // Deliberate downgrade from Spring Batch's SERIALIZABLE default: SERIALIZABLE on the create-JobExecution path @@ -69,24 +66,4 @@ public JobRepository jobRepository(RoutingDataSource routingDataSource, factory.afterPropertiesSet(); return factory.getObject(); } - - @Bean - public JobExplorer jobExplorer(RoutingDataSource routingDataSource, - @Qualifier("jdbcTransactionManager") PlatformTransactionManager transactionManager, - JacksonExecutionContextStringSerializer executionContextSerializer) throws Exception { - JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); - jobExplorerFactoryBean.setDataSource(routingDataSource); - jobExplorerFactoryBean.setTransactionManager(transactionManager); - jobExplorerFactoryBean.setSerializer(executionContextSerializer); - jobExplorerFactoryBean.afterPropertiesSet(); - return jobExplorerFactoryBean.getObject(); - } - - @Bean - public TaskExecutorJobLauncher jobLauncher(JobRepository jobRepository) throws Exception { - TaskExecutorJobLauncher launcher = new TaskExecutorJobLauncher(); - launcher.setJobRepository(jobRepository); - launcher.afterPropertiesSet(); - return launcher; - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java index b9bdc1d65d1..0a03e1d9d27 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java @@ -48,9 +48,8 @@ import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerListener; -import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.job.Job; -import org.springframework.batch.core.launch.NoSuchJobException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; @@ -84,7 +83,7 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi private FineractProperties fineractProperties; @Autowired - private JobLocator jobLocator; + private JobRegistry jobRegistry; @Autowired private JobStarter jobStarter; @@ -335,11 +334,9 @@ private JobDetail createJobDetail(final ScheduledJobDetail scheduledJobDetail, S final FineractPlatformTenant tenant = ThreadLocalContextUtil.getTenant(); JobNameData jobName = jobNameService.getJobByHumanReadableName(scheduledJobDetail.getJobName()); - Job job; - try { - job = jobLocator.getJob(jobName.getEnumStyleName()); - } catch (NoSuchJobException e) { - throw new JobIsNotFoundOrNotEnabledException(e, jobName.getEnumStyleName()); + Job job = jobRegistry.getJob(jobName.getEnumStyleName()); + if (job == null) { + throw new JobIsNotFoundOrNotEnabledException(jobName.getEnumStyleName()); } final MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java index 9b52d6ca207..614e0fea76d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java @@ -53,7 +53,7 @@ import org.springframework.batch.core.job.parameters.JobParametersBuilder; import org.springframework.batch.core.launch.JobExecutionAlreadyRunningException; import org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException; -import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.JobRestartException; import org.springframework.batch.core.repository.JobRepository; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -66,7 +66,7 @@ public class JobStarter { private final JobRepository jobRepository; - private final JobLauncher jobLauncher; + private final JobOperator jobOperator; private final JobParameterRepository jobParameterRepository; private final List> jobParameterProviders; private final JobNameService jobNameService; @@ -105,7 +105,7 @@ public JobExecution run(Job job, ScheduledJobDetail scheduledJobDetail, Set stuckJobIds) { private void handleStuckTaskletJob(Long stuckJobId) { try { - jobOperator.restart(stuckJobId); + jobOperator.restart(jobRepository.getJobExecution(stuckJobId)); } catch (Exception e) { throw new RuntimeException("Exception while handling a stuck job", e); } @@ -85,7 +87,7 @@ private void handleStuckPartitionedJob(Long stuckJobId, String partitionerStepNa try { waitUntilAllPartitionsFinished(stuckJobId, partitionerStepName); updateJobStatusToFailedInNewTransaction(stuckJobId, partitionerStepName); - jobOperator.restart(stuckJobId); + jobOperator.restart(jobRepository.getJobExecution(stuckJobId)); } catch (Exception e) { throw new RuntimeException("Exception while handling a stuck job", e); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java index f2feb5a99e0..62bbc5b883e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfiguration.java @@ -67,8 +67,9 @@ public class JournalEntryAggregationJobConfiguration { public Step journalEntryAggregationSummaryStep() { return new StepBuilder(JOB_SUMMARY_STEP_NAME, jobRepository) .chunk( - fineractProperties.getJob().getJournalEntryAggregation().getChunkSize(), transactionManager) - .reader(journalEntryAggregationJobReader()).writer(aggregationItemWriter).allowStartIfComplete(true).build(); + fineractProperties.getJob().getJournalEntryAggregation().getChunkSize()) + .transactionManager(transactionManager).reader(journalEntryAggregationJobReader()).writer(aggregationItemWriter) + .allowStartIfComplete(true).build(); } @Bean diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java index 7f04cd4aece..f4154359f29 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfiguration.java @@ -58,8 +58,9 @@ public class RetainedEarningJobConfiguration { public Step retainedEarningSummaryStep() { return new StepBuilder(JOB_SUMMARY_STEP_NAME, jobRepository) .chunk( - fineractProperties.getJob().getRetainedEarningChunkSize(), transactionManager) - .reader(retainedEarningJobReader).writer(retainedEarningItemWriter).allowStartIfComplete(true).build(); + fineractProperties.getJob().getRetainedEarningChunkSize()) + .transactionManager(transactionManager).reader(retainedEarningJobReader).writer(retainedEarningItemWriter) + .allowStartIfComplete(true).build(); } /** From e668192cd5917335441644c5a2bb07a2eb8101e8 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 09:45:15 +0530 Subject: [PATCH 22/63] FINERACT-2621: replace deprecated Spring Batch APIs in fineract-cob Signed-off-by: avinashvijayvargiya --- .../apache/fineract/cob/common/CommonPartitioner.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java index 312da4999d9..dc4b4649cda 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/common/CommonPartitioner.java @@ -33,9 +33,9 @@ import org.apache.fineract.cob.resolver.BusinessDateResolver; import org.apache.fineract.cob.resolver.CatchUpFlagResolver; import org.apache.fineract.cob.service.RetrieveIdService; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.launch.JobExecutionNotRunningException; import org.springframework.batch.core.launch.JobOperator; -import org.springframework.batch.core.launch.NoSuchJobExecutionException; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.util.StopWatch; @@ -89,11 +89,11 @@ private ExecutionContext createExecutionContextForPartition(Set Date: Tue, 7 Jul 2026 09:45:15 +0530 Subject: [PATCH 23/63] FINERACT-2621: replace deprecated Spring Batch APIs in fineract-working-capital-loan Signed-off-by: avinashvijayvargiya --- .../WorkingCapitalLoanCOBWorkerConfiguration.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java index e938baa9385..7a90cbbcb5c 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java @@ -37,12 +37,13 @@ import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.Step; -import org.springframework.batch.core.step.builder.SimpleStepBuilder; +import org.springframework.batch.core.step.builder.ChunkOrientedStepBuilder; import org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilderFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.SyncTaskExecutor; import org.springframework.core.task.TaskExecutor; import org.springframework.messaging.MessageChannel; @@ -76,9 +77,9 @@ public class WorkingCapitalLoanCOBWorkerConfiguration { @Bean(WORKING_CAPITAL_LOAN_COB_WORKER_STEP) public Step workingCapitalLoanCOBWorkerStep(final COBBusinessStepService cobBusinessStepService) { - final SimpleStepBuilder stepBuilder = stepBuilderFactory + final ChunkOrientedStepBuilder stepBuilder = stepBuilderFactory .get(WORKING_CAPITAL_LOAN_COB_WORKER_STEP).inputChannel(inboundRequests) - .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name()), transactionManager) // + .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name())) // .reader(new WorkingCapitalLoanCOBWorkerItemReader(workingCapitalLoanRepository, new BeforeStepLockingItemReaderHelper(retrieveIdService, wpcLoanLockingService))) // .processor(new WorkingCapitalLoanCOBWorkerItemProcessor(cobBusinessStepService)) // @@ -93,7 +94,7 @@ public Step workingCapitalLoanCOBWorkerStep(final COBBusinessStepService cobBusi .transactionManager(transactionManager); if (propertyService.getThreadPoolMaxPoolSize(WORKING_CAPITAL_JOB_NAME) > 1) { - stepBuilder.taskExecutor(workingCapitalCobTaskExecutor()); + stepBuilder.taskExecutor((AsyncTaskExecutor) workingCapitalCobTaskExecutor()); } return stepBuilder.build(); From 4a85465cd47a6dc83a67c89f44f0337b00ac8978 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 10:29:06 +0530 Subject: [PATCH 24/63] FINERACT-2621: suppress SpotBugs warning uncovered by JSpecify swap Signed-off-by: avinashvijayvargiya --- .../search/SavingsAccountTransactionsSearchServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java index 19fbc4dff85..5e396020c70 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/search/SavingsAccountTransactionsSearchServiceImpl.java @@ -22,6 +22,7 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME; import com.google.gson.JsonObject; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -141,6 +142,7 @@ private static void addFromToFilter(@NonNull String column, String fromValue, St } @Nullable + @SuppressFBWarnings("NP_BOOLEAN_RETURN_NULL") private static Boolean addTransactionTypesFilter(@NonNull TransactionSearchRequest searchParameters, List columnFilters) { Predicate filter = null; From 719059165d4d6e776d8ca891e67ad901cac52a87 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 7 Jul 2026 19:02:50 +0530 Subject: [PATCH 25/63] FINERACT-2621: add Spring Batch 6 Liquibase changeset Signed-off-by: avinashvijayvargiya --- .../db/changelog/tenant/changelog-tenant.xml | 1 + .../parts/0242_spring_batch_6_upgrade.xml | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0242_spring_batch_6_upgrade.xml diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index c603611fb2e..08ac1516418 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -259,4 +259,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0242_spring_batch_6_upgrade.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0242_spring_batch_6_upgrade.xml new file mode 100644 index 00000000000..1ef7453c6db --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0242_spring_batch_6_upgrade.xml @@ -0,0 +1,42 @@ + + + + + + + ALTER SEQUENCE BATCH_JOB_SEQ RENAME TO BATCH_JOB_INSTANCE_SEQ + + + + + RENAME TABLE BATCH_JOB_SEQ TO BATCH_JOB_INSTANCE_SEQ + + + From ca860b0120481c6c4f23e2c605f09ba26b312f33 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:11:20 +0530 Subject: [PATCH 26/63] FINERACT-2621: bridge commons-logging to SLF4J after spring-jcl removal Signed-off-by: avinashvijayvargiya --- fineract-core/dependencies.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fineract-core/dependencies.gradle b/fineract-core/dependencies.gradle index 5566ad7db79..8b8a94aadaa 100644 --- a/fineract-core/dependencies.gradle +++ b/fineract-core/dependencies.gradle @@ -87,6 +87,10 @@ dependencies { // runtimeOnly dependencies are things that Fineract code has no direct compile time dependency on, but which must be present at run-time runtimeOnly( + // Spring Framework 7 removed spring-jcl, which used to provide org.apache.commons.logging.LogFactory + // (commons-logging itself is excluded globally), so bridge JCL to SLF4J instead + 'org.slf4j:jcl-over-slf4j', + // Although fineract (at the time of writing) doesn't have any compile time dep. on httpclient, // it's useful to have this for the Spring Boot TestRestTemplate http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-rest-templates-test-utility 'org.apache.httpcomponents:httpclient' From 9044d6e7f0490e22c792cfc3c00568b3acf0d173 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:17:33 +0530 Subject: [PATCH 27/63] FINERACT-2621: migrate renamed configuration property keys Signed-off-by: avinashvijayvargiya --- .../src/main/resources/application.properties | 8 ++++---- .../src/test/resources/application-test.properties | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fineract-provider/src/main/resources/application.properties b/fineract-provider/src/main/resources/application.properties index d8eed37f191..c8f163894df 100644 --- a/fineract-provider/src/main/resources/application.properties +++ b/fineract-provider/src/main/resources/application.properties @@ -424,9 +424,9 @@ management.prometheus.metrics.export.enabled=${FINERACT_MANAGEMENT_PROMETHEUS_EN spring.cloud.aws.cloudwatch.enabled=${FINERACT_MANAGEMENT_CLOUDWATCH_ENABLED:false} #spring.cloud.aws.cloudwatch.region=${FINERACT_MANAGEMENT_CLOUDWATCH_REGION:us-east-1} -management.metrics.export.cloudwatch.enabled=${FINERACT_MANAGEMENT_CLOUDWATCH_ENABLED:false} -management.metrics.export.cloudwatch.namespace=${FINERACT_MANAGEMENT_CLOUDWATCH_NAMESPACE:fineract} -management.metrics.export.cloudwatch.step=${FINERACT_MANAGEMENT_CLOUDWATCH_STEP:1m} +management.cloudwatch.metrics.export.enabled=${FINERACT_MANAGEMENT_CLOUDWATCH_ENABLED:false} +management.cloudwatch.metrics.export.namespace=${FINERACT_MANAGEMENT_CLOUDWATCH_NAMESPACE:fineract} +management.cloudwatch.metrics.export.step=${FINERACT_MANAGEMENT_CLOUDWATCH_STEP:1m} spring.autoconfigure.exclude=${FINERACT_AUTOCONFIGURE_EXCLUDE:io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration,\ io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration} @@ -527,7 +527,7 @@ spring.web.resources.static-locations=classpath:/static/ spring.main.allow-bean-definition-overriding=true spring.task.scheduling.pool.size=4 -spring.batch.initialize-schema=NEVER +spring.batch.jdbc.initialize-schema=NEVER # Disabling Spring Batch jobs on startup spring.batch.job.enabled=false diff --git a/fineract-provider/src/test/resources/application-test.properties b/fineract-provider/src/test/resources/application-test.properties index b3ae96f2430..efbaad00f28 100644 --- a/fineract-provider/src/test/resources/application-test.properties +++ b/fineract-provider/src/test/resources/application-test.properties @@ -322,7 +322,7 @@ spring.jpa.open-in-view=false spring.data.jdbc.dialect=maria spring.main.allow-bean-definition-overriding=true -spring.batch.initialize-schema=NEVER +spring.batch.jdbc.initialize-schema=NEVER # Disabling Spring Batch jobs on startup spring.batch.job.enabled=false From 5a380bb39e7d7415424851061c695c87cdff0979 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:29:41 +0530 Subject: [PATCH 28/63] FINERACT-2621: fix fineract-provider test sources for Spring Batch 6 and Security 7 Signed-off-by: avinashvijayvargiya --- .../apache/fineract/TestConfiguration.java | 30 +++++----------- .../InitialisationTaskletStepDefinitions.java | 10 +++--- .../JobExecutionContextCopyListenerTest.java | 12 ++++--- .../LoanItemListenerStepDefinitions.java | 2 +- .../ApplyLoanLockTaskletStepDefinitions.java | 14 ++++---- .../cob/loan/LoanCOBPartitionerTest.java | 6 ++-- .../LoanItemProcessorStepDefinitions.java | 10 +++--- .../loan/LoanItemReaderStepDefinitions.java | 10 +++--- .../fineract/cob/loan/LoanItemReaderTest.java | 6 ++-- .../loan/LoanItemWriterStepDefinitions.java | 4 +-- .../PurgeProcessedCommandsTaskletTest.java | 4 +-- ...sactionManagerDataSourceInvariantTest.java | 2 +- .../jobs/PurgeExternalEventsTaskletTest.java | 4 +-- .../SendAsynchronousEventsTaskletTest.java | 4 +-- .../jobs/filter/LoanCOBFilterHelperTest.java | 6 ---- .../jobs/service/JobStarterTest.java | 34 +++++++++---------- ...lEntryAggregationJobConfigurationTest.java | 4 +-- ...tryAggregationJobExecutionDeciderTest.java | 6 ++-- .../JournalEntryAggregationJobReaderTest.java | 4 +-- .../JournalEntryAggregationJobWriterTest.java | 6 ++-- ...ournalEntryAggregationJobListenerTest.java | 8 +++-- ...alEntryAggregationTrackingTaskletTest.java | 10 +++--- ...IncreaseBusinessDateBy1DayTaskletTest.java | 4 +-- .../IncreaseCobDateBy1DayTaskletTest.java | 4 +-- .../RetainedEarningJobConfigurationTest.java | 4 +-- .../RetainedEarningJobReaderTest.java | 2 +- .../RetainedEarningJobWriterTest.java | 4 +-- .../RetainedEarningJobListenerTest.java | 6 ++-- ...sswordAwareAuthenticationProviderTest.java | 9 +++-- ...geToOverdueLoanInstallmentTaskletTest.java | 4 +-- ...nerateLoanlossProvisioningTaskletTest.java | 6 ++-- 31 files changed, 117 insertions(+), 122 deletions(-) diff --git a/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java b/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java index e5866903f18..20a20ad5126 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java +++ b/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java @@ -47,20 +47,18 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import org.springframework.batch.core.configuration.JobRegistry; -import org.springframework.batch.core.explore.JobExplorer; -import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.repository.JobRepository; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.batch.autoconfigure.BatchAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.gson.autoconfigure.GsonAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.JdbcTemplateAutoConfiguration; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseAutoConfiguration; +import org.springframework.boot.liquibase.autoconfigure.LiquibaseProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -182,18 +180,6 @@ public JdbcTemplate jdbcTemplate() { return mock(JdbcTemplate.class); } - @Primary - @Bean - public JobExplorer jobExplorer() { - return mock(JobExplorer.class, RETURNS_MOCKS); - } - - @Primary - @Bean - public JobLauncher jobLauncher() { - return mock(JobLauncher.class, RETURNS_MOCKS); - } - @Primary @Bean public JobRegistry jobRegistry() { 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 80f831f4129..54871dc3931 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 @@ -34,11 +34,13 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.scope.context.StepContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.security.core.context.SecurityContextHolder; public class InitialisationTaskletStepDefinitions implements En { @@ -67,7 +69,7 @@ public InitialisationTaskletStepDefinitions() { businessDates.put(BusinessDateType.BUSINESS_DATE, businessDate); businessDates.put(BusinessDateType.COB_DATE, cobBusinessDate); ThreadLocalContextUtil.setBusinessDates(businessDates); - JobExecution jobExecution = new JobExecution(1L); + JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); jobExecution.getExecutionContext().put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME, cobBusinessDate.format(DateTimeFormatter.ISO_DATE)); StepExecution stepExecution = new StepExecution("step", jobExecution); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListenerTest.java b/fineract-provider/src/test/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListenerTest.java index a3de553429f..91f08132ee8 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListenerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/listener/JobExecutionContextCopyListenerTest.java @@ -29,9 +29,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; @ExtendWith(MockitoExtension.class) public class JobExecutionContextCopyListenerTest { @@ -46,7 +48,7 @@ public void verifyJobExecutionContextMapIsCopiedToEmptyStepExecutionContextMap() Map jobExecutionContextMap = createRandomHashmap(); jobExecutionContextMap.put("BusinessDate", "value"); jobExecutionContextMap.put("IS_CATCH_UP", "value"); - final JobExecution jobExecution = new JobExecution(1L); + final JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); jobExecution.setExecutionContext(new ExecutionContext(jobExecutionContextMap)); final StepExecution stepExecution = new StepExecution("someStep", jobExecution); @@ -68,7 +70,7 @@ public void verifyStepExecutionContextMapNotOverwritten() { expectedStepExecutionContextMap.put("BusinessDate", "BusinessDate anotherValue"); expectedStepExecutionContextMap.put("IS_CATCH_UP", "IS_CATCH_UP anotherValue"); - final JobExecution jobExecution = new JobExecution(1L); + final JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); jobExecution.setExecutionContext(new ExecutionContext(jobExecutionContextMap)); final StepExecution actualStepExecution = new StepExecution("someStep", jobExecution); actualStepExecution.setExecutionContext(new ExecutionContext(expectedStepExecutionContextMap)); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/listener/LoanItemListenerStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/listener/LoanItemListenerStepDefinitions.java index 08f0c1b2e68..1911b1bc148 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/listener/LoanItemListenerStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/listener/LoanItemListenerStepDefinitions.java @@ -35,7 +35,7 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.mockito.Mockito; -import org.springframework.batch.item.Chunk; +import org.springframework.batch.infrastructure.item.Chunk; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; 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 00edcec67b2..b181e8bd1cf 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 @@ -42,11 +42,13 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; @@ -72,7 +74,7 @@ public ApplyLoanLockTaskletStepDefinitions() { HashMap businessDateMap = new HashMap<>(); businessDateMap.put(BusinessDateType.COB_DATE, LocalDate.now(ZoneId.systemDefault())); ThreadLocalContextUtil.setBusinessDates(businessDateMap); - JobExecution jobExecution = new JobExecution(1L, null); + JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); StepExecution stepExecution = new StepExecution("test", jobExecution); ExecutionContext executionContext = new ExecutionContext(); COBParameter loanCOBParameter = new COBParameter(1L, 4L); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java index a5c1459e91a..2ffebb6e509 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java @@ -38,12 +38,12 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.launch.JobExecutionNotRunningException; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.NoSuchJobExecutionException; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; @ExtendWith(MockitoExtension.class) class LoanCOBPartitionerTest { 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 9b2709b3fe9..1d298ef33c9 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 @@ -33,9 +33,11 @@ import org.apache.fineract.cob.COBBusinessStepService; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.service.ProgressiveLoanModelProcessingService; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; public class LoanItemProcessorStepDefinitions implements En { @@ -53,7 +55,7 @@ public class LoanItemProcessorStepDefinitions implements En { public LoanItemProcessorStepDefinitions() { Given("/^The LoanItemProcessor.process method with item (.*)$/", (String loanItem) -> { - JobExecution jobExecution = new JobExecution(1L); + JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); jobExecution.getExecutionContext().put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME, LocalDate.now(ZoneId.systemDefault()).toString()); StepExecution stepExecution = new StepExecution("test", jobExecution); 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 a65d826efa2..46af6d127ab 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 @@ -45,9 +45,11 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; public class LoanItemReaderStepDefinitions implements En { @@ -68,7 +70,7 @@ public class LoanItemReaderStepDefinitions implements En { public LoanItemReaderStepDefinitions() { Given("/^The LoanItemReader.read method with loanIds (.*)$/", (String loanIds) -> { - JobExecution jobExecution = new JobExecution(1L); + JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); ExecutionContext jobExecutionContext = new ExecutionContext(); jobExecution.setExecutionContext(jobExecutionContext); StepExecution stepExecution = new StepExecution("test", jobExecution); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderTest.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderTest.java index 7e98a274363..ffc13eaf286 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderTest.java @@ -48,9 +48,9 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; @ExtendWith(MockitoExtension.class) class LoanItemReaderTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemWriterStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemWriterStepDefinitions.java index f6f6c568114..af7b9dc103f 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemWriterStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemWriterStepDefinitions.java @@ -27,14 +27,14 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.mockito.Mockito; -import org.springframework.batch.item.Chunk; +import org.springframework.batch.infrastructure.item.Chunk; public class LoanItemWriterStepDefinitions implements En { private final LockingService loanLockingService = mock(LockingService.class); private final LoanRepository loanRepository = mock(LoanRepository.class); - private final LoanItemWriter loanItemWriter = new LoanItemWriter(loanLockingService); + private final LoanItemWriter loanItemWriter = new LoanItemWriter(loanLockingService, loanRepository); private Chunk items; diff --git a/fineract-provider/src/test/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTaskletTest.java index fa4ef94028f..ba5af298b98 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/commands/jobs/PurgeProcessedCommandsTaskletTest.java @@ -45,9 +45,9 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) public class PurgeProcessedCommandsTaskletTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/config/TransactionManagerDataSourceInvariantTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/config/TransactionManagerDataSourceInvariantTest.java index 7f6a5bf5cb5..efaa47ec1e8 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/config/TransactionManagerDataSourceInvariantTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/config/TransactionManagerDataSourceInvariantTest.java @@ -27,7 +27,7 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; +import org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.transaction.PlatformTransactionManager; diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTaskletTest.java index 2bfbaf3828f..bc944cade29 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/PurgeExternalEventsTaskletTest.java @@ -43,9 +43,9 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) public class PurgeExternalEventsTaskletTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java index 550997db74d..22b27403338 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java @@ -61,9 +61,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.data.domain.Pageable; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.transaction.TransactionStatus; diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperTest.java index d419365fa23..8675d4b0f8c 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperTest.java @@ -32,7 +32,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequestRepository; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -64,11 +63,6 @@ public class LoanCOBFilterHelperTest { @InjectMocks private LoanCOBFilterHelperImpl helper; - @BeforeEach - public void initLoanCOBFilterHelper() throws Exception { - helper.afterPropertiesSet(); - } - @Test public void testCOBFilterUnescapedChars() throws IOException { String json = """ diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java index 4dea58338b8..3e8d82e2547 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java @@ -55,16 +55,16 @@ import org.quartz.JobExecutionException; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersIncrementer; -import org.springframework.batch.core.JobParametersInvalidException; -import org.springframework.batch.core.explore.JobExplorer; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; -import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; -import org.springframework.batch.core.repository.JobRestartException; +import org.springframework.batch.core.job.Job; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.parameters.InvalidJobParametersException; +import org.springframework.batch.core.job.parameters.JobParameters; +import org.springframework.batch.core.job.parameters.JobParametersIncrementer; +import org.springframework.batch.core.launch.JobExecutionAlreadyRunningException; +import org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException; +import org.springframework.batch.core.launch.JobOperator; +import org.springframework.batch.core.launch.JobRestartException; +import org.springframework.batch.core.repository.explore.JobExplorer; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -73,7 +73,7 @@ public class JobStarterTest { @Mock private JobExplorer jobExplorer; @Mock - private JobLauncher jobLauncher; + private JobOperator jobOperator; @Mock private JobParameterRepository jobParameterRepository; @Mock @@ -100,8 +100,8 @@ public void getJobParameterTest() { when(scheduledJobDetail.getId()).thenReturn(1L); when(jobParameterRepository.findJobParametersByJobId(1L)) .thenReturn(List.of(new JobParameter().setJobId(1L).setParameterName("testParamKey").setParameterValue("testParamValue"))); - Map> result = underTest.getJobParameter(scheduledJobDetail); - Assertions.assertEquals("testParamValue", result.get("testParamKey").getValue()); + Map> result = underTest.getJobParameter(scheduledJobDetail); + Assertions.assertEquals("testParamValue", result.get("testParamKey").value()); } @Test @@ -115,7 +115,7 @@ public void provideCustomJobParameters() { @Test public void runWithComplete() throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, - JobParametersInvalidException, JobRestartException, JobExecutionException { + InvalidJobParametersException, JobRestartException, JobExecutionException { JobExecution jobExecution = Mockito.mock(JobExecution.class); Job job = Mockito.mock(Job.class); ScheduledJobDetail scheduledJobDetail = Mockito.mock(ScheduledJobDetail.class); @@ -127,7 +127,7 @@ public void runWithComplete() throws JobInstanceAlreadyCompleteException, JobExe @Test public void runWithFailed() throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, - JobParametersInvalidException, JobRestartException, JobExecutionException { + InvalidJobParametersException, JobRestartException, JobExecutionException { JobExecution jobExecution = Mockito.mock(JobExecution.class); Job job = Mockito.mock(Job.class); ScheduledJobDetail scheduledJobDetail = Mockito.mock(ScheduledJobDetail.class); @@ -143,11 +143,11 @@ public void runWithFailed() throws JobInstanceAlreadyCompleteException, JobExecu } } - private void setupMocks(JobExecution jobExecution, Job job, ScheduledJobDetail scheduledJobDetail) throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException { + private void setupMocks(JobExecution jobExecution, Job job, ScheduledJobDetail scheduledJobDetail) throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, InvalidJobParametersException, JobRestartException { when(scheduledJobDetail.getId()).thenReturn(1L); when(scheduledJobDetail.getJobName()).thenReturn("testJobName"); when(jobParameterRepository.findJobParametersByJobId(1L)).thenReturn(List.of(new JobParameter().setJobId(1L).setParameterName("testParamKey").setParameterValue("testParamValue"))); - when(jobLauncher.run(any(Job.class), any(JobParameters.class))).thenReturn(jobExecution); + when(jobOperator.start(any(Job.class), any(JobParameters.class))).thenReturn(jobExecution); JobParametersIncrementer jobParametersIncrementer = Mockito.mock(JobParametersIncrementer.class); when(jobParametersIncrementer.getNext(any(JobParameters.class))).thenReturn(new JobParameters()); when(job.getJobParametersIncrementer()).thenReturn(jobParametersIncrementer); diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java index edae43fdce7..aa6958390cc 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java @@ -31,10 +31,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.scope.context.JobSynchronizationManager; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.transaction.PlatformTransactionManager; diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDeciderTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDeciderTest.java index 9713bed2f9e..87dc5030cff 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDeciderTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobExecutionDeciderTest.java @@ -36,10 +36,10 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.job.flow.FlowExecutionStatus; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; @ExtendWith(MockitoExtension.class) public class JournalEntryAggregationJobExecutionDeciderTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java index 696badbfa10..c22feea18f6 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java @@ -45,9 +45,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.scope.context.JobSynchronizationManager; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.ExecutionContext; @ExtendWith(MockitoExtension.class) public class JournalEntryAggregationJobReaderTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriterTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriterTest.java index 511b83b6379..d8218066bd0 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriterTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobWriterTest.java @@ -32,9 +32,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.Chunk; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.Chunk; @ExtendWith(MockitoExtension.class) public class JournalEntryAggregationJobWriterTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListenerTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListenerTest.java index 304fcce7359..befe58f9eba 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListenerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/listener/JournalEntryAggregationJobListenerTest.java @@ -39,9 +39,11 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.job.JobInstance; +import org.springframework.batch.core.job.parameters.JobParameters; import org.springframework.batch.core.scope.context.JobContext; -import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.infrastructure.item.ExecutionContext; @ExtendWith(MockitoExtension.class) public class JournalEntryAggregationJobListenerTest { @@ -113,7 +115,7 @@ public void testBeforeJobWithLastAggregatedOnDate() { when(fineractJobProperties.getJournalEntryAggregation().getExcludeRecentNDays()).thenReturn(lookBackDays); when(trackingRepository.findLatestAggregatedOnDate()).thenReturn(lastAggregatedOnDate); - JobExecution jobExecution = new JobExecution(1L); + JobExecution jobExecution = new JobExecution(1L, new JobInstance(1L, "test"), new JobParameters()); // Act listener.beforeJob(jobExecution); diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTaskletTest.java index f3f2b6c1e59..a6d529723da 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/tasklet/JournalEntryAggregationTrackingTaskletTest.java @@ -45,13 +45,13 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.scope.context.StepContext; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.ExecutionContext; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTaskletTest.java index 5ac38eb20ac..edcb7b13de3 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasebusinessdateby1day/IncreaseBusinessDateBy1DayTaskletTest.java @@ -34,9 +34,9 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTaskletTest.java index f630a772680..2519af08077 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/increasedateby1day/increasecobdateby1day/IncreaseCobDateBy1DayTaskletTest.java @@ -34,9 +34,9 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfigurationTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfigurationTest.java index 05b707e2748..2c3944fc15b 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfigurationTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobConfigurationTest.java @@ -34,11 +34,11 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.FlowBuilder; import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.transaction.PlatformTransactionManager; @ExtendWith(MockitoExtension.class) diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReaderTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReaderTest.java index 04ce2585493..05b3b6d88d2 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReaderTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobReaderTest.java @@ -47,7 +47,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.step.StepExecution; @ExtendWith(MockitoExtension.class) class RetainedEarningJobReaderTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriterTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriterTest.java index 061e4b98b37..272e8d41694 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriterTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/RetainedEarningJobWriterTest.java @@ -49,8 +49,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.item.Chunk; +import org.springframework.batch.core.step.StepExecution; +import org.springframework.batch.infrastructure.item.Chunk; @ExtendWith(MockitoExtension.class) class RetainedEarningJobWriterTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListenerTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListenerTest.java index c2b9892119b..a4ec47907e6 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListenerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/retainedearning/listener/RetainedEarningJobListenerTest.java @@ -35,8 +35,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.core.step.StepExecution; @ExtendWith(MockitoExtension.class) class RetainedEarningJobListenerTest { @@ -56,7 +56,7 @@ public void setup() { public void testBeforeJob() { // beforeJob should complete without exceptions and log the job ID retainedEarningJobListener.beforeJob(jobExecution); - verify(jobExecution).getJobId(); + verify(jobExecution).getJobInstanceId(); } @Test diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/security/service/TemporaryPasswordAwareAuthenticationProviderTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/security/service/TemporaryPasswordAwareAuthenticationProviderTest.java index b4e7e438738..6e1a118ad87 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/security/service/TemporaryPasswordAwareAuthenticationProviderTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/security/service/TemporaryPasswordAwareAuthenticationProviderTest.java @@ -49,7 +49,8 @@ void authenticateShouldSucceedWithPermanentPassword() { AppUser user = mockEnabledUser(); when(user.getPassword()).thenReturn("{bcrypt}main"); when(passwordEncoder.matches("secret", "{bcrypt}main")).thenReturn(true); - subject.setUserDetailsService(username -> user); + subject = new TemporaryPasswordAwareAuthenticationProvider(username -> user); + subject.setPasswordEncoder(passwordEncoder); subject.authenticate(UsernamePasswordAuthenticationToken.unauthenticated("demo", "secret")); } @@ -62,7 +63,8 @@ void authenticateShouldSucceedWithValidTemporaryPassword() { when(user.getTemporaryPassword()).thenReturn("{bcrypt}temp"); when(passwordEncoder.matches("temporary-secret", "{bcrypt}main")).thenReturn(false); when(passwordEncoder.matches("temporary-secret", "{bcrypt}temp")).thenReturn(true); - subject.setUserDetailsService(username -> user); + subject = new TemporaryPasswordAwareAuthenticationProvider(username -> user); + subject.setPasswordEncoder(passwordEncoder); subject.authenticate(UsernamePasswordAuthenticationToken.unauthenticated("demo", "temporary-secret")); } @@ -73,7 +75,8 @@ void authenticateShouldFailWithExpiredTemporaryPassword() { when(user.getPassword()).thenReturn("{bcrypt}main"); when(user.hasValidTemporaryPassword()).thenReturn(false); when(passwordEncoder.matches("temporary-secret", "{bcrypt}main")).thenReturn(false); - subject.setUserDetailsService(username -> user); + subject = new TemporaryPasswordAwareAuthenticationProvider(username -> user); + subject.setPasswordEncoder(passwordEncoder); assertThrows(BadCredentialsException.class, () -> subject.authenticate(UsernamePasswordAuthenticationToken.unauthenticated("demo", "temporary-secret"))); diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTaskletTest.java index dc384d5eb0b..0ae5bc1c96b 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/applychargetooverdueloaninstallment/ApplyChargeToOverdueLoanInstallmentTaskletTest.java @@ -35,9 +35,9 @@ import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; public class ApplyChargeToOverdueLoanInstallmentTaskletTest { diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTaskletTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTaskletTest.java index 4a43d1c068e..4e450d0c863 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTaskletTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/jobs/generateloanlossprovisioning/GenerateLoanlossProvisioningTaskletTest.java @@ -22,7 +22,7 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; -import static org.springframework.batch.repeat.RepeatStatus.FINISHED; +import static org.springframework.batch.infrastructure.repeat.RepeatStatus.FINISHED; import java.time.LocalDate; import java.util.HashMap; @@ -42,9 +42,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) From d1731f29201efc8eee7b5ff9ab70d67cabcb5084 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:29:42 +0530 Subject: [PATCH 29/63] FINERACT-2621: fix fineract-command test compilation on Boot 4 Signed-off-by: avinashvijayvargiya --- fineract-command/dependencies.gradle | 2 +- .../command/CommandSampleApiTest.java | 21 +++++++++++++------ .../fineract/command/TestConfiguration.java | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/fineract-command/dependencies.gradle b/fineract-command/dependencies.gradle index 82267b90194..ba0b1db8099 100644 --- a/fineract-command/dependencies.gradle +++ b/fineract-command/dependencies.gradle @@ -36,6 +36,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.mapstruct:mapstruct-processor' + testImplementation 'org.springframework.boot:spring-boot-jdbc' testImplementation(project(path: ':fineract-command-test')) testImplementation ('org.springframework.boot:spring-boot-starter-test') { exclude group: 'com.jayway.jsonpath', module: 'json-path' @@ -50,6 +51,5 @@ dependencies { 'org.testcontainers:junit-jupiter', 'org.springframework.restdocs:spring-restdocs-mockmvc', 'org.springframework.restdocs:spring-restdocs-webtestclient', - 'org.springframework.restdocs:spring-restdocs-restassured', ) } diff --git a/fineract-command/src/test/java/org/apache/fineract/command/CommandSampleApiTest.java b/fineract-command/src/test/java/org/apache/fineract/command/CommandSampleApiTest.java index 6694bc4f528..6ec9ed28d5c 100644 --- a/fineract-command/src/test/java/org/apache/fineract/command/CommandSampleApiTest.java +++ b/fineract-command/src/test/java/org/apache/fineract/command/CommandSampleApiTest.java @@ -44,13 +44,15 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.ProblemDetail; import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; import org.springframework.test.context.ContextConfiguration; +import org.springframework.web.client.DefaultResponseErrorHandler; +import org.springframework.web.client.RestTemplate; @Slf4j @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -65,14 +67,21 @@ class CommandSampleApiTest { private List interceptors; - @Autowired - private TestRestTemplate restTemplate; + private RestTemplate restTemplate; @Autowired private CommandProperties properties; @BeforeEach public void setUp() { + this.restTemplate = new RestTemplate(); + this.restTemplate.setErrorHandler(new DefaultResponseErrorHandler() { + + @Override + public boolean hasError(ClientHttpResponse response) { + return false; + } + }); this.baseUrl = "http://localhost:" + port + "/test/dummy"; this.interceptors = List.of((request, body, execution) -> { var headers = request.getHeaders(); @@ -86,7 +95,7 @@ public void setUp() { @Test void validation() { - restTemplate.getRestTemplate().setInterceptors(interceptors); + restTemplate.setInterceptors(interceptors); var problemDetail = restTemplate.postForObject(baseUrl + "/sync", DummyRequest.builder().build(), ProblemDetail.class); log.warn("Problem detail (sync) : {} ({})", problemDetail.getDetail(), problemDetail.getProperties()); @@ -99,7 +108,7 @@ void dummyApiSync() { final var content = "test-sync"; final var idempotencyKey = UUID.randomUUID().toString(); - restTemplate.getRestTemplate().setInterceptors(interceptors); + restTemplate.setInterceptors(interceptors); final var headers = new HttpHeaders(); headers.add(properties.getIdemPotencyKeyHeaderName(), idempotencyKey); @@ -145,7 +154,7 @@ void dummyApiIdempotency(String path) { return execution.execute(req, body); }); - restTemplate.getRestTemplate().setInterceptors(interceptors); + restTemplate.setInterceptors(interceptors); // first request passes var response = restTemplate.postForEntity(baseUrl + path, request, Map.class); diff --git a/fineract-command/src/test/java/org/apache/fineract/command/TestConfiguration.java b/fineract-command/src/test/java/org/apache/fineract/command/TestConfiguration.java index 7abcbad3504..ab11516bb4f 100644 --- a/fineract-command/src/test/java/org/apache/fineract/command/TestConfiguration.java +++ b/fineract-command/src/test/java/org/apache/fineract/command/TestConfiguration.java @@ -21,8 +21,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.command.core.CommandProperties; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; From 263e75c63b59d79feea04f6656dc92ee657ddf89 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:29:43 +0530 Subject: [PATCH 30/63] FINERACT-2621: fix fineract-command-async test compilation on Boot 4 Signed-off-by: avinashvijayvargiya --- fineract-command-async/dependencies.gradle | 1 + .../org/apache/fineract/command/async/TestConfiguration.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fineract-command-async/dependencies.gradle b/fineract-command-async/dependencies.gradle index 633567fd51b..e78c68c16f1 100644 --- a/fineract-command-async/dependencies.gradle +++ b/fineract-command-async/dependencies.gradle @@ -37,6 +37,7 @@ dependencies { jmh 'org.openjdk.jmh:jmh-generator-annprocess' jmhAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess' + testImplementation 'org.springframework.boot:spring-boot-jdbc' testImplementation(project(path: ':fineract-command-test')) testImplementation ('org.springframework.boot:spring-boot-starter-test') { exclude group: 'com.jayway.jsonpath', module: 'json-path' diff --git a/fineract-command-async/src/test/java/org/apache/fineract/command/async/TestConfiguration.java b/fineract-command-async/src/test/java/org/apache/fineract/command/async/TestConfiguration.java index d9fe06b9490..3710ec8d99b 100644 --- a/fineract-command-async/src/test/java/org/apache/fineract/command/async/TestConfiguration.java +++ b/fineract-command-async/src/test/java/org/apache/fineract/command/async/TestConfiguration.java @@ -24,8 +24,8 @@ import org.apache.fineract.command.core.CommandProperties; import org.apache.fineract.command.core.CommandStore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; From e415369ec8681a2f8159b4bf964d5d8fa3312a35 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:29:43 +0530 Subject: [PATCH 31/63] FINERACT-2621: fix fineract-command-audit test compilation on Boot 4 Signed-off-by: avinashvijayvargiya --- fineract-command-audit/dependencies.gradle | 1 + .../org/apache/fineract/command/audit/TestConfiguration.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fineract-command-audit/dependencies.gradle b/fineract-command-audit/dependencies.gradle index c005aefce31..a5409c9a925 100644 --- a/fineract-command-audit/dependencies.gradle +++ b/fineract-command-audit/dependencies.gradle @@ -35,6 +35,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.mapstruct:mapstruct-processor' + testImplementation 'org.springframework.boot:spring-boot-jdbc' testImplementation(project(path: ':fineract-command-test')) testImplementation ('org.springframework.boot:spring-boot-starter-test') { exclude group: 'com.jayway.jsonpath', module: 'json-path' diff --git a/fineract-command-audit/src/test/java/org/apache/fineract/command/audit/TestConfiguration.java b/fineract-command-audit/src/test/java/org/apache/fineract/command/audit/TestConfiguration.java index b186364ef65..1b80d840b8f 100644 --- a/fineract-command-audit/src/test/java/org/apache/fineract/command/audit/TestConfiguration.java +++ b/fineract-command-audit/src/test/java/org/apache/fineract/command/audit/TestConfiguration.java @@ -24,8 +24,8 @@ import org.apache.fineract.command.core.CommandProperties; import org.apache.fineract.command.core.CommandStore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; From 99488e0b9364ccf59093865573a71b0eb50e293e Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:29:43 +0530 Subject: [PATCH 32/63] FINERACT-2621: migrate custom acme job test to Spring Batch 6 Signed-off-by: avinashvijayvargiya --- .../acme/fineract/loan/job/AcmeNoopJobConfiguration.java | 2 +- .../java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java | 2 +- .../acme/loan/job/src/test/java/AcmeNoopJobTaskletTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java index 696758f0d39..abf7ec0cfac 100644 --- a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java +++ b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobConfiguration.java @@ -20,10 +20,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.batch.core.job.Job; -import org.springframework.batch.core.step.Step; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.job.parameters.RunIdIncrementer; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java index 3086426b5df..2c6cb78f19a 100644 --- a/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java +++ b/custom/acme/loan/job/src/main/java/com/acme/fineract/loan/job/AcmeNoopJobTasklet.java @@ -19,8 +19,8 @@ package com.acme.fineract.loan.job; import lombok.extern.slf4j.Slf4j; -import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.StepContribution; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.infrastructure.repeat.RepeatStatus; import org.springframework.stereotype.Component; diff --git a/custom/acme/loan/job/src/test/java/AcmeNoopJobTaskletTest.java b/custom/acme/loan/job/src/test/java/AcmeNoopJobTaskletTest.java index 4b8f076ec7d..cc62a8b4769 100644 --- a/custom/acme/loan/job/src/test/java/AcmeNoopJobTaskletTest.java +++ b/custom/acme/loan/job/src/test/java/AcmeNoopJobTaskletTest.java @@ -18,7 +18,7 @@ * under the License. */ import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.springframework.batch.repeat.RepeatStatus.FINISHED; +import static org.springframework.batch.infrastructure.repeat.RepeatStatus.FINISHED; import com.acme.fineract.loan.job.AcmeNoopJobTasklet; import org.junit.jupiter.api.BeforeEach; @@ -26,9 +26,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.core.step.StepContribution; +import org.springframework.batch.infrastructure.repeat.RepeatStatus; @ExtendWith(MockitoExtension.class) public class AcmeNoopJobTaskletTest { From 31a293ee20a4dbac666c2aee9c8de5651d568671 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:54:49 +0530 Subject: [PATCH 33/63] FINERACT-2621: run integration-tests container on Tomcat 11 Signed-off-by: avinashvijayvargiya --- integration-tests/build.gradle | 3 +-- integration-tests/dependencies.gradle | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/integration-tests/build.gradle b/integration-tests/build.gradle index 0cd3af35d5e..325dca158f8 100644 --- a/integration-tests/build.gradle +++ b/integration-tests/build.gradle @@ -43,7 +43,7 @@ dependencies { } cargo { - containerId "tomcat10x" + containerId "tomcat11x" // looks like Cargo doesn't detect the WAR file automatically in the multi-module setup deployable { @@ -81,7 +81,6 @@ cargo { property 'cargo.start.jvmargs', jvmArgs property 'cargo.tomcat.connector.keystoreFile', file("$rootDir/fineract-provider/src/main/resources/keystore.jks") property 'cargo.tomcat.connector.keystorePass', 'openmf' - property 'cargo.tomcat.connector.keystoreType', 'JKS' property 'cargo.tomcat.httpSecure', true property 'cargo.tomcat.connector.sslProtocol', 'TLS' property 'cargo.tomcat.connector.clientAuth', false diff --git a/integration-tests/dependencies.gradle b/integration-tests/dependencies.gradle index 95e4b26a591..1cc7968cc19 100644 --- a/integration-tests/dependencies.gradle +++ b/integration-tests/dependencies.gradle @@ -20,7 +20,10 @@ 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.55@zip' + tomcat 'org.apache.tomcat:tomcat:11.0.22@zip' + // gradle-cargo-plugin 2.9.0 defaults to a Codehaus Cargo version that predates Tomcat 11 support + cargo 'org.codehaus.cargo:cargo-core-uberjar:1.10.21' + cargo 'org.codehaus.cargo:cargo-ant:1.10.21' def providerMainOutput = project(':fineract-provider').extensions.getByType(SourceSetContainer).named('main').get().output testImplementation( providerMainOutput, project(path: ':fineract-core', configuration: 'runtimeElements'), From 6741c6a0ce47cab5085a00043f698b8142260604 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:54:50 +0530 Subject: [PATCH 34/63] FINERACT-2621: run oauth2-tests container on Tomcat 11 Signed-off-by: avinashvijayvargiya --- oauth2-tests/build.gradle | 3 +-- oauth2-tests/dependencies.gradle | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/oauth2-tests/build.gradle b/oauth2-tests/build.gradle index ea2e4ae524a..2b61705cdf0 100644 --- a/oauth2-tests/build.gradle +++ b/oauth2-tests/build.gradle @@ -42,7 +42,7 @@ dependencies { } cargo { - containerId "tomcat10x" + containerId "tomcat11x" // looks like Cargo doesn't detect the WAR file automatically in the multi-module setup deployable { @@ -77,7 +77,6 @@ cargo { property 'cargo.start.jvmargs', jvmArgs property 'cargo.tomcat.connector.keystoreFile', file("$rootDir/fineract-provider/src/main/resources/keystore.jks") property 'cargo.tomcat.connector.keystorePass', 'openmf' - property 'cargo.tomcat.connector.keystoreType', 'JKS' property 'cargo.tomcat.httpSecure', true property 'cargo.tomcat.connector.sslProtocol', 'TLS' property 'cargo.tomcat.connector.clientAuth', false diff --git a/oauth2-tests/dependencies.gradle b/oauth2-tests/dependencies.gradle index b7dfa124737..1ba0383635c 100644 --- a/oauth2-tests/dependencies.gradle +++ b/oauth2-tests/dependencies.gradle @@ -20,7 +20,10 @@ 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.55@zip' + tomcat 'org.apache.tomcat:tomcat:11.0.22@zip' + // gradle-cargo-plugin 2.9.0 defaults to a Codehaus Cargo version that predates Tomcat 11 support + cargo 'org.codehaus.cargo:cargo-core-uberjar:1.10.21' + cargo 'org.codehaus.cargo:cargo-ant:1.10.21' testImplementation( files("$rootDir/fineract-provider/build/classes/java/main/"), project(path: ':fineract-provider', configuration: 'runtimeElements'), project(path: ':fineract-security', configuration: 'runtimeElements'), From b23dd9b49e77ecec145f09ce13de11766166c0ee Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 09:54:51 +0530 Subject: [PATCH 35/63] FINERACT-2621: run twofactor-tests container on Tomcat 11 Signed-off-by: avinashvijayvargiya --- twofactor-tests/build.gradle | 3 +-- twofactor-tests/dependencies.gradle | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/twofactor-tests/build.gradle b/twofactor-tests/build.gradle index b25e614430d..4212d258a07 100644 --- a/twofactor-tests/build.gradle +++ b/twofactor-tests/build.gradle @@ -39,7 +39,7 @@ dependencies { } cargo { - containerId "tomcat10x" + containerId "tomcat11x" // looks like Cargo doesn't detect the WAR file automatically in the multi-module setup deployable { @@ -74,7 +74,6 @@ cargo { property 'cargo.start.jvmargs', jvmArgs property 'cargo.tomcat.connector.keystoreFile', file("$rootDir/fineract-provider/src/main/resources/keystore.jks") property 'cargo.tomcat.connector.keystorePass', 'openmf' - property 'cargo.tomcat.connector.keystoreType', 'JKS' property 'cargo.tomcat.httpSecure', true property 'cargo.tomcat.connector.sslProtocol', 'TLS' property 'cargo.tomcat.connector.clientAuth', false diff --git a/twofactor-tests/dependencies.gradle b/twofactor-tests/dependencies.gradle index a91d038519a..b8f6baa38c5 100644 --- a/twofactor-tests/dependencies.gradle +++ b/twofactor-tests/dependencies.gradle @@ -20,7 +20,10 @@ 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.55@zip' + tomcat 'org.apache.tomcat:tomcat:11.0.22@zip' + // gradle-cargo-plugin 2.9.0 defaults to a Codehaus Cargo version that predates Tomcat 11 support + cargo 'org.codehaus.cargo:cargo-core-uberjar:1.10.21' + cargo 'org.codehaus.cargo:cargo-ant:1.10.21' testImplementation( files("$rootDir/fineract-provider/build/classes/java/main/"), project(path: ':fineract-provider', configuration: 'runtimeElements'), 'org.junit.jupiter:junit-jupiter-api', From e1d3ec7c7b4cd399b6b358d8294af3c6166a38a2 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 19:19:45 +0530 Subject: [PATCH 36/63] FINERACT-2621: adapt JobExecution proxy to Spring Batch 6 constructor Signed-off-by: avinashvijayvargiya --- .../batch/core/scope/context/JobSynchronizationManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java index 6d56b746bd0..fa5414b063a 100644 --- a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java +++ b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/JobSynchronizationManager.java @@ -53,8 +53,8 @@ public static JobContext register(JobExecution jobExecution) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(JobExecution.class); enhancer.setCallback(new TenantAwareEqualsHashCodeAdvice(jobExecution)); - return manager.register((JobExecution) enhancer.create(new Class[] { JobInstance.class, Long.class, JobParameters.class }, - new Object[] { jobExecution.getJobInstance(), jobExecution.getId(), jobExecution.getJobParameters() })); + return manager.register((JobExecution) enhancer.create(new Class[] { long.class, JobInstance.class, JobParameters.class }, + new Object[] { jobExecution.getId(), jobExecution.getJobInstance(), jobExecution.getJobParameters() })); } public static void close() { From c2e2091bb82d2b9e63d56a3633ba1fce51349d2f Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 19:19:47 +0530 Subject: [PATCH 37/63] FINERACT-2621: drop reserved JPQL alias rejected by EclipseLink 5 Signed-off-by: avinashvijayvargiya --- .../repository/WorkingCapitalLoanRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/repository/WorkingCapitalLoanRepository.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/repository/WorkingCapitalLoanRepository.java index fa29d89567d..26efb3ecc1c 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/repository/WorkingCapitalLoanRepository.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/repository/WorkingCapitalLoanRepository.java @@ -86,7 +86,7 @@ List findAllLoansByLastClosedBusinessDateAndMinAndMaxLoanIdAndStatuses(Lon List findAllLoansBehindOrNullByLoanIdsAndStatuses(@Param("cobBusinessDate") LocalDate cobBusinessDate, @Param("loanIds") List loanIds, @Param("loanStatuses") Collection loanStatuses); - @Query("select loan.id as id from WorkingCapitalLoan loan where loan.externalId = :externalId") + @Query("select loan.id from WorkingCapitalLoan loan where loan.externalId = :externalId") Long findIdByExternalId(@Param("externalId") ExternalId externalId); @Query("select loan.id, loan.lastClosedBusinessDate from WorkingCapitalLoan loan where loan.id IN :loanIds and loan.loanStatus in :loanStatuses and loan.lastClosedBusinessDate < :cobBusinessDate") From 185f91652615065b20033aa0ee7683c6d4887eb3 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 19:19:47 +0530 Subject: [PATCH 38/63] FINERACT-2621: fix provider runtime wiring for Boot 4 startup Signed-off-by: avinashvijayvargiya --- .../JerseyJacksonObjectArgumentHandler.java | 22 +++++++------------ .../jobs/ScheduledJobRunnerConfig.java | 9 ++++++++ .../src/main/resources/application.properties | 3 ++- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java index d922789a64e..d1d8dd76e7f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java @@ -20,6 +20,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.Produces; import jakarta.ws.rs.WebApplicationException; @@ -33,13 +34,10 @@ import java.io.StringWriter; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.util.List; import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; -import org.springframework.http.HttpHeaders; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.http.converter.json.MappingJacksonInputMessage; import org.springframework.stereotype.Component; @Provider @@ -49,7 +47,10 @@ @RequiredArgsConstructor public class JerseyJacksonObjectArgumentHandler implements MessageBodyReader, MessageBodyWriter { - private final MappingJackson2HttpMessageConverter converter; + // The Jersey REST layer stays on Jackson 2; Boot 4 no longer auto-configures the Jackson 2 + // HTTP message converter bean, so bind directly to the Jersey object mapper instead + @Qualifier("objectMapper") + private final ObjectMapper objectMapper; @Override public boolean isReadable(Class type, Type genericType, Annotation[] annotations, jakarta.ws.rs.core.MediaType mediaType) { @@ -68,9 +69,7 @@ public T readFrom(Class type, Type genericType, Annotation[] annotations, jak return type.cast(json); } else { // Create the proper type from the JSON - HttpHeaders headers = new HttpHeaders(); - headers.putAll(httpHeaders); - return (T) converter.read(genericType, type, new MappingJacksonInputMessage(entityStream, headers)); + return (T) objectMapper.readValue(entityStream, objectMapper.getTypeFactory().constructType(genericType)); } } @@ -87,12 +86,7 @@ public void writeTo(T t, Class type, Type genericType, Annotation[] annotatio IOUtils.write((String) t, entityStream, UTF_8); } else { // Create the proper JSON string from the object - HttpHeaders headers = new HttpHeaders(); - httpHeaders.forEach((header, rawValues) -> { - List values = rawValues.stream().map(Object::toString).toList(); - headers.put(header, values); - }); - converter.write(t, genericType, MediaType.APPLICATION_JSON, new SimpleHttpOutputMessage(entityStream, headers)); + objectMapper.writeValue(entityStream, t); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java index 4126d8893ce..89c92c163b8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java @@ -20,7 +20,9 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.apache.fineract.infrastructure.jobs.config.FineractDataFieldMaxValueIncrementerFactory; +import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.configuration.support.MapJobRegistry; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.dao.JacksonExecutionContextStringSerializer; import org.springframework.batch.core.repository.support.JdbcJobRepositoryFactoryBean; @@ -34,6 +36,13 @@ @EnableBatchProcessing public class ScheduledJobRunnerConfig { + @Bean + public JobRegistry jobRegistry() { + // @EnableBatchProcessing's registrar wires its jobOperator against the bean named + // "jobRegistry" but does not define one itself + return new MapJobRegistry(); + } + @Bean public JacksonExecutionContextStringSerializer executionContextSerializer() { return new JacksonExecutionContextStringSerializer(); diff --git a/fineract-provider/src/main/resources/application.properties b/fineract-provider/src/main/resources/application.properties index c8f163894df..c45ba2b0e0b 100644 --- a/fineract-provider/src/main/resources/application.properties +++ b/fineract-provider/src/main/resources/application.properties @@ -429,7 +429,8 @@ management.cloudwatch.metrics.export.namespace=${FINERACT_MANAGEMENT_CLOUDWATCH_ management.cloudwatch.metrics.export.step=${FINERACT_MANAGEMENT_CLOUDWATCH_STEP:1m} spring.autoconfigure.exclude=${FINERACT_AUTOCONFIGURE_EXCLUDE:io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration,\ - io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration} + io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration,\ + io.awspring.cloud.autoconfigure.metrics.CloudWatchExportAutoConfiguration} spring.cloud.aws.endpoint=${FINERACT_AWS_ENDPOINT:} spring.cloud.aws.region.static=${FINERACT_AWS_REGION_STATIC:us-east-1} From eba9e3cc64780c70a2d3ba5b73c93ccb0f251131 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 22:43:51 +0530 Subject: [PATCH 39/63] FINERACT-2621: align test dependencies with JUnit 6 and Boot 4 Signed-off-by: avinashvijayvargiya --- build.gradle | 4 +++- .../org.apache.fineract.dependencies.gradle | 3 +-- fineract-accounting/dependencies.gradle | 1 - fineract-branch/dependencies.gradle | 1 - fineract-charge/dependencies.gradle | 1 - fineract-client-feign/dependencies.gradle | 4 ++-- fineract-client/build.gradle | 8 ++++++++ fineract-cob/dependencies.gradle | 1 - fineract-command-async/dependencies.gradle | 1 - fineract-command-audit/dependencies.gradle | 1 - fineract-command-disruptor/dependencies.gradle | 1 - fineract-command-jdbc/dependencies.gradle | 2 +- fineract-command-test/dependencies.gradle | 1 - fineract-command/dependencies.gradle | 1 - fineract-core/dependencies.gradle | 5 ----- fineract-document/dependencies.gradle | 1 - fineract-e2e-tests-core/build.gradle | 4 ++-- fineract-e2e-tests-runner/build.gradle | 4 ++-- fineract-investor/dependencies.gradle | 1 - fineract-loan-origination/dependencies.gradle | 1 - fineract-loan/dependencies.gradle | 1 - fineract-mix/dependencies.gradle | 1 - fineract-progressive-loan/dependencies.gradle | 1 - fineract-provider/build.gradle | 17 +++++++---------- fineract-provider/dependencies.gradle | 1 - fineract-rates/dependencies.gradle | 1 - fineract-report/dependencies.gradle | 1 - fineract-savings/dependencies.gradle | 1 - fineract-security/dependencies.gradle | 1 - fineract-tax/dependencies.gradle | 1 - fineract-validation/dependencies.gradle | 1 - .../dependencies.gradle | 1 - integration-tests/build.gradle | 6 +++--- oauth2-tests/build.gradle | 2 +- 34 files changed, 30 insertions(+), 52 deletions(-) diff --git a/build.gradle b/build.gradle index 17134efac85..e54322a0476 100644 --- a/build.gradle +++ b/build.gradle @@ -713,6 +713,9 @@ configure(project.fineractJavaProjects) { 'org.slf4j:slf4j-api', 'org.slf4j:log4j-over-slf4j', 'org.slf4j:jul-to-slf4j', + // Spring Framework 7 removed spring-jcl (which provided org.apache.commons.logging); + // commons-logging itself is excluded globally, so bridge JCL to SLF4J everywhere + 'org.slf4j:jcl-over-slf4j', ) implementation ("ch.qos.logback:logback-classic") { exclude(module: "slf4j-api") @@ -838,7 +841,6 @@ configure(project.fineractCustomProjects) { exclude group: 'org.skyscreamer' } testImplementation( 'org.mockito:mockito-core', - 'org.mockito:mockito-inline', 'org.mockito:mockito-junit-jupiter', 'org.junit.jupiter:junit-jupiter-api', 'org.junit.jupiter:junit-jupiter-engine', diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index 1c59017379c..d916307d868 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -29,7 +29,7 @@ dependencyManagement { 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' + mavenBom 'org.junit:junit-bom:6.0.3' 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' @@ -259,7 +259,6 @@ dependencyManagement { dependency 'org.apache.commons:commons-math3:3.6.1' dependency 'commons-beanutils:commons-beanutils:1.11.0' - dependency 'org.mockito:mockito-inline:5.2.0' dependency 'org.wiremock:wiremock-standalone:3.13.2' dependency 'org.apache.sshd:sshd-common:2.17.1' diff --git a/fineract-accounting/dependencies.gradle b/fineract-accounting/dependencies.gradle index 5e4a86ba732..d7ac4f74edf 100644 --- a/fineract-accounting/dependencies.gradle +++ b/fineract-accounting/dependencies.gradle @@ -76,5 +76,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-branch/dependencies.gradle b/fineract-branch/dependencies.gradle index 455f08eba78..4963616c0e6 100644 --- a/fineract-branch/dependencies.gradle +++ b/fineract-branch/dependencies.gradle @@ -71,5 +71,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-charge/dependencies.gradle b/fineract-charge/dependencies.gradle index 930359f1bf0..36f4d150b02 100644 --- a/fineract-charge/dependencies.gradle +++ b/fineract-charge/dependencies.gradle @@ -71,5 +71,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-client-feign/dependencies.gradle b/fineract-client-feign/dependencies.gradle index 746c3b465e6..f8c7ab2167e 100644 --- a/fineract-client-feign/dependencies.gradle +++ b/fineract-client-feign/dependencies.gradle @@ -39,8 +39,8 @@ dependencies { // Test dependencies testImplementation( - 'org.junit.jupiter:junit-jupiter-api:5.14.4', - 'org.junit.jupiter:junit-jupiter-engine:5.14.4', + 'org.junit.jupiter:junit-jupiter-api', + 'org.junit.jupiter:junit-jupiter-engine', 'org.mockito:mockito-core:5.23.0', 'org.assertj:assertj-core:3.27.7', 'org.wiremock:wiremock-standalone' diff --git a/fineract-client/build.gradle b/fineract-client/build.gradle index 89177438163..7974b493a51 100644 --- a/fineract-client/build.gradle +++ b/fineract-client/build.gradle @@ -270,3 +270,11 @@ configurations { generatedCompileClasspath.extendsFrom implementation generatedRuntimeClasspath.extendsFrom runtimeClasspath } + +// The generated SDK targets Java 8; JUnit 6 (managed by the Boot 4 BOM) requires JVM 17+, +// so keep this module's test stack on the JUnit 5 line +dependencyManagement { + imports { + mavenBom 'org.junit:junit-bom:5.14.4' + } +} diff --git a/fineract-cob/dependencies.gradle b/fineract-cob/dependencies.gradle index 47428e4818c..0864231c9cf 100644 --- a/fineract-cob/dependencies.gradle +++ b/fineract-cob/dependencies.gradle @@ -123,7 +123,6 @@ dependencies { implementation ('org.quartz-scheduler:quartz') { exclude group: 'com.zaxxer', module: 'HikariCP-java7' } - testImplementation ('org.mockito:mockito-inline') implementation('org.apache.avro:avro') implementation( project(path: ':fineract-avro-schemas') diff --git a/fineract-command-async/dependencies.gradle b/fineract-command-async/dependencies.gradle index e78c68c16f1..a2d7c191839 100644 --- a/fineract-command-async/dependencies.gradle +++ b/fineract-command-async/dependencies.gradle @@ -47,7 +47,6 @@ dependencies { exclude group: 'org.skyscreamer' } testImplementation ( - 'org.mockito:mockito-inline', 'org.openjdk.jmh:jmh-core', 'org.testcontainers:junit-jupiter', ) diff --git a/fineract-command-audit/dependencies.gradle b/fineract-command-audit/dependencies.gradle index a5409c9a925..264d0f6ca73 100644 --- a/fineract-command-audit/dependencies.gradle +++ b/fineract-command-audit/dependencies.gradle @@ -45,7 +45,6 @@ dependencies { exclude group: 'org.skyscreamer' } testImplementation ( - 'org.mockito:mockito-inline', 'org.testcontainers:junit-jupiter', ) } diff --git a/fineract-command-disruptor/dependencies.gradle b/fineract-command-disruptor/dependencies.gradle index 89b26ea4f90..0b71b858cef 100644 --- a/fineract-command-disruptor/dependencies.gradle +++ b/fineract-command-disruptor/dependencies.gradle @@ -47,7 +47,6 @@ dependencies { exclude group: 'org.skyscreamer' } testImplementation ( - 'org.mockito:mockito-inline', 'org.openjdk.jmh:jmh-core', 'org.testcontainers:junit-jupiter', ) diff --git a/fineract-command-jdbc/dependencies.gradle b/fineract-command-jdbc/dependencies.gradle index 2ce3c9269e0..6027c1f7788 100644 --- a/fineract-command-jdbc/dependencies.gradle +++ b/fineract-command-jdbc/dependencies.gradle @@ -42,6 +42,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.mapstruct:mapstruct-processor' + testImplementation 'org.springframework.boot:spring-boot-liquibase' testImplementation(project(path: ':fineract-command-test')) testImplementation ('org.springframework.boot:spring-boot-starter-test') { exclude group: 'com.jayway.jsonpath', module: 'json-path' @@ -55,7 +56,6 @@ dependencies { 'com.mysql:mysql-connector-j', ) testImplementation ( - 'org.mockito:mockito-inline', 'org.testcontainers:junit-jupiter', 'org.testcontainers:postgresql', 'org.testcontainers:mariadb', diff --git a/fineract-command-test/dependencies.gradle b/fineract-command-test/dependencies.gradle index 728f1162655..7f7705e2869 100644 --- a/fineract-command-test/dependencies.gradle +++ b/fineract-command-test/dependencies.gradle @@ -50,7 +50,6 @@ dependencies { exclude group: 'org.skyscreamer' } implementation ( - 'org.mockito:mockito-inline', 'org.testcontainers:junit-jupiter', 'org.testcontainers:postgresql', 'org.testcontainers:mariadb', diff --git a/fineract-command/dependencies.gradle b/fineract-command/dependencies.gradle index ba0b1db8099..20fba60df2b 100644 --- a/fineract-command/dependencies.gradle +++ b/fineract-command/dependencies.gradle @@ -47,7 +47,6 @@ dependencies { } testImplementation ( project(':fineract-validation'), - 'org.mockito:mockito-inline', 'org.testcontainers:junit-jupiter', 'org.springframework.restdocs:spring-restdocs-mockmvc', 'org.springframework.restdocs:spring-restdocs-webtestclient', diff --git a/fineract-core/dependencies.gradle b/fineract-core/dependencies.gradle index 8b8a94aadaa..58516eb1f3a 100644 --- a/fineract-core/dependencies.gradle +++ b/fineract-core/dependencies.gradle @@ -87,10 +87,6 @@ dependencies { // runtimeOnly dependencies are things that Fineract code has no direct compile time dependency on, but which must be present at run-time runtimeOnly( - // Spring Framework 7 removed spring-jcl, which used to provide org.apache.commons.logging.LogFactory - // (commons-logging itself is excluded globally), so bridge JCL to SLF4J instead - 'org.slf4j:jcl-over-slf4j', - // Although fineract (at the time of writing) doesn't have any compile time dep. on httpclient, // it's useful to have this for the Spring Boot TestRestTemplate http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-rest-templates-test-utility 'org.apache.httpcomponents:httpclient' @@ -127,7 +123,6 @@ dependencies { implementation ('org.quartz-scheduler:quartz') { exclude group: 'com.zaxxer', module: 'HikariCP-java7' } - testImplementation ('org.mockito:mockito-inline') implementation('org.apache.avro:avro') implementation( project(path: ':fineract-avro-schemas') diff --git a/fineract-document/dependencies.gradle b/fineract-document/dependencies.gradle index 999e10976f4..389fdb2e46a 100644 --- a/fineract-document/dependencies.gradle +++ b/fineract-document/dependencies.gradle @@ -74,6 +74,5 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') testImplementation 'com.github.romankh3:image-comparison' } diff --git a/fineract-e2e-tests-core/build.gradle b/fineract-e2e-tests-core/build.gradle index ab7e1581952..fa41cdc6a9f 100644 --- a/fineract-e2e-tests-core/build.gradle +++ b/fineract-e2e-tests-core/build.gradle @@ -85,8 +85,8 @@ dependencies { testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.34.0' 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' + testImplementation 'org.junit.jupiter:junit-jupiter-api' + testImplementation 'org.junit.jupiter:junit-jupiter' testCompileOnly 'org.projectlombok:lombok:1.18.46' testAnnotationProcessor 'org.projectlombok:lombok:1.18.46' diff --git a/fineract-e2e-tests-runner/build.gradle b/fineract-e2e-tests-runner/build.gradle index 7b1dabcf242..97932d1a5fc 100644 --- a/fineract-e2e-tests-runner/build.gradle +++ b/fineract-e2e-tests-runner/build.gradle @@ -47,8 +47,8 @@ dependencies { } testImplementation 'com.google.code.gson:gson:2.14.0' - testImplementation 'org.junit.platform:junit-platform-suite:1.14.4' - testImplementation 'org.junit.platform:junit-platform-console:1.14.4' + testImplementation 'org.junit.platform:junit-platform-suite' + testImplementation 'org.junit.platform:junit-platform-console' testImplementation 'io.cucumber:cucumber-java:7.34.3' testImplementation 'io.cucumber:cucumber-junit:7.34.3' testImplementation 'io.cucumber:cucumber-spring:7.34.3' diff --git a/fineract-investor/dependencies.gradle b/fineract-investor/dependencies.gradle index dafca33c1ef..68d7bc41acc 100644 --- a/fineract-investor/dependencies.gradle +++ b/fineract-investor/dependencies.gradle @@ -80,5 +80,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-loan-origination/dependencies.gradle b/fineract-loan-origination/dependencies.gradle index ecf013a8ced..73d02197ca1 100644 --- a/fineract-loan-origination/dependencies.gradle +++ b/fineract-loan-origination/dependencies.gradle @@ -76,5 +76,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-loan/dependencies.gradle b/fineract-loan/dependencies.gradle index f7df32f6e07..96cbc66f02c 100644 --- a/fineract-loan/dependencies.gradle +++ b/fineract-loan/dependencies.gradle @@ -85,5 +85,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-mix/dependencies.gradle b/fineract-mix/dependencies.gradle index 39266dcf33c..fefedcfd26f 100644 --- a/fineract-mix/dependencies.gradle +++ b/fineract-mix/dependencies.gradle @@ -66,5 +66,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-progressive-loan/dependencies.gradle b/fineract-progressive-loan/dependencies.gradle index 7ae59fe6eba..8013b638bd1 100644 --- a/fineract-progressive-loan/dependencies.gradle +++ b/fineract-progressive-loan/dependencies.gradle @@ -76,5 +76,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle index 9043db3e9fe..4fb240a9dfb 100644 --- a/fineract-provider/build.gradle +++ b/fineract-provider/build.gradle @@ -129,16 +129,13 @@ dependencies { testImplementation 'org.testcontainers:junit-jupiter:1.20.4' testImplementation 'org.mockito:mockito-core' testImplementation 'org.mockito:mockito-junit-jupiter' - 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' + testImplementation 'org.junit.jupiter:junit-jupiter-api' + testImplementation 'org.junit.jupiter:junit-jupiter-params' + testImplementation 'org.junit.platform:junit-platform-commons' + testImplementation 'org.junit.platform:junit-platform-engine' + testImplementation 'org.junit.platform:junit-platform-launcher' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + testRuntimeOnly 'org.junit.platform:junit-platform-suite' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.liquibase:liquibase-core' } diff --git a/fineract-provider/dependencies.gradle b/fineract-provider/dependencies.gradle index c3be088b619..d7159d03047 100644 --- a/fineract-provider/dependencies.gradle +++ b/fineract-provider/dependencies.gradle @@ -230,7 +230,6 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') testRuntimeOnly( 'org.mariadb.jdbc:mariadb-java-client', diff --git a/fineract-rates/dependencies.gradle b/fineract-rates/dependencies.gradle index 8c1b3af62b7..4cf6348d2c0 100644 --- a/fineract-rates/dependencies.gradle +++ b/fineract-rates/dependencies.gradle @@ -70,5 +70,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-report/dependencies.gradle b/fineract-report/dependencies.gradle index 8c1b3af62b7..4cf6348d2c0 100644 --- a/fineract-report/dependencies.gradle +++ b/fineract-report/dependencies.gradle @@ -70,5 +70,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-savings/dependencies.gradle b/fineract-savings/dependencies.gradle index 0e659f4e8e5..6c7d990bfcc 100644 --- a/fineract-savings/dependencies.gradle +++ b/fineract-savings/dependencies.gradle @@ -75,5 +75,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-security/dependencies.gradle b/fineract-security/dependencies.gradle index 5afbe0af363..e7386312ae6 100644 --- a/fineract-security/dependencies.gradle +++ b/fineract-security/dependencies.gradle @@ -93,6 +93,5 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') testImplementation 'org.springframework.security:spring-security-test' } diff --git a/fineract-tax/dependencies.gradle b/fineract-tax/dependencies.gradle index 8c1b3af62b7..4cf6348d2c0 100644 --- a/fineract-tax/dependencies.gradle +++ b/fineract-tax/dependencies.gradle @@ -70,5 +70,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-validation/dependencies.gradle b/fineract-validation/dependencies.gradle index 61f628f1707..0d3a698df3e 100644 --- a/fineract-validation/dependencies.gradle +++ b/fineract-validation/dependencies.gradle @@ -47,5 +47,4 @@ dependencies { exclude group: 'org.skyscreamer' } testImplementation( 'io.github.classgraph:classgraph' ) - testImplementation ('org.mockito:mockito-inline') } diff --git a/fineract-working-capital-loan/dependencies.gradle b/fineract-working-capital-loan/dependencies.gradle index 9a0689ee922..8879b2439e4 100644 --- a/fineract-working-capital-loan/dependencies.gradle +++ b/fineract-working-capital-loan/dependencies.gradle @@ -73,5 +73,4 @@ dependencies { exclude group: 'javax.activation' exclude group: 'org.skyscreamer' } - testImplementation ('org.mockito:mockito-inline') } diff --git a/integration-tests/build.gradle b/integration-tests/build.gradle index 325dca158f8..e28ae90ccec 100644 --- a/integration-tests/build.gradle +++ b/integration-tests/build.gradle @@ -37,9 +37,9 @@ dependencies { driver 'com.mysql:mysql-connector-j' driver 'org.mariadb.jdbc:mariadb-java-client' testImplementation 'org.springframework.boot:spring-boot-starter-test' - 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' + testImplementation 'org.junit.jupiter:junit-jupiter-api' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + testRuntimeOnly 'org.junit.platform:junit-platform-suite' } cargo { diff --git a/oauth2-tests/build.gradle b/oauth2-tests/build.gradle index 2b61705cdf0..32f6d42dad5 100644 --- a/oauth2-tests/build.gradle +++ b/oauth2-tests/build.gradle @@ -38,7 +38,7 @@ dependencies { driver 'org.mariadb.jdbc:mariadb-java-client' 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' + testImplementation 'org.junit.jupiter:junit-jupiter' } cargo { From 582a8299e62d3ab45985d88f04f2e400da5409ee Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 22:43:53 +0530 Subject: [PATCH 40/63] FINERACT-2621: define the Spring Data JDBC dialect explicitly Signed-off-by: avinashvijayvargiya --- .../infrastructure/core/config/JdbcConfig.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcConfig.java index 44c2a070e0d..702ff66b478 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JdbcConfig.java @@ -18,10 +18,14 @@ */ package org.apache.fineract.infrastructure.core.config; +import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; import org.apache.fineract.infrastructure.core.service.database.RoutingDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; +import org.springframework.data.jdbc.core.dialect.JdbcDialect; +import org.springframework.data.jdbc.core.dialect.JdbcMySqlDialect; +import org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect; import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @@ -33,6 +37,13 @@ "org.apache.fineract.mix.domain" }, jdbcOperationsRef = "namedParameterJdbcTemplate", transactionManagerRef = "jdbcTransactionManager") public class JdbcConfig { + @Bean + public JdbcDialect jdbcDialect(DatabaseTypeResolver databaseTypeResolver) { + // Spring Data JDBC 4 resolves the dialect eagerly by probing the DataSource, which does not + // work with the per-tenant RoutingDataSource; MariaDB is handled as MySQL throughout Fineract + return databaseTypeResolver.isPostgreSQL() ? JdbcPostgresDialect.INSTANCE : JdbcMySqlDialect.INSTANCE; + } + @Bean public JdbcTemplate jdbcTemplate(RoutingDataSource dataSource) { return new JdbcTemplate(dataSource); From d6a4aeeef1bce587f1b46347229a63a32b34280c Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Wed, 8 Jul 2026 22:43:53 +0530 Subject: [PATCH 41/63] FINERACT-2621: fix provider unit tests for Boot 4 behavior changes Signed-off-by: avinashvijayvargiya --- .../fineract/cob/loan/LoanCOBPartitionerTest.java | 3 +-- .../CommandProcessingResultSerializationTest.java | 13 +++++-------- .../service/DatatableReadServiceImplTest.java | 7 ++++++- .../infrastructure/jobs/service/JobStarterTest.java | 7 ++++--- ...JournalEntryAggregationJobConfigurationTest.java | 7 +++++++ .../JournalEntryAggregationJobReaderTest.java | 2 ++ .../src/test/resources/application-test.properties | 1 + 7 files changed, 26 insertions(+), 14 deletions(-) diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java index 2ffebb6e509..1e540335376 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerTest.java @@ -96,7 +96,6 @@ public void testLoanCOBPartitionerEmptyBusinessSteps() throws NoSuchJobExecution .thenReturn(Set.of()); when(stepExecution.getJobExecution()).thenReturn(jobExecution); - when(jobExecution.getId()).thenReturn(123L); LoanCOBPartitioner loanCOBPartitioner = new LoanCOBPartitioner(propertyService, cobBusinessStepService, retrieveIdService, jobOperator, stepExecution, 1L); //when @@ -104,7 +103,7 @@ public void testLoanCOBPartitionerEmptyBusinessSteps() throws NoSuchJobExecution //then Assertions.assertEquals(0, partitions.size()); - verify(jobOperator, times(1)).stop(123L); + verify(jobOperator, times(1)).stop(jobExecution); } @Test diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/jersey/CommandProcessingResultSerializationTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/jersey/CommandProcessingResultSerializationTest.java index c279a2f3062..ff278b7526a 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/jersey/CommandProcessingResultSerializationTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/jersey/CommandProcessingResultSerializationTest.java @@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -30,10 +31,8 @@ import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.test.context.ContextConfiguration; @SpringBootTest @@ -41,18 +40,16 @@ public class CommandProcessingResultSerializationTest { @Autowired - private MappingJackson2HttpMessageConverter converter; + @Qualifier("objectMapper") + private ObjectMapper objectMapper; @Test public void testCommandProcessingResultSerialization() throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); CommandProcessingResult commandProcessingResult = CommandProcessingResult.fromDetails(1L, null, null, null, null, null, "resourceIdentifier", null, null, null, null, null, null, null, Boolean.TRUE, null, new ExternalId("externalId"), ExternalId.empty(), null); - SimpleHttpOutputMessage outputMessage = new SimpleHttpOutputMessage(os, headers); - converter.write(commandProcessingResult, MediaType.APPLICATION_JSON, outputMessage); + objectMapper.writeValue(os, commandProcessingResult); Map result = new Gson().fromJson(os.toString(Charset.defaultCharset()), Map.class); assertEquals(4, result.size()); assertEquals("resourceIdentifier", result.get("resourceIdentifier")); 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 9f01e688bac..8bd9364a657 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 @@ -39,11 +39,15 @@ import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData; import org.apache.fineract.infrastructure.dataqueries.exception.DatatableNotFoundException; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; @@ -52,7 +56,8 @@ @SpringBootTest @ContextConfiguration(classes = TestConfiguration.class) - +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) public class DatatableReadServiceImplTest { @Autowired diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java index 3e8d82e2547..9c981a6d8e0 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/JobStarterTest.java @@ -64,14 +64,14 @@ import org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.JobRestartException; -import org.springframework.batch.core.repository.explore.JobExplorer; +import org.springframework.batch.core.repository.JobRepository; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) public class JobStarterTest { @Mock - private JobExplorer jobExplorer; + private JobRepository jobRepository; @Mock private JobOperator jobOperator; @Mock @@ -138,7 +138,8 @@ public void runWithFailed() throws JobInstanceAlreadyCompleteException, JobExecu when(jobExecution.getExitStatus()).thenReturn(new ExitStatus(failedStatus.name(), "testException")); JobExecutionException exception = Assertions.assertThrows(JobExecutionException.class, () -> underTest.run(job, scheduledJobDetail, Set.of(), "default")); - Assertions.assertEquals(String.format("exitCode=%s;exitDescription=%s", failedStatus.name(), "testException"), + Assertions.assertEquals( + String.format("exitCode=%s;exitDescription=%s;exitException=null", failedStatus.name(), "testException"), exception.getMessage()); } } diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java index aa6958390cc..5371f9918f5 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobConfigurationTest.java @@ -19,8 +19,11 @@ package org.apache.fineract.infrastructure.jobs.service.aggregationjob; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.when; +import com.zaxxer.hikari.HikariDataSource; import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; import org.apache.fineract.infrastructure.core.service.migration.TenantDataSourceFactory; @@ -64,6 +67,9 @@ class JournalEntryAggregationJobConfigurationTest { @Mock private TenantDataSourceFactory tenantDataSourceFactory; + @Mock + private HikariDataSource dataSource; + @Mock private DatabaseTypeResolver databaseTypeResolver; @@ -87,6 +93,7 @@ class JournalEntryAggregationJobConfigurationTest { */ @Test public void testJournalEntryDailyAggregationJob() { + when(tenantDataSourceFactory.create(any())).thenReturn(dataSource); given(fineractProperties.getJob()).willReturn(fineractJobProperties); given(fineractJobProperties.getJournalEntryAggregation()).willReturn(journalEntryAggregationProperties); given(fineractJobProperties.getJournalEntryAggregation().getChunkSize()).willReturn(5); diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java index c22feea18f6..8debc8e957a 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReaderTest.java @@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; import com.zaxxer.hikari.HikariDataSource; @@ -74,6 +75,7 @@ public class JournalEntryAggregationJobReaderTest { public void setUp() { tenant = new FineractPlatformTenant(1L, "default", "Default Tenant", "default", fineractPlatformTenantConnection); ThreadLocalContextUtil.setTenant(tenant); + lenient().when(tenantDataSourceFactory.create(tenant)).thenReturn(dataSource); ThreadLocalContextUtil .setBusinessDates(new HashMap<>(Map.of(BusinessDateType.BUSINESS_DATE, LocalDate.now(ZoneId.systemDefault())))); } diff --git a/fineract-provider/src/test/resources/application-test.properties b/fineract-provider/src/test/resources/application-test.properties index efbaad00f28..a3c1e581b22 100644 --- a/fineract-provider/src/test/resources/application-test.properties +++ b/fineract-provider/src/test/resources/application-test.properties @@ -119,6 +119,7 @@ fineract.job.journal-entry-aggregation.exclude-recent-N-days=${FINERACT_JOB_JOUR fineract.job.journal-entry-aggregation.enabled=${FINERACT_JOB_JOURNAL_ENTRY_AGGREGATION_ENABLED:true} #this property if enabled, will create aggregated entry for all data on first run, instead of one entry per submitted_on_date fineract.job.journal-entry-aggregation.chunk-size=${FINERACT_JOB_JOURNAL_ENTRY_AGGREGATION_CHUNK_SIZE:2000} +fineract.job.retainedEarning-chunk-size=${FINERACT_RETAINED_EARNING_CHUNK_SIZE:100} fineract.sampling.enabled=false fineract.sampling.sampledClasses= From b07f574374126c453c015b0037603cbc5138bb9f Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:09 +0530 Subject: [PATCH 42/63] FINERACT-2621: bump EclipseLink to 5.0.1 Signed-off-by: avinashvijayvargiya --- build.gradle | 2 +- .../src/main/groovy/org.apache.fineract.dependencies.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index e54322a0476..c5ab70dcc03 100644 --- a/build.gradle +++ b/build.gradle @@ -108,7 +108,7 @@ buildscript { dependencies { classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0' - classpath 'org.eclipse.persistence:eclipselink:4.0.9' + classpath 'org.eclipse.persistence:eclipselink:5.0.1' 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.20.0' diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index d916307d868..d4410638c79 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -50,7 +50,7 @@ dependencyManagement { 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:5.0.0' + dependency 'org.eclipse.persistence:org.eclipse.persistence.jpa:5.0.1' 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' From f274b78a4a0009aa73783f17d38cbcd4131a63ac Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:10 +0530 Subject: [PATCH 43/63] FINERACT-2621: reuse enhanced executions in StepSynchronizationManager Signed-off-by: avinashvijayvargiya --- .../core/scope/context/StepSynchronizationManager.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java index 07fca6e4edf..ef8773e8260 100644 --- a/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java +++ b/fineract-core/src/main/java/org/springframework/batch/core/scope/context/StepSynchronizationManager.java @@ -49,6 +49,12 @@ public static StepContext getContext() { } public static StepContext register(StepExecution stepExecution) { + if (Enhancer.isEnhanced(stepExecution.getClass())) { + // already wrapped by a previous registration (e.g. when re-registering on a + // chunk-processing pool thread); reuse it so the shared context map finds the + // existing context and step-scoped beans resolve to the same instances + return manager.register(stepExecution); + } Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(StepExecution.class); enhancer.setCallback(new TenantAwareEqualsHashCodeAdvice(stepExecution)); From 4d34813fae7ec41fa237b070b4baf8af22535a58 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:11 +0530 Subject: [PATCH 44/63] FINERACT-2621: adapt COB item processing to Batch 6 chunk semantics Signed-off-by: avinashvijayvargiya --- .../org/apache/fineract/cob/COBBusinessStepServiceImpl.java | 5 +++++ .../apache/fineract/cob/processor/AbstractItemProcessor.java | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java b/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java index a4c9031f31a..3e815c88f07 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java @@ -40,6 +40,7 @@ import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @Slf4j @@ -56,6 +57,10 @@ public class COBBusinessStepServiceImpl implements COBBusinessStepService { @SuppressWarnings({ "unchecked" }) @Override + // Spring Batch 6 ChunkOrientedStep runs item processing on task-executor threads OUTSIDE the chunk transaction, + // so the business step chain must open its own transaction there; in sequential mode REQUIRED simply joins the + // chunk transaction, matching the Batch 5 behavior + @Transactional public , S extends AbstractPersistableCustom> S run(TreeMap executionMap, S item) { if (executionMap == null || executionMap.isEmpty()) { throw new BusinessStepException("Execution map is empty! COB Business step execution skipped!"); diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java index e30829ceddd..565b1ea88a9 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java @@ -33,12 +33,14 @@ import org.jspecify.annotations.NonNull; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.annotation.AfterStep; +import org.springframework.batch.core.listener.StepExecutionListener; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ExecutionContext; import org.springframework.batch.infrastructure.item.ItemProcessor; @RequiredArgsConstructor -public abstract class AbstractItemProcessor> implements ItemProcessor { +public abstract class AbstractItemProcessor> + implements ItemProcessor, StepExecutionListener { private final COBBusinessStepService cobBusinessStepService; From 8997eba3cb9b0ee11c5f4b8b447f91ea8149141a Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:11 +0530 Subject: [PATCH 45/63] FINERACT-2621: propagate step context to COB worker threads Signed-off-by: avinashvijayvargiya --- .../fineract/cob/loan/ContextAwareTaskDecorator.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java b/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java index e794d482019..473f367e139 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java +++ b/fineract-loan/src/main/java/org/apache/fineract/cob/loan/ContextAwareTaskDecorator.java @@ -22,6 +22,8 @@ import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.jspecify.annotations.NonNull; +import org.springframework.batch.core.scope.context.StepContext; +import org.springframework.batch.core.scope.context.StepSynchronizationManager; import org.springframework.core.task.TaskDecorator; /** @@ -34,12 +36,22 @@ public class ContextAwareTaskDecorator implements TaskDecorator { @Override public Runnable decorate(@NonNull final Runnable runnable) { final FineractContext context = ThreadLocalContextUtil.getContext(); + // Batch 6's chunk-oriented step processes items concurrently on pool threads without + // registering the step context there, which breaks step-scoped bean resolution; capture the + // context at submission (on the step thread) and register it on the executing thread + final StepContext stepContext = StepSynchronizationManager.getContext(); return () -> { try { log.debug("Initializing thread context for decorated task"); ThreadLocalContextUtil.init(context); + if (stepContext != null) { + StepSynchronizationManager.register(stepContext.getStepExecution()); + } runnable.run(); } finally { + if (stepContext != null) { + StepSynchronizationManager.close(); + } ThreadLocalContextUtil.reset(); } }; From 54e8fc1469eea2c83255882c18ff72bb4ff01e46 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:11 +0530 Subject: [PATCH 46/63] FINERACT-2621: fix working capital COB step wiring for Batch 6 Signed-off-by: avinashvijayvargiya --- .../WorkingCapitalLoanCOBWorkerConfiguration.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java index 7a90cbbcb5c..93a95fddcf8 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java @@ -77,12 +77,14 @@ public class WorkingCapitalLoanCOBWorkerConfiguration { @Bean(WORKING_CAPITAL_LOAN_COB_WORKER_STEP) public Step workingCapitalLoanCOBWorkerStep(final COBBusinessStepService cobBusinessStepService) { + WorkingCapitalLoanCOBWorkerItemReader reader = new WorkingCapitalLoanCOBWorkerItemReader(workingCapitalLoanRepository, + new BeforeStepLockingItemReaderHelper(retrieveIdService, wpcLoanLockingService)); + WorkingCapitalLoanCOBWorkerItemProcessor processor = new WorkingCapitalLoanCOBWorkerItemProcessor(cobBusinessStepService); final ChunkOrientedStepBuilder stepBuilder = stepBuilderFactory .get(WORKING_CAPITAL_LOAN_COB_WORKER_STEP).inputChannel(inboundRequests) .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name())) // - .reader(new WorkingCapitalLoanCOBWorkerItemReader(workingCapitalLoanRepository, - new BeforeStepLockingItemReaderHelper(retrieveIdService, wpcLoanLockingService))) // - .processor(new WorkingCapitalLoanCOBWorkerItemProcessor(cobBusinessStepService)) // + .reader(reader) // + .processor(processor) // .writer(new WorkingCapitalLoanCOBWorkerItemWriter(wpcLoanLockingService, workingCapitalLoanRepository)) // .faultTolerant() // .retry(Exception.class) // @@ -93,6 +95,11 @@ public Step workingCapitalLoanCOBWorkerStep(final COBBusinessStepService cobBusi .listener(workingCapitalCobWorkerStepListener()) // .transactionManager(transactionManager); + // Batch 6's chunk-oriented step no longer scans item components for step-listener + // annotations, so register the reader and processor as StepExecutionListeners explicitly + stepBuilder.listener(reader); + stepBuilder.listener(processor); + if (propertyService.getThreadPoolMaxPoolSize(WORKING_CAPITAL_JOB_NAME) > 1) { stepBuilder.taskExecutor((AsyncTaskExecutor) workingCapitalCobTaskExecutor()); } From 20e14b8a21a96cb6087870e60d18b72e28f2ecf4 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:11 +0530 Subject: [PATCH 47/63] FINERACT-2621: fix trial balance date mapping under EclipseLink 5 Signed-off-by: avinashvijayvargiya --- .../UpdateTrialBalanceDetailsTasklet.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java b/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java index e4cf5e6c857..306560cd9b2 100644 --- a/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java +++ b/fineract-accounting/src/main/java/org/apache/fineract/accounting/glaccount/jobs/updatetrialbalancedetails/UpdateTrialBalanceDetailsTasklet.java @@ -20,6 +20,7 @@ import java.math.BigDecimal; import java.time.LocalDate; +import java.time.OffsetDateTime; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -77,7 +78,9 @@ private void insertTrialBalanceForDate(LocalDate tbGap) { tb.setGlAccountId((Long) row[1]); tb.setAmount((BigDecimal) row[2]); tb.setEntryDate((LocalDate) row[3]); - tb.setTransactionDate((LocalDate) row[4]); + // je.createdDate is the OffsetDateTime audit field; EclipseLink 5 materializes it as such in + // Object[] projections where EclipseLink 4 handed back a date-castable value + tb.setTransactionDate(((OffsetDateTime) row[4]).toLocalDate()); tb.setClosingBalance((BigDecimal) row[5]); return tb; }).toList(); From cb0ba1ff0a7debc6857e638aeef0f8da74cfa653 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:27 +0530 Subject: [PATCH 48/63] FINERACT-2621: fix provider COB job runtime for Batch 6 Signed-off-by: avinashvijayvargiya --- .../cob/loan/AbstractLoanItemReader.java | 3 ++- .../cob/loan/LoanCOBWorkerConfiguration.java | 5 +++++ .../fineract/cob/loan/LoanInlineCOBConfig.java | 10 ++++++++-- .../WorkingCapitalLoanInlineCOBConfig.java | 11 +++++++++-- ...InlineCommonLockableCOBExecutorService.java | 3 ++- .../jobs/ScheduledJobRunnerConfig.java | 18 +++++++++++++++++- .../jobs/service/JobStarter.java | 6 +++++- .../jobs/service/JobStarterTest.java | 2 +- 8 files changed, 49 insertions(+), 9 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java index f363aef38fc..0918b0c6682 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java @@ -29,13 +29,14 @@ import org.jspecify.annotations.NonNull; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.annotation.AfterStep; +import org.springframework.batch.core.listener.StepExecutionListener; import org.springframework.batch.core.step.StepExecution; import org.springframework.batch.infrastructure.item.ItemReader; import org.springframework.data.repository.CrudRepository; @Slf4j @RequiredArgsConstructor -public abstract class AbstractLoanItemReader> implements ItemReader { +public abstract class AbstractLoanItemReader> implements ItemReader, StepExecutionListener { protected final CrudRepository loanRepository; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java index 32db2792cf6..43536a1b9a3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java @@ -108,6 +108,11 @@ public Step loanCOBWorkerStep() { .listener(cobWorkerStepListener()) // .transactionManager(transactionManager); + // Batch 6's chunk-oriented step no longer scans item components for step-listener + // annotations, so register the reader and processor as StepExecutionListeners explicitly + stepBuilder.listener(cobWorkerItemReader()); + stepBuilder.listener(cobWorkerItemProcessor()); + if (propertyService.getThreadPoolMaxPoolSize(LoanCOBConstant.JOB_NAME) > 1) { stepBuilder.taskExecutor((AsyncTaskExecutor) cobTaskExecutor()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java index 448c84faecb..c11e8efdd0e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java @@ -37,6 +37,7 @@ import org.springframework.batch.core.listener.ExecutionContextPromotionListener; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.Step; +import org.springframework.batch.core.step.builder.ChunkOrientedStepBuilder; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.integration.config.annotation.EnableBatchIntegration; import org.springframework.beans.factory.annotation.Autowired; @@ -89,10 +90,15 @@ protected Step inlineCOBBuildExecutionContextStep() { @Bean public Step inlineLoanCOBStep() { - return new StepBuilder("Inline Loan COB Step", jobRepository) + ChunkOrientedStepBuilder stepBuilder = new StepBuilder("Inline Loan COB Step", jobRepository) .chunk(propertyService.getChunkSize(JobName.LOAN_COB.name())).transactionManager(transactionManager) .reader(inlineCobWorkerItemReader()).processor(inlineCobWorkerItemProcessor()).writer(inlineCobWorkerItemWriter()) - .listener(inlineCobLoanItemListener()).build(); + .listener(inlineCobLoanItemListener()); + // Batch 6's chunk-oriented step no longer scans item components for step-listener + // annotations, so register the reader and processor as StepExecutionListeners explicitly + stepBuilder.listener(inlineCobWorkerItemReader()); + stepBuilder.listener(inlineCobWorkerItemProcessor()); + return stepBuilder.build(); } @Bean(name = "loanInlineCOBJob") diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java index fefc1fd7cea..52d71a95677 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalLoanInlineCOBConfig.java @@ -42,6 +42,7 @@ import org.springframework.batch.core.listener.ExecutionContextPromotionListener; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.Step; +import org.springframework.batch.core.step.builder.ChunkOrientedStepBuilder; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.integration.config.annotation.EnableBatchIntegration; import org.springframework.beans.factory.annotation.Qualifier; @@ -90,11 +91,17 @@ public Step inlineWorkingCapitalLoanCOBStep(WorkingCapitalInlineCOBLoanItemReade WorkingCapitalLoanInlineCOBWorkerItemProcessor inlineWorkingCapitalLoanCobWorkerItemProcessor, InlineWorkingCapitalLoanCOBWorkerItemWriter inlineWorkingCapitalLoanCobWorkerItemWriter, InlineWorkingCapitalLoanCOBWorkerItemListener inlineWorkingCapitalLoanCobLoanItemListener) { - return new StepBuilder("Inline Working Capital Loan COB Step", jobRepository) + ChunkOrientedStepBuilder stepBuilder = new StepBuilder( + "Inline Working Capital Loan COB Step", jobRepository) .chunk(propertyService.getChunkSize(JobName.WORKING_CAPITAL_LOAN_COB_JOB.name())) .transactionManager(transactionManager).reader(inlineWorkingCapitalLoanCobWorkerItemReader) .processor(inlineWorkingCapitalLoanCobWorkerItemProcessor).writer(inlineWorkingCapitalLoanCobWorkerItemWriter) - .listener(inlineWorkingCapitalLoanCobLoanItemListener).build(); + .listener(inlineWorkingCapitalLoanCobLoanItemListener); + // Batch 6's chunk-oriented step no longer scans item components for step-listener + // annotations, so register the reader and processor as StepExecutionListeners explicitly + stepBuilder.listener(inlineWorkingCapitalLoanCobWorkerItemReader); + stepBuilder.listener(inlineWorkingCapitalLoanCobWorkerItemProcessor); + return stepBuilder.build(); } @Bean(name = "inlineWorkingCapitalLoanCOBJob") diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java index 54e4a6223f9..ec2f2237b8b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/InlineCommonLockableCOBExecutorService.java @@ -140,7 +140,8 @@ private void execute(List loanIds, String jobName, LocalDate businessDate) .addJobParameters(new JobParameters(new HashSet<>(getJobParametersMap(loanIds, businessDate).values()))).toJobParameters(); JobExecution jobExecution; try { - jobExecution = jobOperator.start(inlineLoanCOBJob, jobParameters); + // see JobStarter: Batch 6 start() ignores explicit parameters when the job has an incrementer + jobExecution = jobOperator.run(inlineLoanCOBJob, jobParameters); } catch (Exception e) { log.error("{}{}", JOB_EXECUTION_FAILED_MESSAGE, jobName, e); throw new PlatformInternalServerException("error.msg.sheduler.job.execution.failed", JOB_EXECUTION_FAILED_MESSAGE, jobName, e); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java index 89c92c163b8..81472ce6a8b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/ScheduledJobRunnerConfig.java @@ -31,6 +31,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.jsontype.BasicPolymorphicTypeValidator; +import tools.jackson.databind.jsontype.PolymorphicTypeValidator; @Configuration(proxyBeanMethods = false) @EnableBatchProcessing @@ -45,7 +48,20 @@ public JobRegistry jobRegistry() { @Bean public JacksonExecutionContextStringSerializer executionContextSerializer() { - return new JacksonExecutionContextStringSerializer(); + // mirrors the serializer's default type validator, extended with Fineract types, because + // execution contexts carry e.g. the COB business-step set and partition parameters + PolymorphicTypeValidator typeValidator = BasicPolymorphicTypeValidator.builder() // + .allowIfSubType("java.util.") // + .allowIfSubType("java.sql.") // + .allowIfSubType("java.lang.") // + .allowIfSubType("java.math.") // + .allowIfSubType("java.time.") // + .allowIfSubType("java.net.") // + .allowIfSubType("java.xml.") // + .allowIfSubType("org.springframework.batch.") // + .allowIfSubType("org.apache.fineract.") // + .build(); + return new JacksonExecutionContextStringSerializer(JsonMapper.builder().activateDefaultTyping(typeValidator).build()); } @Bean diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java index 614e0fea76d..5360d3a3401 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobStarter.java @@ -105,7 +105,11 @@ public JobExecution run(Job job, ScheduledJobDetail scheduledJobDetail, Set Date: Fri, 10 Jul 2026 11:55:27 +0530 Subject: [PATCH 49/63] FINERACT-2621: guard accrual reprocessing against unsaved loans Signed-off-by: avinashvijayvargiya --- .../service/LoanAccrualsProcessingServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java index c78b6224d0e..91c07ae6703 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java @@ -205,6 +205,11 @@ public void addAccruals(@NonNull LocalDate tillDate) throws JobExecutionExceptio */ @Override public void reprocessExistingAccruals(@NonNull final Loan loan, final boolean addEvent) { + if (loan.getId() == null) { + // a not-yet-persisted loan cannot have accrual transactions; also, EclipseLink 5 types a + // null entity parameter as VARCHAR, which PostgreSQL rejects against the bigint FK column + return; + } List accrualTransactions = retrieveListOfAccrualTransactions(loan); if (!accrualTransactions.isEmpty()) { if (loan.isPeriodicAccrualAccountingEnabledOnLoanProduct()) { From 807759051dfc2ac83bbc50a13ce4489824528883 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:28 +0530 Subject: [PATCH 50/63] FINERACT-2621: keep lenient loan id parsing in COB api filters Signed-off-by: avinashvijayvargiya --- .../infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java | 4 +++- .../jobs/filter/ProgressiveLoanModelCheckerHelper.java | 4 +++- .../jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java index c5345dd4d50..e3533166f70 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/LoanCOBFilterHelperImpl.java @@ -193,7 +193,9 @@ private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) { if (StringUtils.isNotBlank(body)) { JsonNode jsonNode = objectMapper.readTree(body); if (jsonNode.has("loanId")) { - return jsonNode.get("loanId").asLong(); + // the body may hold an unresolved batch reference like "$.loanId"; Jackson 3 asLong() throws on + // non-numeric values while Jackson 2 returned 0, so keep the lenient behavior explicitly + return jsonNode.get("loanId").asLong(0); } } return null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java index cd83bc5b6d5..b0b401a5f1b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/ProgressiveLoanModelCheckerHelper.java @@ -132,7 +132,9 @@ private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) { if (StringUtils.isNotBlank(body)) { JsonNode jsonNode = objectMapper.readTree(body); if (jsonNode.has("loanId")) { - return jsonNode.get("loanId").asLong(); + // the body may hold an unresolved batch reference like "$.loanId"; Jackson 3 asLong() throws on + // non-numeric values while Jackson 2 returned 0, so keep the lenient behavior explicitly + return jsonNode.get("loanId").asLong(0); } } return null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java index 8872db6ff19..6f406bd72c1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/filter/WorkingCapitalLoanCOBFilterHelperImpl.java @@ -169,7 +169,9 @@ private Long getTopLevelLoanIdFromBatchRequest(BatchRequest batchRequest) { if (StringUtils.isNotBlank(body)) { JsonNode jsonNode = objectMapper.readTree(body); if (jsonNode.has("loanId")) { - return jsonNode.get("loanId").asLong(); + // the body may hold an unresolved batch reference like "$.loanId"; Jackson 3 asLong() throws on + // non-numeric values while Jackson 2 returned 0, so keep the lenient behavior explicitly + return jsonNode.get("loanId").asLong(0); } } return null; From 2af34edfd5105263e65d66354b9b3baeac504119 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Fri, 10 Jul 2026 11:55:28 +0530 Subject: [PATCH 51/63] FINERACT-2621: restore JSON error contract in Jersey body reader Signed-off-by: avinashvijayvargiya --- .../JerseyJacksonObjectArgumentHandler.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java index d1d8dd76e7f..6dba7355ddd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/jersey/JerseyJacksonObjectArgumentHandler.java @@ -20,6 +20,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.Produces; @@ -37,7 +38,10 @@ import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.stereotype.Component; @Provider @@ -69,7 +73,27 @@ public T readFrom(Class type, Type genericType, Annotation[] annotations, jak return type.cast(json); } else { // Create the proper type from the JSON - return (T) objectMapper.readValue(entityStream, objectMapper.getTypeFactory().constructType(genericType)); + try { + return (T) objectMapper.readValue(entityStream, objectMapper.getTypeFactory().constructType(genericType)); + } catch (JsonProcessingException e) { + // preserve the contract of the removed MappingJackson2HttpMessageConverter: malformed or unbindable + // JSON must surface as HttpMessageNotReadableException so HttpMessageNotReadableErrorController + // renders the platform JSON validation error instead of a raw Jackson message + HttpHeaders headers = new HttpHeaders(); + headers.putAll(httpHeaders); + throw new HttpMessageNotReadableException("JSON parse error: " + e.getOriginalMessage(), e, new HttpInputMessage() { + + @Override + public InputStream getBody() { + return entityStream; + } + + @Override + public HttpHeaders getHeaders() { + return headers; + } + }); + } } } From e486311b3305eab85b71d7275fe98b69ecfb9afa Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 11:03:52 +0530 Subject: [PATCH 52/63] FINERACT-2621: fix external event query rejected by EclipseLink 5 Signed-off-by: avinashvijayvargiya --- .../event/external/repository/domain/ExternalEvent.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java index db0a63b3c89..82e65128c82 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java @@ -37,7 +37,10 @@ @Table(name = "m_external_event") @Getter @NoArgsConstructor -public class ExternalEvent extends AbstractPersistableCustom { +// implementing the view makes Spring Data return the entity directly instead of generating a +// projection query whose per-property aliases (id, type, schema, data) EclipseLink 5 rejects as +// JPQL reserved identifiers +public class ExternalEvent extends AbstractPersistableCustom implements ExternalEventView { @Column(name = "type", nullable = false) private String type; From a3df5134e59d43ff4d8d71064c4519858e1ba435 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 11:03:53 +0530 Subject: [PATCH 53/63] FINERACT-2621: move Batch Kafka messaging to Jackson 3 serializers Signed-off-by: avinashvijayvargiya --- .../messagehandler/kafka/KafkaManagerConfig.java | 4 ++-- .../springbatch/messagehandler/kafka/KafkaWorkerConfig.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaManagerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaManagerConfig.java index 3e39d0ad392..c5dc01f4b12 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaManagerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaManagerConfig.java @@ -43,7 +43,7 @@ import org.springframework.kafka.core.DefaultKafkaProducerFactory; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.ProducerFactory; -import org.springframework.kafka.support.serializer.JsonSerializer; +import org.springframework.kafka.support.serializer.JacksonJsonSerializer; import org.springframework.messaging.support.GenericMessage; @Configuration @@ -64,7 +64,7 @@ public ProducerFactory producerFactory() { fineractProperties.getRemoteJobMessageHandler().getKafka().getProducer().getExtraPropertiesMap()); props.put(BOOTSTRAP_SERVERS_CONFIG, fineractProperties.getRemoteJobMessageHandler().getKafka().getBootstrapServers()); props.put(KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class); - props.put(VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class); + props.put(VALUE_SERIALIZER_CLASS_CONFIG, JacksonJsonSerializer.class); return new DefaultKafkaProducerFactory<>(props); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java index babc7f54962..943bbbfdfdc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java @@ -23,7 +23,7 @@ import static org.apache.kafka.clients.consumer.ConsumerConfig.GROUP_ID_CONFIG; import static org.apache.kafka.clients.consumer.ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG; import static org.apache.kafka.clients.consumer.ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG; -import static org.springframework.kafka.support.serializer.JsonDeserializer.TRUSTED_PACKAGES; +import static org.springframework.kafka.support.serializer.JacksonJsonDeserializer.TRUSTED_PACKAGES; import java.util.HashMap; import java.util.Map; @@ -41,7 +41,7 @@ import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; import org.springframework.kafka.listener.ContainerProperties; -import org.springframework.kafka.support.serializer.JsonDeserializer; +import org.springframework.kafka.support.serializer.JacksonJsonDeserializer; @Configuration @Conditional(KafkaWorkerCondition.class) @@ -61,7 +61,7 @@ public ConsumerFactory consumerFactory() { props.put(BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getBootstrapServers()); props.put(GROUP_ID_CONFIG, kafkaProperties.getConsumer().getGroupId()); props.put(KEY_DESERIALIZER_CLASS_CONFIG, IntegerDeserializer.class); - props.put(VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class); + props.put(VALUE_DESERIALIZER_CLASS_CONFIG, JacksonJsonDeserializer.class); props.put(TRUSTED_PACKAGES, "*"); props.put(AUTO_OFFSET_RESET_CONFIG, "earliest"); return new DefaultKafkaConsumerFactory<>(props); From 196fb7cb256ffdbc5407e3b0b9b55c54edaa9af1 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 11:03:53 +0530 Subject: [PATCH 54/63] FINERACT-2621: allow duplicated public suffix list on test classpath Signed-off-by: avinashvijayvargiya --- .../classpath/ClasspathDuplicatesStepDefinitions.java | 2 ++ 1 file changed, 2 insertions(+) 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 7790248b2d6..32c0b703fbc 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 @@ -153,6 +153,8 @@ private boolean isHarmlessDuplicate(String resourcePath) { || resourcePath.startsWith("META-INF/additional-spring") // || resourcePath.startsWith("META-INF/terracotta") // || resourcePath.startsWith("com/fasterxml/jackson/core/io/doubleparser") // + // httpclient5 5.5+ and docker-java-transport-zerodep both bundle Mozilla's public suffix list + || resourcePath.startsWith("org/publicsuffix/list/") // // Groovy is groovy || resourcePath.startsWith("META-INF/groovy") // || resourcePath.startsWith("org/springframework/batch/core/scope/context/JobSynchronizationManager") // From 5e1629d4ca8688b48ad425c9ca4e8cc0294b21fb Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 12:16:38 +0530 Subject: [PATCH 55/63] FINERACT-2621: add missing Override in COB item processor Signed-off-by: avinashvijayvargiya --- .../org/apache/fineract/cob/processor/AbstractItemProcessor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java index 565b1ea88a9..dfa2f3e77d8 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/processor/AbstractItemProcessor.java @@ -68,6 +68,7 @@ protected void setBusinessDate(StepExecution stepExecution) { businessDate = BusinessDateResolver.resolve(stepExecution); } + @Override @AfterStep public ExitStatus afterStep(@NonNull StepExecution stepExecution) { return ExitStatus.COMPLETED; From 2564aa566b2f516bc584e51e146cdebb44315bdb Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 12:16:39 +0530 Subject: [PATCH 56/63] FINERACT-2621: add missing Overrides in working capital COB workers Signed-off-by: avinashvijayvargiya --- .../WorkingCapitalLoanCOBWorkerItemProcessor.java | 1 + .../WorkingCapitalLoanInlineCOBWorkerItemProcessor.java | 1 + 2 files changed, 2 insertions(+) diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java index d54569646a0..967d7a5f03b 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerItemProcessor.java @@ -28,6 +28,7 @@ public WorkingCapitalLoanCOBWorkerItemProcessor(COBBusinessStepService cobBusine super(cobBusinessStepService); } + @Override @BeforeStep public void beforeStep(StepExecution stepExecution) { setExecutionContext(stepExecution.getExecutionContext()); diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java index 4e085e8be6e..20f57242086 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanInlineCOBWorkerItemProcessor.java @@ -28,6 +28,7 @@ public WorkingCapitalLoanInlineCOBWorkerItemProcessor(COBBusinessStepService cob super(cobBusinessStepService); } + @Override @BeforeStep public void beforeStep(StepExecution stepExecution) { setExecutionContext(stepExecution.getJobExecution().getExecutionContext()); From 4711dd43c8677f42c1e6350fbb2d09a5a8b17d0c Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 12:16:39 +0530 Subject: [PATCH 57/63] FINERACT-2621: add missing Overrides in provider COB classes Signed-off-by: avinashvijayvargiya --- .../org/apache/fineract/cob/loan/AbstractLoanItemReader.java | 1 + .../org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java | 1 + .../org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java | 1 + .../java/org/apache/fineract/cob/loan/LoanItemProcessor.java | 1 + .../main/java/org/apache/fineract/cob/loan/LoanItemReader.java | 1 + .../fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java | 1 + 6 files changed, 6 insertions(+) diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java index 0918b0c6682..c75737063d9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemReader.java @@ -56,6 +56,7 @@ public T read() throws Exception { return null; } + @Override @AfterStep public ExitStatus afterStep(@NonNull StepExecution stepExecution) { return ExitStatus.COMPLETED; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java index 7f5d384bbb7..0599b480f60 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemProcessor.java @@ -30,6 +30,7 @@ public InlineCOBLoanItemProcessor(COBBusinessStepService cobBusinessStepService, super(cobBusinessStepService, progressiveLoanModelProcessingService); } + @Override @BeforeStep public void beforeStep(StepExecution stepExecution) { setExecutionContext(stepExecution.getJobExecution().getExecutionContext()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java index 1ad2deb3023..f0d977bd5b8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineCOBLoanItemReader.java @@ -33,6 +33,7 @@ public InlineCOBLoanItemReader(LoanRepository loanRepository) { super(loanRepository); } + @Override @BeforeStep @SuppressWarnings({ "unchecked" }) public void beforeStep(@NonNull StepExecution stepExecution) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java index 26fa4658271..943ad9acd5b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemProcessor.java @@ -30,6 +30,7 @@ public LoanItemProcessor(COBBusinessStepService cobBusinessStepService, super(cobBusinessStepService, progressiveLoanModelProcessingService); } + @Override @BeforeStep public void beforeStep(StepExecution stepExecution) { setExecutionContext(stepExecution.getExecutionContext()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java index 8a55e64daab..8a12af4525a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java @@ -36,6 +36,7 @@ public LoanItemReader(LoanRepository loanRepository, BeforeStepLockingItemReader this.beforeStepLockingItemReaderHelper = beforeStepLockingItemReaderHelper; } + @Override @BeforeStep public void beforeStep(@NonNull StepExecution stepExecution) { setRemainingData(beforeStepLockingItemReaderHelper.filterRemainingData(stepExecution)); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java index 8c4ed456bc5..4b1984e6e20 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/WorkingCapitalInlineCOBLoanItemReader.java @@ -34,6 +34,7 @@ public WorkingCapitalInlineCOBLoanItemReader(WorkingCapitalLoanRepository loanRe super(loanRepository); } + @Override @BeforeStep @SuppressWarnings({ "unchecked" }) public void beforeStep(@NonNull StepExecution stepExecution) { From 72d38d5c8efe3cbb914255bb835ef4cecde06986 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 12:16:39 +0530 Subject: [PATCH 58/63] FINERACT-2621: stub loan id in accrual reprocessing test Signed-off-by: avinashvijayvargiya --- .../service/LoanAccrualsProcessingServiceImplTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImplTest.java index b0bac77bb3f..108109e03b9 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImplTest.java @@ -218,6 +218,8 @@ void reprocessExistingAccruals_ShouldCreateAdjustmentNotReverse_ForPostDueDateAc LoanRepaymentScheduleInstallment lastInstallment = mock(LoanRepaymentScheduleInstallment.class); when(lastInstallment.getDueDate()).thenReturn(lastDueDate); when(loan.getLastLoanRepaymentScheduleInstallment()).thenReturn(lastInstallment); + // reprocessing skips unsaved loans, so the mock must look persisted + when(loan.getId()).thenReturn(1L); when(loan.isChargedOff()).thenReturn(false); when(loan.isPeriodicAccrualAccountingEnabledOnLoanProduct()).thenReturn(true); when(loan.isProgressiveSchedule()).thenReturn(false); // cumulative From 5755bd3c1e7f58e228157a1416bf506fa7f793ab Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sat, 11 Jul 2026 15:10:24 +0530 Subject: [PATCH 59/63] FINERACT-2621: bump Spring Boot to 4.1.0 Signed-off-by: avinashvijayvargiya --- build.gradle | 2 +- .../src/main/groovy/org.apache.fineract.dependencies.gradle | 2 +- .../fineract/infrastructure/core/config/jpa/JPAConfig.java | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index c5ab70dcc03..d3d25470066 100644 --- a/build.gradle +++ b/build.gradle @@ -126,7 +126,7 @@ plugins { 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.2' apply false - id 'org.springframework.boot' version '4.0.7' apply false + id 'org.springframework.boot' version '4.1.0' 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 diff --git a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle index d4410638c79..a3a60b7cf66 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle @@ -25,7 +25,7 @@ dependencyManagement { mavenBom 'com.squareup.okhttp3:okhttp-bom:4.12.0' mavenBom 'org.slf4j:slf4j-bom:2.0.17' mavenBom 'io.micrometer:micrometer-bom:1.16.5' - mavenBom 'org.springframework.boot:spring-boot-dependencies:4.0.7' + mavenBom 'org.springframework.boot:spring-boot-dependencies:4.1.0' 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' diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java index a8234abc61d..28ceeb81b1d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/jpa/JPAConfig.java @@ -44,6 +44,7 @@ import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; +import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.data.domain.AuditorAware; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -109,8 +110,9 @@ protected String[] getPackagesToScan() { @Override public EntityManagerFactoryBuilder entityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter, ObjectProvider persistenceUnitManager, - ObjectProvider customizers) { - EntityManagerFactoryBuilder builder = super.entityManagerFactoryBuilder(jpaVendorAdapter, persistenceUnitManager, customizers); + ObjectProvider customizers, Map taskExecutors) { + EntityManagerFactoryBuilder builder = super.entityManagerFactoryBuilder(jpaVendorAdapter, persistenceUnitManager, customizers, + taskExecutors); builder.setPersistenceUnitPostProcessors(getPersistenceUnitPostProcessors()); return builder; } From 3737129dcef7527e5f0f9db26620844168c27f1d Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 13 Jul 2026 15:41:35 +0530 Subject: [PATCH 60/63] FINERACT-2621: size COB worker queue for Batch 6 chunk submission Signed-off-by: avinashvijayvargiya --- .../apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java index 43536a1b9a3..bd72d260f42 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBWorkerConfiguration.java @@ -130,7 +130,8 @@ public TaskExecutor cobTaskExecutor() { taskExecutor.setThreadGroupName("COB-Thread"); taskExecutor.setCorePoolSize(propertyService.getThreadPoolCorePoolSize(JobName.LOAN_COB.name())); taskExecutor.setMaxPoolSize(propertyService.getThreadPoolMaxPoolSize(JobName.LOAN_COB.name())); - taskExecutor.setQueueCapacity(propertyService.getThreadPoolQueueCapacity(JobName.LOAN_COB.name())); + taskExecutor.setQueueCapacity(Math.max(propertyService.getThreadPoolQueueCapacity(JobName.LOAN_COB.name()), + propertyService.getChunkSize(JobName.LOAN_COB.name()))); taskExecutor.setAllowCoreThreadTimeOut(true); taskExecutor.setTaskDecorator(new ContextAwareTaskDecorator()); return taskExecutor; From 87829d187689feff374f1a928046d43fe5d31e02 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 13 Jul 2026 15:41:36 +0530 Subject: [PATCH 61/63] FINERACT-2621: size working capital COB worker queue for Batch 6 Signed-off-by: avinashvijayvargiya --- .../WorkingCapitalLoanCOBWorkerConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java index 93a95fddcf8..c9d71563829 100644 --- a/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java +++ b/fineract-working-capital-loan/src/main/java/org/apache/fineract/cob/workingcapitalloan/WorkingCapitalLoanCOBWorkerConfiguration.java @@ -122,7 +122,8 @@ public TaskExecutor workingCapitalCobTaskExecutor() { taskExecutor.setThreadGroupName("COB-Thread"); taskExecutor.setCorePoolSize(propertyService.getThreadPoolCorePoolSize(WORKING_CAPITAL_JOB_NAME)); taskExecutor.setMaxPoolSize(propertyService.getThreadPoolMaxPoolSize(WORKING_CAPITAL_JOB_NAME)); - taskExecutor.setQueueCapacity(propertyService.getThreadPoolQueueCapacity(WORKING_CAPITAL_JOB_NAME)); + taskExecutor.setQueueCapacity(Math.max(propertyService.getThreadPoolQueueCapacity(WORKING_CAPITAL_JOB_NAME), + propertyService.getChunkSize(JobName.LOAN_COB.name()))); taskExecutor.setAllowCoreThreadTimeOut(true); taskExecutor.setTaskDecorator(new ContextAwareTaskDecorator()); return taskExecutor; From 05bbe8cd79fb7d17421baaa162d687d7ae1ed7de Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Mon, 13 Jul 2026 22:35:37 +0530 Subject: [PATCH 62/63] FINERACT-2621: enable Kafka listener processing in batch worker Signed-off-by: avinashvijayvargiya --- .../kafka/KafkaWorkerConfig.java | 2 + .../kafka/KafkaWorkerConfigTest.java | 96 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 fineract-provider/src/test/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfigTest.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java index 943bbbfdfdc..fbe70ff9ff0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfig.java @@ -37,6 +37,7 @@ import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.integration.channel.QueueChannel; +import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; @@ -44,6 +45,7 @@ import org.springframework.kafka.support.serializer.JacksonJsonDeserializer; @Configuration +@EnableKafka @Conditional(KafkaWorkerCondition.class) @Slf4j public class KafkaWorkerConfig { diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfigTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfigTest.java new file mode 100644 index 00000000000..ebbaa935ec3 --- /dev/null +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/springbatch/messagehandler/kafka/KafkaWorkerConfigTest.java @@ -0,0 +1,96 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.infrastructure.springbatch.messagehandler.kafka; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import org.apache.fineract.infrastructure.core.config.FineractProperties; +import org.apache.fineract.infrastructure.springbatch.InputChannelInterceptor; +import org.apache.fineract.infrastructure.springbatch.messagehandler.StepExecutionRequestHandler; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.kafka.config.KafkaListenerConfigUtils; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.listener.MessageListenerContainer; + +/** + * Regression test for the batch worker Kafka listener wiring. Since Spring Boot 4 the Kafka auto-configuration (which + * used to apply {@code @EnableKafka} whenever spring-kafka was on the classpath) lives in the separate + * {@code spring-boot-kafka} module that Fineract does not depend on. {@link KafkaWorkerConfig} must therefore enable + * {@code @KafkaListener} processing itself, otherwise {@link KafkaRemoteMessageListener} is silently ignored and the + * worker never consumes partition requests. + */ +class KafkaWorkerConfigTest { + + private static final String TOPIC_NAME = "job-topic"; + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withInitializer(context -> { + PropertySourcesPlaceholderConfigurer placeholderConfigurer = new PropertySourcesPlaceholderConfigurer(); + placeholderConfigurer.setEnvironment(context.getEnvironment()); + context.getBeanFactory().registerSingleton("propertySourcesPlaceholderConfigurer", placeholderConfigurer); + }).withBean(FineractProperties.class, KafkaWorkerConfigTest::workerKafkaProperties) + .withBean("inboundRequests", QueueChannel.class, QueueChannel::new) + .withBean(StepExecutionRequestHandler.class, () -> mock(StepExecutionRequestHandler.class)) + .withBean(InputChannelInterceptor.class, () -> mock(InputChannelInterceptor.class)) + .withUserConfiguration(KafkaWorkerConfig.class, KafkaRemoteMessageListener.class); + + @Test + void kafkaListenerIsRegisteredForJobTopicInWorkerMode() { + contextRunner + .withPropertyValues("fineract.mode.batch-worker-enabled=true", "fineract.remote-job-message-handler.kafka.enabled=true", + "fineract.remote-job-message-handler.kafka.topic.name=" + TOPIC_NAME) + .run(context -> { + assertThat(context).hasNotFailed(); + assertThat(context).as("@EnableKafka must register the @KafkaListener annotation processor") + .hasBean(KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME); + KafkaListenerEndpointRegistry registry = context.getBean(KafkaListenerEndpointRegistry.class); + assertThat(registry.getListenerContainers()).hasSize(1); + MessageListenerContainer container = registry.getListenerContainers().iterator().next(); + assertThat(container.getContainerProperties().getTopics()).containsExactly(TOPIC_NAME); + }); + } + + @Test + void kafkaListenerIsNotRegisteredWhenKafkaMessageHandlerIsDisabled() { + contextRunner + .withPropertyValues("fineract.mode.batch-worker-enabled=true", "fineract.remote-job-message-handler.kafka.enabled=false") + .run(context -> { + assertThat(context).hasNotFailed(); + assertThat(context).doesNotHaveBean(KafkaRemoteMessageListener.class); + assertThat(context).doesNotHaveBean(KafkaListenerEndpointRegistry.class); + }); + } + + private static FineractProperties workerKafkaProperties() { + FineractProperties.KafkaConsumerProperties consumerProperties = new FineractProperties.KafkaConsumerProperties(); + consumerProperties.setGroupId("test-group"); + FineractProperties.FineractRemoteJobMessageHandlerKafkaProperties kafkaProperties = new FineractProperties.FineractRemoteJobMessageHandlerKafkaProperties(); + kafkaProperties.setEnabled(true); + kafkaProperties.setBootstrapServers("localhost:9092"); + kafkaProperties.setConsumer(consumerProperties); + FineractProperties.FineractRemoteJobMessageHandlerProperties remoteJobMessageHandlerProperties = new FineractProperties.FineractRemoteJobMessageHandlerProperties(); + remoteJobMessageHandlerProperties.setKafka(kafkaProperties); + FineractProperties fineractProperties = new FineractProperties(); + fineractProperties.setRemoteJobMessageHandler(remoteJobMessageHandlerProperties); + return fineractProperties; + } +} From c8a0f53114672e8d33738835a18f6a47a55a6f56 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Tue, 14 Jul 2026 10:37:08 +0530 Subject: [PATCH 63/63] FINERACT-2621: emit Jackson 3 annotations for Jacksonized classes The Kafka batch worker could not deserialize job-topic messages because @Jacksonized only generated Jackson 2 builder annotations, which the Jackson 3 JacksonJsonDeserializer ignores. Also register lombok.config as a compile input so cached builds pick up config changes. --- build.gradle | 5 +++++ lombok.config | 1 + 2 files changed, 6 insertions(+) diff --git a/build.gradle b/build.gradle index d3d25470066..5cc746c53fc 100644 --- a/build.gradle +++ b/build.gradle @@ -427,6 +427,11 @@ configure(project.fineractJavaProjects) { options.incremental = true options.fork = true outputs.cacheIf { true } + // Lombok reads lombok.config at compile time; without this input, cached or + // incremental builds can reuse classes generated under an older config + inputs.file(rootProject.file('lombok.config')) + .withPropertyName('lombokConfig') + .withPathSensitivity(PathSensitivity.NONE) options.compilerArgs << '-parameters' options.encoding = 'UTF-8' options.compilerArgs << '-Xlint:unchecked' diff --git a/lombok.config b/lombok.config index b844ab0fc37..7d4aecbf8dd 100644 --- a/lombok.config +++ b/lombok.config @@ -23,3 +23,4 @@ lombok.addLombokGeneratedAnnotation = true lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier lombok.jacksonized.jacksonVersion += 2 +lombok.jacksonized.jacksonVersion += 3