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
The following commit(s) were added to refs/heads/develop by this push:
new 47108e0ac [FINERACT-1678] Fix Inline COB execution
47108e0ac is described below
commit 47108e0ac957e8c9ae7bdff31283fda0076e297f
Author: taskain7 <[email protected]>
AuthorDate: Tue Nov 29 16:28:41 2022 +0100
[FINERACT-1678] Fix Inline COB execution
---
.../fineract/cob/common/InitialisationTasklet.java | 13 +++++++++
.../InlineLoanCOBBuildExecutionContextTasklet.java | 24 +++++++++++++---
.../fineract/cob/loan/LoanInlineCOBConfig.java | 8 ++----
.../service/InlineLoanCOBExecutorServiceImpl.java | 14 +++++++---
.../InitialisationTaskletStepDefinitions.java | 32 ++++++++++++++++++++--
5 files changed, 76 insertions(+), 15 deletions(-)
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java
b/fineract-provider/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java
index 160eee62f..3fff306df 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/cob/common/InitialisationTasklet.java
@@ -18,8 +18,14 @@
*/
package org.apache.fineract.cob.common;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Objects;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.cob.loan.LoanCOBConstant;
+import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.core.domain.ActionContext;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.useradministration.domain.AppUser;
@@ -41,11 +47,18 @@ public class InitialisationTasklet implements Tasklet {
@Override
public RepeatStatus execute(@NotNull StepContribution contribution,
@NotNull ChunkContext chunkContext) throws Exception {
+ HashMap<BusinessDateType, LocalDate> businessDates =
ThreadLocalContextUtil.getBusinessDates();
AppUser user = userRepository.fetchSystemUser();
UsernamePasswordAuthenticationToken auth = new
UsernamePasswordAuthenticationToken(user, user.getPassword(),
new
NullAuthoritiesMapper().mapAuthorities(user.getAuthorities()));
SecurityContextHolder.getContext().setAuthentication(auth);
ThreadLocalContextUtil.setActionContext(ActionContext.COB);
+ String businessDateString = Objects.requireNonNull((String)
chunkContext.getStepContext().getStepExecution().getJobExecution()
+
.getExecutionContext().get(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME));
+ LocalDate businessDate = LocalDate.parse(businessDateString,
DateTimeFormatter.ISO_DATE);
+ businessDates.put(BusinessDateType.COB_DATE, businessDate);
+ businessDates.put(BusinessDateType.BUSINESS_DATE,
businessDate.plusDays(1));
+ ThreadLocalContextUtil.setBusinessDates(businessDates);
return RepeatStatus.FINISHED;
}
}
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 cb84aa1fc..b24b2b9a4 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
@@ -20,12 +20,16 @@ package org.apache.fineract.cob.loan;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.fineract.cob.COBBusinessStepService;
+import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.core.domain.ActionContext;
import
org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
@@ -37,14 +41,11 @@ import org.springframework.batch.core.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.stereotype.Component;
@Slf4j
@RequiredArgsConstructor
-@Component
public class InlineLoanCOBBuildExecutionContextTasklet implements Tasklet {
- private final GoogleGsonSerializerHelper gsonFactory;
private final COBBusinessStepService cobBusinessStepService;
private final CustomJobParameterRepository customJobParameterRepository;
@@ -52,15 +53,30 @@ public class InlineLoanCOBBuildExecutionContextTasklet
implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext
chunkContext) throws Exception {
+ HashMap<BusinessDateType, LocalDate> businessDates =
ThreadLocalContextUtil.getBusinessDates();
ThreadLocalContextUtil.setActionContext(ActionContext.COB);
TreeMap<Long, String> cobBusinessStepMap =
cobBusinessStepService.getCOBBusinessStepMap(LoanCOBBusinessStep.class,
LoanCOBConstant.LOAN_COB_JOB_NAME);
contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.LOAN_IDS,
getLoanIdsFromJobParameters(chunkContext));
contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.BUSINESS_STEP_MAP,
cobBusinessStepMap);
-
+ String businessDateString =
getBusinessDateFromJobParameters(chunkContext);
+
contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME,
businessDateString);
+ LocalDate businessDate = LocalDate.parse(businessDateString,
DateTimeFormatter.ISO_DATE);
+ businessDates.put(BusinessDateType.COB_DATE, businessDate);
+ businessDates.put(BusinessDateType.BUSINESS_DATE,
businessDate.plusDays(1));
+ ThreadLocalContextUtil.setBusinessDates(businessDates);
return RepeatStatus.FINISHED;
}
+ private String getBusinessDateFromJobParameters(ChunkContext chunkContext)
{
+ Long customJobParameterId = (Long)
chunkContext.getStepContext().getJobParameters()
+ .get(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME);
+ CustomJobParameter customJobParameter =
customJobParameterRepository.findById(customJobParameterId)
+ .orElseThrow(() -> new
LoanNotFoundException(customJobParameterId));
+ String parameterJson = customJobParameter.getParameterJson();
+ return gson.fromJson(parameterJson, new TypeToken<String>()
{}.getType());
+ }
+
private List<Long> getLoanIdsFromJobParameters(ChunkContext chunkContext) {
Long customJobParameterId = (Long)
chunkContext.getStepContext().getJobParameters()
.get(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY);
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 71bf56714..a23bcc1c4 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
@@ -22,7 +22,6 @@ import org.apache.fineract.cob.COBBusinessStepService;
import org.apache.fineract.cob.common.ResetContextTasklet;
import org.apache.fineract.cob.domain.LoanAccountLockRepository;
import org.apache.fineract.cob.listener.InlineCOBLoanItemListener;
-import
org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper;
import
org.apache.fineract.infrastructure.jobs.domain.CustomJobParameterRepository;
import org.apache.fineract.infrastructure.jobs.service.JobName;
import org.apache.fineract.infrastructure.springbatch.PropertyService;
@@ -60,12 +59,10 @@ public class LoanInlineCOBConfig {
private TransactionTemplate transactionTemplate;
@Autowired
private CustomJobParameterRepository loanIdListRepository;
- @Autowired
- private GoogleGsonSerializerHelper googleGsonSerializerHelper;
@Bean
public InlineLoanCOBBuildExecutionContextTasklet
inlineLoanCOBBuildExecutionContextTasklet() {
- return new
InlineLoanCOBBuildExecutionContextTasklet(googleGsonSerializerHelper,
cobBusinessStepService, loanIdListRepository);
+ return new
InlineLoanCOBBuildExecutionContextTasklet(cobBusinessStepService,
loanIdListRepository);
}
@Bean
@@ -124,7 +121,8 @@ public class LoanInlineCOBConfig {
@Bean
public ExecutionContextPromotionListener inlineCobPromotionListener() {
ExecutionContextPromotionListener listener = new
ExecutionContextPromotionListener();
- listener.setKeys(new String[] { LoanCOBConstant.LOAN_IDS,
LoanCOBConstant.BUSINESS_STEP_MAP });
+ listener.setKeys(
+ new String[] { LoanCOBConstant.LOAN_IDS,
LoanCOBConstant.BUSINESS_STEP_MAP, LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME
});
return listener;
}
}
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 5cb920edf..4ce8f9efb 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
@@ -21,6 +21,8 @@ package org.apache.fineract.cob.service;
import static
org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRES_NEW;
import com.google.gson.Gson;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -102,7 +104,9 @@ public class InlineLoanCOBExecutorServiceImpl implements
InlineExecutorService<L
throw new JobNotFoundException(jobName, e);
}
JobParameters jobParameters = new
JobParametersBuilder(jobExplorer).getNextJobParameters(inlineLoanCOBJob)
- .addJobParameters(new
JobParameters(getJobParametersMap(loanIds))).toJobParameters();
+ .addJobParameters(new JobParameters(
+ getJobParametersMap(loanIds,
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE))))
+ .toJobParameters();
JobExecution jobExecution;
try {
jobExecution = jobLauncher.run(inlineLoanCOBJob, jobParameters);
@@ -141,16 +145,18 @@ public class InlineLoanCOBExecutorServiceImpl implements
InlineExecutorService<L
return loanAccountLocks;
}
- private Map<String, JobParameter> getJobParametersMap(List<Long> loanIds) {
+ private Map<String, JobParameter> getJobParametersMap(List<Long> loanIds,
LocalDate businessDate) {
// TODO: refactor for a more generic solution
String parameterJson = gson.toJson(loanIds);
CustomJobParameter loanIdsJobParameter = new CustomJobParameter();
loanIdsJobParameter.setParameterJson(parameterJson);
Long loanIdsJobParameterId =
customJobParameterRepository.saveAndFlush(loanIdsJobParameter).getId();
+ CustomJobParameter businessDateJobParameter = new CustomJobParameter();
+
businessDateJobParameter.setParameterJson(gson.toJson(businessDate.format(DateTimeFormatter.ISO_DATE)));
+ Long businessDateJobParameterId =
customJobParameterRepository.saveAndFlush(businessDateJobParameter).getId();
Map<String, JobParameter> jobParameterMap = new HashMap<>();
jobParameterMap.put(SpringBatchJobConstants.CUSTOM_JOB_PARAMETER_ID_KEY, new
JobParameter(loanIdsJobParameterId));
- String businessDate =
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE).toString();
- jobParameterMap.put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME, new
JobParameter(businessDate));
+ jobParameterMap.put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME, new
JobParameter(businessDateJobParameterId));
return jobParameterMap;
}
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 cf4a41fe5..80f831f41 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
@@ -24,21 +24,34 @@ import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import io.cucumber.java8.En;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import org.apache.fineract.cob.loan.LoanCOBConstant;
+import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.core.domain.ActionContext;
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.scope.context.ChunkContext;
+import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.security.core.context.SecurityContextHolder;
public class InitialisationTaskletStepDefinitions implements En {
+ private static final LocalDate TODAY =
LocalDate.now(ZoneId.systemDefault());
+
private AppUserRepositoryWrapper userRepository =
mock(AppUserRepositoryWrapper.class);
private InitialisationTasklet initialisationTasklet = new
InitialisationTasklet(userRepository);
private AppUser appUser = mock(AppUser.class);
private RepeatStatus resultItem;
+ private ChunkContext chunkContext;
public InitialisationTaskletStepDefinitions() {
Given("/^The InitialisationTasklet.execute method with action (.*)$/",
(String action) -> {
@@ -48,16 +61,29 @@ public class InitialisationTaskletStepDefinitions
implements En {
} else {
lenient().when(this.userRepository.fetchSystemUser()).thenReturn(appUser);
}
-
+ HashMap<BusinessDateType, LocalDate> businessDates = new
HashMap<>();
+ LocalDate businessDate = TODAY;
+ LocalDate cobBusinessDate = businessDate.minusDays(1);
+ businessDates.put(BusinessDateType.BUSINESS_DATE, businessDate);
+ businessDates.put(BusinessDateType.COB_DATE, cobBusinessDate);
+ ThreadLocalContextUtil.setBusinessDates(businessDates);
+ JobExecution jobExecution = new JobExecution(1L);
+
jobExecution.getExecutionContext().put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME,
+ cobBusinessDate.format(DateTimeFormatter.ISO_DATE));
+ StepExecution stepExecution = new StepExecution("step",
jobExecution);
+ StepContext stepContext = new StepContext(stepExecution);
+ chunkContext = new ChunkContext(stepContext);
});
When("InitialisationTasklet.execute method executed", () -> {
- resultItem = this.initialisationTasklet.execute(null, null);
+ resultItem = this.initialisationTasklet.execute(null,
chunkContext);
});
Then("InitialisationTasklet.execute result should match", () -> {
assertEquals(RepeatStatus.FINISHED, resultItem);
assertEquals(appUser,
SecurityContextHolder.getContext().getAuthentication().getPrincipal());
+ assertEquals(TODAY,
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.BUSINESS_DATE));
+ assertEquals(TODAY.minusDays(1),
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE));
ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT);
});
@@ -65,6 +91,8 @@ public class InitialisationTaskletStepDefinitions implements
En {
assertThrows(RuntimeException.class, () -> {
resultItem = this.initialisationTasklet.execute(null, null);
});
+ assertEquals(TODAY,
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.BUSINESS_DATE));
+ assertEquals(TODAY.minusDays(1),
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE));
ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT);
});
}