This is an automated email from the ASF dual-hosted git repository.

aleks 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 651052c44 FINERACT-1724 - Batch step execute fix - [x] Flush JPA data 
to JDBC access
651052c44 is described below

commit 651052c44ba410ff0d673dddd7935f8e7cef9e8b
Author: Janos Haber <[email protected]>
AuthorDate: Mon Mar 13 16:53:58 2023 +0100

    FINERACT-1724 - Batch step execute fix
    - [x] Flush JPA data to JDBC access
---
 .../batch/service/BatchApiServiceImpl.java         | 31 +++++++++++++---------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
index 5a883c592..bbfb0d015 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
@@ -27,6 +27,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
@@ -43,7 +45,6 @@ import org.apache.fineract.batch.exception.ErrorHandler;
 import org.apache.fineract.batch.exception.ErrorInfo;
 import org.apache.fineract.batch.service.ResolutionHelper.BatchRequestNode;
 import 
org.apache.fineract.infrastructure.core.domain.BatchRequestContextHolder;
-import 
org.apache.fineract.infrastructure.core.domain.FineractRequestContextHolder;
 import 
org.apache.fineract.infrastructure.core.exception.AbstractIdempotentCommandException;
 import 
org.apache.fineract.infrastructure.core.exception.IdempotentCommandProcessFailedException;
 import 
org.apache.fineract.infrastructure.core.exception.IdempotentCommandProcessSucceedException;
@@ -75,7 +76,8 @@ public class BatchApiServiceImpl implements BatchApiService {
 
     private final List<BatchFilter> batchFilters;
 
-    private final FineractRequestContextHolder fineractRequestContextHolder;
+    @PersistenceContext
+    private final EntityManager entityManager;
 
     /**
      * Returns the response list by getting a proper {@link 
org.apache.fineract.batch.command.CommandStrategy}.
@@ -85,7 +87,8 @@ public class BatchApiServiceImpl implements BatchApiService {
      * @param uriInfo
      * @return {@code List<BatchResponse>}
      */
-    private List<BatchResponse> handleBatchRequests(final List<BatchRequest> 
requestList, final UriInfo uriInfo) {
+    private List<BatchResponse> handleBatchRequests(final List<BatchRequest> 
requestList, final UriInfo uriInfo,
+            boolean isEnclosingTransaction) {
 
         final List<BatchResponse> responseList = new 
ArrayList<>(requestList.size());
 
@@ -104,11 +107,11 @@ public class BatchApiServiceImpl implements 
BatchApiService {
             final CommandStrategy commandStrategy = this.strategyProvider
                     
.getCommandStrategy(CommandContext.resource(rootRequest.getRelativeUrl()).method(rootRequest.getMethod()).build());
             log.debug("Batch request: method [{}], relative url [{}]", 
rootRequest.getMethod(), rootRequest.getRelativeUrl());
-            final BatchResponse rootResponse = 
safelyExecuteStrategy(commandStrategy, rootRequest, uriInfo);
+            final BatchResponse rootResponse = 
safelyExecuteStrategy(commandStrategy, rootRequest, uriInfo, 
isEnclosingTransaction);
             log.debug("Batch response: status code [{}], method [{}], relative 
url [{}]", rootResponse.getStatusCode(),
                     rootRequest.getMethod(), rootRequest.getRelativeUrl());
             responseList.add(rootResponse);
-            responseList.addAll(this.processChildRequests(rootNode, 
rootResponse, uriInfo));
+            responseList.addAll(this.processChildRequests(rootNode, 
rootResponse, uriInfo, isEnclosingTransaction));
         }
 
         Collections.sort(responseList, 
Comparator.comparing(BatchResponse::getRequestId));
@@ -117,8 +120,12 @@ public class BatchApiServiceImpl implements 
BatchApiService {
 
     }
 
-    private BatchResponse safelyExecuteStrategy(CommandStrategy 
commandStrategy, BatchRequest request, UriInfo originalUriInfo) {
+    private BatchResponse safelyExecuteStrategy(CommandStrategy 
commandStrategy, BatchRequest request, UriInfo originalUriInfo,
+            boolean isEnclosingTransaction) {
         try {
+            if (isEnclosingTransaction) {
+                entityManager.flush();
+            }
             BatchRequestContextHolder.setRequestAttributes(new 
HashMap<>(Optional.ofNullable(request.getHeaders())
                     .map(list -> 
list.stream().collect(Collectors.toMap(Header::getName, Header::getValue)))
                     .orElse(Collections.emptyMap())));
@@ -160,7 +167,8 @@ public class BatchApiServiceImpl implements BatchApiService 
{
         return response;
     }
 
-    private List<BatchResponse> processChildRequests(final BatchRequestNode 
rootRequest, BatchResponse rootResponse, UriInfo uriInfo) {
+    private List<BatchResponse> processChildRequests(final BatchRequestNode 
rootRequest, BatchResponse rootResponse, UriInfo uriInfo,
+            boolean isEnclosingTransaction) {
 
         final List<BatchResponse> childResponses = new ArrayList<>();
         if (!rootRequest.getChildRequests().isEmpty()) {
@@ -177,8 +185,7 @@ public class BatchApiServiceImpl implements BatchApiService 
{
                         final CommandStrategy commandStrategy = 
this.strategyProvider.getCommandStrategy(
                                 
CommandContext.resource(childRequest.getRelativeUrl()).method(childRequest.getMethod()).build());
 
-                        childResponse = safelyExecuteStrategy(commandStrategy, 
childRequest, uriInfo);
-
+                        childResponse = safelyExecuteStrategy(commandStrategy, 
childRequest, uriInfo, isEnclosingTransaction);
                     } else {
                         // Something went wrong with the parent request, create
                         // a response with status code 409
@@ -191,7 +198,7 @@ public class BatchApiServiceImpl implements BatchApiService 
{
                                 "Parent request with id " + 
rootResponse.getRequestId() + " was erroneous!");
                         childResponse.setBody(conflictError.getMessage());
                     }
-                    childResponses.addAll(this.processChildRequests(childNode, 
childResponse, uriInfo));
+                    childResponses.addAll(this.processChildRequests(childNode, 
childResponse, uriInfo, isEnclosingTransaction));
 
                 } catch (Throwable ex) {
 
@@ -211,7 +218,7 @@ public class BatchApiServiceImpl implements BatchApiService 
{
     @Override
     public List<BatchResponse> 
handleBatchRequestsWithoutEnclosingTransaction(final List<BatchRequest> 
requestList, UriInfo uriInfo) {
 
-        return handleBatchRequests(requestList, uriInfo);
+        return handleBatchRequests(requestList, uriInfo, false);
     }
 
     @Override
@@ -220,7 +227,7 @@ public class BatchApiServiceImpl implements BatchApiService 
{
         try {
             return this.transactionTemplate.execute(status -> {
                 try {
-                    responseList.addAll(handleBatchRequests(requestList, 
uriInfo));
+                    responseList.addAll(handleBatchRequests(requestList, 
uriInfo, true));
                     return responseList;
                 } catch (RuntimeException ex) {
 

Reply via email to