From 1c19ec91df9f0cd6a010d16c9190c5d16ec5fdc8 Mon Sep 17 00:00:00 2001
From: Thomas Lenz <thomas.lenz@egiz.gv.at>
Date: Fri, 6 Nov 2020 11:16:53 +0100
Subject: optimize error-handling in case with special focus on backend
 communication-requests

---
 .../impl/idp/controller/AbstractController.java    | 27 ++++++++++-------
 .../AbstractProcessEngineSignalController.java     |  4 +++
 .../controller/ProtocolFinalizationController.java | 35 ++++++++++++++--------
 3 files changed, 42 insertions(+), 24 deletions(-)

(limited to 'eaaf_core/src/main/java/at/gv')

diff --git a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractController.java b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractController.java
index 58c8c0a9..41c7a432 100644
--- a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractController.java
+++ b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractController.java
@@ -26,6 +26,14 @@ import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.text.StringEscapeUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.util.SerializationUtils;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
 import at.gv.egiz.components.eventlog.api.EventConstants;
 import at.gv.egiz.eaaf.core.api.IRequest;
 import at.gv.egiz.eaaf.core.api.IStatusMessenger;
@@ -35,20 +43,12 @@ import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;
 import at.gv.egiz.eaaf.core.api.idp.auth.services.IProtocolAuthenticationService;
 import at.gv.egiz.eaaf.core.api.logging.IRevisionLogger;
 import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage;
+import at.gv.egiz.eaaf.core.api.utils.IPendingRequestIdGenerationStrategy;
 import at.gv.egiz.eaaf.core.exceptions.EaafException;
 import at.gv.egiz.eaaf.core.exceptions.PendingReqIdValidationException;
 import at.gv.egiz.eaaf.core.exceptions.ProcessExecutionException;
 import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
 import at.gv.egiz.eaaf.core.impl.data.Pair;
-import at.gv.egiz.eaaf.core.impl.utils.Random;
-
-import org.apache.commons.text.StringEscapeUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.util.SerializationUtils;
-import org.springframework.web.bind.annotation.ExceptionHandler;
 
 /**
  * Basic application controller that implements core error-handling.
@@ -74,6 +74,9 @@ public abstract class AbstractController {
   @Autowired
   protected IRevisionLogger revisionsLogger;
 
+  @Autowired
+  protected IPendingRequestIdGenerationStrategy reqIdGenerationStrategy;
+  
   /**
    * EAAF framework exception handler.
    *
@@ -168,7 +171,9 @@ public abstract class AbstractController {
     }
 
     // put exception into transaction store for redirect
-    final String errorKey = Random.nextLongRandom();
+    final String errorToken = reqIdGenerationStrategy.generateExternalPendingRequestId();    
+    final String errorKey = reqIdGenerationStrategy.getPendingRequestIdWithOutChecks(errorToken);
+            
     if (errorToHandle.getFirst() != null) {
       revisionsLogger.logEvent(errorToHandle.getFirst(), EventConstants.TRANSACTION_ERROR);
 
@@ -189,7 +194,7 @@ public abstract class AbstractController {
 
     }
 
-    return errorKey;
+    return errorToken;
 
   }
 
diff --git a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractProcessEngineSignalController.java b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractProcessEngineSignalController.java
index 098bca4c..2ce728c1 100644
--- a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractProcessEngineSignalController.java
+++ b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/AbstractProcessEngineSignalController.java
@@ -36,6 +36,7 @@ import at.gv.egiz.eaaf.core.api.data.EaafConstants;
 import at.gv.egiz.eaaf.core.api.idp.process.ProcessEngine;
 import at.gv.egiz.eaaf.core.exceptions.EaafException;
 import at.gv.egiz.eaaf.core.exceptions.EaafIllegalStateException;
+import at.gv.egiz.eaaf.core.exceptions.PendingReqIdValidationException;
 import at.gv.egiz.eaaf.core.impl.utils.TransactionIdUtils;
 
 /**
@@ -85,6 +86,9 @@ public abstract class AbstractProcessEngineSignalController extends AbstractCont
       // wake up next task
       processEngine.signal(pendingReq);
 
+    } catch (PendingReqIdValidationException e) {
+      handleError(null, e, req, resp, e.getInvalidPendingReq());
+      
     } catch (final Exception ex) {
       handleError(null, ex, req, resp, pendingReq);
 
diff --git a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/ProtocolFinalizationController.java b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/ProtocolFinalizationController.java
index 3fc31673..2a8dd756 100644
--- a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/ProtocolFinalizationController.java
+++ b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/idp/controller/ProtocolFinalizationController.java
@@ -24,14 +24,6 @@ import java.io.IOException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import at.gv.egiz.components.eventlog.api.EventConstants;
-import at.gv.egiz.eaaf.core.api.IRequest;
-import at.gv.egiz.eaaf.core.api.IRequestStorage;
-import at.gv.egiz.eaaf.core.api.IStatusMessenger;
-import at.gv.egiz.eaaf.core.api.data.EaafConstants;
-import at.gv.egiz.eaaf.core.api.data.ExceptionContainer;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-
 import org.apache.commons.text.StringEscapeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,6 +33,15 @@ import org.springframework.util.SerializationUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
+import at.gv.egiz.components.eventlog.api.EventConstants;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.IRequestStorage;
+import at.gv.egiz.eaaf.core.api.IStatusMessenger;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.data.ExceptionContainer;
+import at.gv.egiz.eaaf.core.api.utils.IPendingRequestIdGenerationStrategy;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+
 /**
  * Protocol finialization end-point.
  *
@@ -55,6 +56,7 @@ public class ProtocolFinalizationController extends AbstractController {
 
   @Autowired(required = true)
   IRequestStorage requestStorage;
+  @Autowired IPendingRequestIdGenerationStrategy requestIdValidationStragegy;
 
   /**
    * End-Point to handle errors.
@@ -68,19 +70,26 @@ public class ProtocolFinalizationController extends AbstractController {
   public void errorHandling(final HttpServletRequest req, final HttpServletResponse resp)
       throws EaafException, IOException {
     // receive an authentication error
-    final String errorid =
+    final String errorToken =
         StringEscapeUtils.escapeHtml4(req.getParameter(EaafConstants.PARAM_HTTP_ERROR_CODE));
-    if (errorid != null) {
+    if (errorToken != null) {
       IRequest pendingReq = null;
-      try {
+      try {       
+        String errorId = requestIdValidationStragegy.validateAndGetPendingRequestId(errorToken);                
+        
         // load stored exception from database
         final byte[] containerSerialized =
-            transactionStorage.get(errorid, byte[].class);
+            transactionStorage.get(errorId, byte[].class);
         if (containerSerialized != null) {
           // remove exception if it was found
-          transactionStorage.remove(errorid);
+          transactionStorage.remove(errorId);
 
+          //final Object containerObj = EaafSerializationUtils.deserialize(containerSerialized, 
+          //    Arrays.asList(
+          //        ExceptionContainer.class.getName()
+          //        ));
           final Object containerObj = SerializationUtils.deserialize(containerSerialized);
+          
           if (containerObj instanceof ExceptionContainer) {
             final ExceptionContainer container = (ExceptionContainer) containerObj;
             final Throwable throwable = container.getExceptionThrown();
-- 
cgit v1.2.3