This is an automated email from the ASF dual-hosted git repository. arnold pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/fineract.git
commit abb5d4abb5a2a46c5ff07239259c9639fd22efcb Author: Arnold Galovics <[email protected]> AuthorDate: Tue May 30 10:23:13 2023 +0200 FINERACT-1724: Further upgrades --- fineract-core/dependencies.gradle | 1 + fineract-provider/build.gradle | 8 ++-- .../cob/listener/AbstractLoanItemListener.java | 11 +++-- .../cache/PlatformCacheConfiguration.java | 3 +- .../core/config/OAuth2SecurityConfig.java | 16 +++++-- .../infrastructure/core/config/SecurityConfig.java | 20 +++++--- .../sampling/output/SamplingScheduler.java | 7 +-- .../core/service/database/RoutingDataSource.java | 2 +- .../jobs/ScheduledJobRunnerConfig.java | 27 ++++++++--- .../jobs/config/FineractBatchConfiguration.java | 32 +++++++++++++ .../domain/CalendarInstanceRepository.java | 2 +- .../src/main/resources/META-INF/orm.xml | 8 ++-- .../tenant/parts/0109_spring_batch_5_upgrade.xml | 54 +++++++++++++++++++++- .../listener/LoanItemListenerStepDefinitions.java | 3 +- 14 files changed, 154 insertions(+), 40 deletions(-) diff --git a/fineract-core/dependencies.gradle b/fineract-core/dependencies.gradle index 89bfa9b49..f2b0c9bef 100644 --- a/fineract-core/dependencies.gradle +++ b/fineract-core/dependencies.gradle @@ -28,6 +28,7 @@ dependencies { implementation( 'org.springframework.boot:spring-boot-starter-web', 'org.springframework.boot:spring-boot-starter-security', + 'org.springframework.boot:spring-boot-starter-validation', 'jakarta.ws.rs:jakarta.ws.rs-api', 'org.glassfish.jersey.media:jersey-media-multipart', diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle index 291f0b0f2..90a732426 100644 --- a/fineract-provider/build.gradle +++ b/fineract-provider/build.gradle @@ -155,10 +155,10 @@ dependencies { driver 'mysql:mysql-connector-java:8.0.32' } -//URLClassLoader loader = GroovyObject.class.classLoader -//configurations.driver.each {File file -> -// loader.addURL(file.toURL()) -//} +URLClassLoader loader = GroovyObject.class.classLoader +configurations.driver.each {File file -> + loader.addURL(file.toURL()) +} task createDB { description= "Creates the MariaDB Database. Needs database name to be passed (like: -PdbName=someDBname)" diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java b/fineract-provider/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java index b2606e889..d02179180 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/listener/AbstractLoanItemListener.java @@ -37,6 +37,7 @@ import org.springframework.batch.core.annotation.OnSkipInProcess; 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.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; @@ -79,25 +80,25 @@ public abstract class AbstractLoanItemListener { } @OnWriteError - public void onWriteError(Exception e, @NotNull List<? extends Loan> items) { - List<Long> loanIds = items.stream().map(AbstractPersistableCustom::getId).toList(); + public void onWriteError(Exception e, @NotNull Chunk<? extends Loan> items) { + List<Long> loanIds = items.getItems().stream().map(AbstractPersistableCustom::getId).toList(); log.warn("Error was triggered during writing of Loans (ids={}) due to: {}", loanIds, ThrowableSerialization.serialize(e)); updateAccountLockWithError(loanIds, "Loan (id: %d) writing is failed", e); } @OnSkipInRead - public void onSkipInRead(@NotNull Exception e) { + public void onSkipInRead(@NotNull Throwable e) { log.warn("Skipping was triggered during read!"); } @OnSkipInProcess - public void onSkipInProcess(@NotNull Loan item, @NotNull Exception e) { + public void onSkipInProcess(@NotNull Loan item, @NotNull Throwable e) { log.warn("Skipping was triggered during processing of Loan (id={})", item.getId()); } @OnSkipInWrite - public void onSkipInWrite(@NotNull Loan item, @NotNull Exception e) { + public void onSkipInWrite(@NotNull Loan item, @NotNull Throwable e) { log.warn("Skipping was triggered during writing of Loan (id={})", item.getId()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/PlatformCacheConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/PlatformCacheConfiguration.java index 742a7d3e7..ba8a10c9f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/PlatformCacheConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/PlatformCacheConfiguration.java @@ -22,14 +22,13 @@ import org.apache.fineract.infrastructure.cache.service.RuntimeDelegatingCacheMa import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurer; -import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableCaching -public class PlatformCacheConfiguration extends CachingConfigurerSupport implements CachingConfigurer { +public class PlatformCacheConfiguration implements CachingConfigurer { @Autowired private RuntimeDelegatingCacheManager delegatingCacheManager; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/OAuth2SecurityConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/OAuth2SecurityConfig.java index 8c3b88ec2..9a6c59213 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/OAuth2SecurityConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/OAuth2SecurityConfig.java @@ -38,7 +38,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.GrantedAuthority; @@ -57,7 +57,7 @@ import org.springframework.security.web.context.SecurityContextHolderFilter; @Configuration @ConditionalOnProperty("fineract.security.oauth.enabled") -@EnableGlobalMethodSecurity(prePostEnabled = true) +@EnableMethodSecurity public class OAuth2SecurityConfig { @Autowired @@ -76,9 +76,8 @@ public class OAuth2SecurityConfig { @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + public SecurityFilterChain authorizationFilterChain(HttpSecurity http) throws Exception { http // - .csrf((csrf) -> csrf.disable()) // NOSONAR only creating a service that is used by non-browser clients .securityMatcher("/api/**").authorizeHttpRequests((auth) -> { auth .requestMatchers(HttpMethod.OPTIONS, "/api/**").permitAll() // @@ -90,7 +89,14 @@ public class OAuth2SecurityConfig { .requestMatchers(HttpMethod.POST, "/api/*/twofactor/validate").fullyAuthenticated() // .requestMatchers("/api/*/twofactor").fullyAuthenticated() // .requestMatchers("/api/**").access(allOf(fullyAuthenticated(), hasAuthority("TWOFACTOR_AUTHENTICATED"), selfServiceUserAuthManager())); // - }) // + }); + return http.build(); + } + + @Bean + public SecurityFilterChain FilterChain(HttpSecurity http) throws Exception { + http // + .csrf((csrf) -> csrf.disable()) // NOSONAR only creating a service that is used by non-browser clients .exceptionHandling((ehc) -> ehc.authenticationEntryPoint(new OAuth2ExceptionEntryPoint())) .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(authenticationConverter())) .authenticationEntryPoint(new OAuth2ExceptionEntryPoint())) // 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 955f293c7..a1899b5c2 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 @@ -40,7 +40,7 @@ import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.factory.PasswordEncoderFactories; @@ -53,7 +53,7 @@ import org.springframework.security.web.context.SecurityContextHolderFilter; @Configuration @ConditionalOnProperty("fineract.security.basicauth.enabled") -@EnableGlobalMethodSecurity(prePostEnabled = true) +@EnableMethodSecurity public class SecurityConfig { @Autowired @@ -78,9 +78,8 @@ public class SecurityConfig { @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + public SecurityFilterChain authorizationFilterChain(HttpSecurity http) throws Exception { http // - .csrf((csrf) -> csrf.disable()) // NOSONAR only creating a service that is used by non-browser clients .securityMatcher("/api/**").authorizeHttpRequests((auth) -> { auth .requestMatchers(HttpMethod.OPTIONS, "/api/**").permitAll() // @@ -94,13 +93,20 @@ public class SecurityConfig { .requestMatchers("/api/*/twofactor").fullyAuthenticated() // .requestMatchers("/api/**").access(allOf(fullyAuthenticated(), hasAuthority("TWOFACTOR_AUTHENTICATED"))); // }) // - .httpBasic((httpBasic) -> httpBasic.authenticationEntryPoint(basicAuthenticationEntryPoint())) // + .httpBasic((httpBasic) -> httpBasic.authenticationEntryPoint(basicAuthenticationEntryPoint())); // + return http.build(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http // + .csrf((csrf) -> csrf.disable()) // NOSONAR only creating a service that is used by non-browser clients .sessionManagement((smc) -> smc.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // .addFilterAfter(fineractInstanceModeApiFilter, SecurityContextHolderFilter.class) // .addFilterAfter(tenantAwareBasicAuthenticationFilter(), FineractInstanceModeApiFilter.class) // .addFilterAfter(twoFactorAuthenticationFilter, BasicAuthenticationFilter.class) // - .addFilterAfter(loanCOBApiFilter, InsecureTwoFactorAuthenticationFilter.class) - .addFilterBefore(idempotencyStoreFilter, ExceptionTranslationFilter.class); + .addFilterAfter(loanCOBApiFilter, InsecureTwoFactorAuthenticationFilter.class) // + .addFilterBefore(idempotencyStoreFilter, ExceptionTranslationFilter.class); // if (serverProperties.getSsl().isEnabled()) { http.requiresChannel(channel -> channel.requestMatchers("/api/**").requiresSecure()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/diagnostics/performance/sampling/output/SamplingScheduler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/diagnostics/performance/sampling/output/SamplingScheduler.java index 98e2cf156..4e5c1645f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/diagnostics/performance/sampling/output/SamplingScheduler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/diagnostics/performance/sampling/output/SamplingScheduler.java @@ -20,8 +20,8 @@ package org.apache.fineract.infrastructure.core.diagnostics.performance.sampling import static java.util.stream.Collectors.toMap; +import java.time.Duration; import java.util.Map; -import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.diagnostics.performance.sampling.core.SamplingConfiguration; @@ -54,8 +54,9 @@ public class SamplingScheduler implements InitializingBean { log.warn("Reset period for sampling cannot be smaller than 10 seconds, setting back the minimum 10"); resetPeriodInSec = 10; } - PeriodicTrigger trigger = new PeriodicTrigger(resetPeriodInSec, TimeUnit.SECONDS); - trigger.setInitialDelay(resetPeriodInSec); + Duration resetPeriodInSecDuration = Duration.ofSeconds(resetPeriodInSec); + PeriodicTrigger trigger = new PeriodicTrigger(resetPeriodInSecDuration); + trigger.setInitialDelay(resetPeriodInSecDuration); taskScheduler.schedule(this::printAndResetPeriodically, trigger); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/RoutingDataSource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/RoutingDataSource.java index ab618bcd1..d75fadcd8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/RoutingDataSource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/RoutingDataSource.java @@ -36,7 +36,7 @@ import org.springframework.stereotype.Service; * The {@link RoutingDataSourceService} is responsible for returning the appropriate {@link DataSource} for the tenant * of this request. */ -@Service(value = "routingDataSource") +@Service(value = "dataSource") @Primary public class RoutingDataSource extends AbstractDataSource { 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 34d50aa71..fb092c3b7 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 @@ -25,8 +25,11 @@ import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourc import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor; +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.support.JobRepositoryFactoryBean; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; @@ -34,7 +37,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; -@Configuration +@Configuration(proxyBeanMethods = false) @EnableBatchProcessing public class ScheduledJobRunnerConfig { @@ -49,19 +52,31 @@ public class ScheduledJobRunnerConfig { } @Bean - public JobRepositoryFactoryBean jobRepositoryFactoryBean(RoutingDataSource routingDataSource, - PlatformTransactionManager transactionManager) throws Exception { + public Jackson2ExecutionContextStringSerializer executionContextSerializer() { + return new Jackson2ExecutionContextStringSerializer(); + } + + @Bean + public JobRepository jobRepository(RoutingDataSource routingDataSource, + PlatformTransactionManager transactionManager) throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(routingDataSource); factory.setTransactionManager(transactionManager); factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED"); + factory.setSerializer(executionContextSerializer()); factory.afterPropertiesSet(); - return factory; + return factory.getObject(); } @Bean - public JobRepository jobRepository(JobRepositoryFactoryBean factory) throws Exception { - return factory.getObject(); + public JobExplorer jobExplorer(RoutingDataSource routingDataSource, + PlatformTransactionManager transactionManager) throws Exception { + JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); + jobExplorerFactoryBean.setDataSource(routingDataSource); + jobExplorerFactoryBean.setTransactionManager(transactionManager); + jobExplorerFactoryBean.setSerializer(executionContextSerializer()); + jobExplorerFactoryBean.afterPropertiesSet(); + return jobExplorerFactoryBean.getObject(); } @Bean diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractBatchConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractBatchConfiguration.java new file mode 100644 index 000000000..14e0e5546 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/config/FineractBatchConfiguration.java @@ -0,0 +1,32 @@ +/** + * 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.jobs.config; + +import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.repository.ExecutionContextSerializer; +import org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer; + + +//@Configuration(proxyBeanMethods = false) +public class FineractBatchConfiguration extends DefaultBatchConfiguration { + @Override + protected ExecutionContextSerializer getExecutionContextSerializer() { + return new Jackson2ExecutionContextStringSerializer(); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java index 037b70243..bbce01c36 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstanceRepository.java @@ -60,7 +60,7 @@ public interface CalendarInstanceRepository extends JpaRepository<CalendarInstan * EntityType = 3 is for loan */ - @Query("SELECT COUNT(ci.id) FROM CalendarInstance ci, Loan ln WHERE ln.id = ci.entityId AND ci.entityTypeId = 3 AND ci.calendar.id = :calendarId AND ln.loanStatus IN :loanStatuses ") + @Query("SELECT COUNT(ci.id) FROM CalendarInstance ci, Loan loan WHERE loan.id = ci.entityId AND ci.entityTypeId = 3 AND ci.calendar.id = :calendarId AND loan.loanStatus IN :loanStatuses ") Integer countOfLoansSyncedWithCalendar(@Param("calendarId") Long calendarId, @Param("loanStatuses") Collection<Integer> loanStatuses); } diff --git a/fineract-provider/src/main/resources/META-INF/orm.xml b/fineract-provider/src/main/resources/META-INF/orm.xml index 1eb26c9cc..b54608dee 100644 --- a/fineract-provider/src/main/resources/META-INF/orm.xml +++ b/fineract-provider/src/main/resources/META-INF/orm.xml @@ -29,10 +29,10 @@ <persistence-unit-metadata> <persistence-unit-defaults> <delimited-identifiers/> - <entity-listeners> - <entity-listener - class="org.springframework.data.jpa.domain.support.AuditingEntityListener" /> - </entity-listeners> +<!-- <entity-listeners>--> +<!-- <entity-listener--> +<!-- class="org.springframework.data.jpa.domain.support.AuditingEntityListener" />--> +<!-- </entity-listeners>--> </persistence-unit-defaults> </persistence-unit-metadata> diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0109_spring_batch_5_upgrade.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0109_spring_batch_5_upgrade.xml index 9755e739a..1508a7c52 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0109_spring_batch_5_upgrade.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0109_spring_batch_5_upgrade.xml @@ -30,6 +30,40 @@ <dropColumn tableName="BATCH_JOB_EXECUTION" columnName="JOB_CONFIGURATION_LOCATION"/> </changeSet> <changeSet author="fineract" id="2" context="postgresql"> + <sql> + UPDATE BATCH_JOB_EXECUTION_PARAMS + SET STRING_VAL = TO_CHAR(DATE_VAL, 'YYYY-MM-DDTHH:MM:SSZ') + WHERE TYPE_CD = 'DATE' + </sql> + <sql> + UPDATE BATCH_JOB_EXECUTION_PARAMS + SET STRING_VAL = CAST(LONG_VAL AS CHAR) + WHERE TYPE_CD = 'LONG' + </sql> + <sql> + UPDATE BATCH_JOB_EXECUTION_PARAMS + SET STRING_VAL = CAST(DOUBLE_VAL AS CHAR) + WHERE TYPE_CD = 'DOUBLE' + </sql> + </changeSet> + <changeSet author="fineract" id="2" context="mysql"> + <sql> + UPDATE BATCH_JOB_EXECUTION_PARAMS + SET STRING_VAL = DATE_FORMAT(DATE_VAL, 'YYYY-MM-DDTHH:MM:SSZ') + WHERE TYPE_CD = 'DATE' + </sql> + <sql> + UPDATE BATCH_JOB_EXECUTION_PARAMS + SET STRING_VAL = LONG_VAL::text + WHERE TYPE_CD = 'LONG' + </sql> + <sql> + UPDATE BATCH_JOB_EXECUTION_PARAMS + SET STRING_VAL = DOUBLE_VAL::text + WHERE TYPE_CD = 'DOUBLE' + </sql> + </changeSet> + <changeSet author="fineract" id="4" context="postgresql"> <!-- org/springframework/batch/core/migration/5.0/migration-postgresql.sql --> @@ -58,7 +92,7 @@ </sql> </changeSet> - <changeSet author="fineract" id="3" context="mysql"> + <changeSet author="fineract" id="4" context="mysql"> <!-- org/springframework/batch/core/migration/5.0/migration-mysql.sql --> @@ -75,4 +109,22 @@ ALTER TABLE BATCH_JOB_EXECUTION_PARAMS CHANGE COLUMN STRING_VAL PARAMETER_VALUE VARCHAR(2500); </sql> </changeSet> + <changeSet author="fineract" id="5"> + <update tableName="BATCH_JOB_EXECUTION_PARAMS"> + <column name="PARAMETER_TYPE" value="java.lang.Long"/> + <where>PARAMETER_TYPE='LONG'</where> + </update> + <update tableName="BATCH_JOB_EXECUTION_PARAMS"> + <column name="PARAMETER_TYPE" value="java.lang.String"/> + <where>PARAMETER_TYPE='STRING'</where> + </update> + <update tableName="BATCH_JOB_EXECUTION_PARAMS"> + <column name="PARAMETER_TYPE" value="java.lang.Double"/> + <where>PARAMETER_TYPE='DOUBLE'</where> + </update> + <update tableName="BATCH_JOB_EXECUTION_PARAMS"> + <column name="PARAMETER_TYPE" value="java.util.Date"/> + <where>PARAMETER_TYPE='DATE'</where> + </update> + </changeSet> </databaseChangeLog> 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 2e7f1b659..e3f4ca94a 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 @@ -38,6 +38,7 @@ import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; 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.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.TransactionTemplate; @@ -107,7 +108,7 @@ public class LoanItemListenerStepDefinitions implements En { }); When("LoanItemListener.onWriteError method executed", () -> { - loanItemListener.onWriteError(exception, List.of(loan)); + loanItemListener.onWriteError(exception, new Chunk<>(List.of(loan))); }); Then("LoanItemListener.onWriteError result should match", () -> {
