From 9cceaaa57610a841c9cea950215890c2f9cadd9c Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Fri, 19 Sep 2014 11:47:29 +0000
Subject: [PATCH] SSDM-351: Implement a queue for all asynchronous registartion
 from openbis UI

SVN: 32464
---
 .../web/server/GenericClientService.java      | 67 ++++++++++++++-----
 1 file changed, 50 insertions(+), 17 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index e4f359c04c2..097b5a3f160 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -479,26 +479,59 @@ public class GenericClientService extends AbstractClientService implements IGene
     }
 
     @Override
-    public final List<BatchRegistrationResult> registerMaterials(final MaterialType materialType,
-            boolean updateExisting, final String sessionKey, boolean async, String userEmail)
+    public final List<BatchRegistrationResult> registerMaterials(
+            final MaterialType materialType,
+            final boolean updateExisting,
+            final String sessionKey,
+            final boolean async,
+            final String userEmail)
     {
-        String sessionToken = getSessionToken();
-        BatchMaterialsOperation results =
-                parseMaterials(sessionKey, materialType, null, updateExisting);
-        String fileName = results.getResultList().get(0).getFileName();
-        List<NewMaterialsWithTypes> materials = results.getMaterials();
-
-        if (async)
-        {
-            genericServer.registerOrUpdateMaterialsAsync(sessionToken, materials, userEmail);
-            return AsyncBatchRegistrationResult.singletonList(fileName);
-        } else
-        {
-            genericServer.registerOrUpdateMaterials(sessionToken, materials);
+        final String sessionToken = getSessionToken();
+        final HttpSession session = getHttpSession();
+        UploadedFilesBean uploadedFiles = null;
+        ConsumerTask asyncMaterialTask = null;
+        try {
+            uploadedFiles = getUploadedFiles(sessionKey, session);
+            BatchMaterialsOperation results = parseMaterials(session, uploadedFiles, materialType, null, updateExisting);
+            
+            String fileName = results.getResultList().get(0).getFileName();
+            List<NewMaterialsWithTypes> materials = results.getMaterials();
+            
+            if (async)
+            {
+                final UploadedFilesBean asyncUploadedFiles = uploadedFiles;
+                asyncMaterialTask = new ConsumerTask() {
+                    @Override
+                    public String getTaskName() { return "Experiments Update Task"; }
+                    
+                    @Override
+                    public void executeTask()
+                    {
+                        //Some stuff is repeated on the async executor, this is expected
+                        BatchMaterialsOperation asyncResults = parseMaterials(session, asyncUploadedFiles, materialType, null, updateExisting);
+                        List<NewMaterialsWithTypes> asyncMaterials = asyncResults.getMaterials();
+                        //Execute task and clean files
+                        genericServer.registerOrUpdateMaterialsAsync(sessionToken, asyncMaterials, userEmail);
+                        cleanUploadedFiles(sessionKey, session, asyncUploadedFiles);
+                    }
+                };
+                
+                return AsyncBatchRegistrationResult.singletonList(fileName);
+            } else
+            {
+                genericServer.registerOrUpdateMaterials(sessionToken, materials);
+                return results.getResultList();
+            }
+        } finally {
+            if (async && (asyncMaterialTask != null)) {
+                ConsumerQueue.addTaskAsLast(asyncMaterialTask);
+            } else {
+                cleanUploadedFiles(sessionKey, session, uploadedFiles);
+            }
         }
-
-        return results.getResultList();
     }
+
+        
     
     @Override
     public List<BatchRegistrationResult> updateExperiments(final ExperimentType experimentType,
-- 
GitLab