From c73f348c77ec68dd8a35a1b22534e2626ec550bb Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Tue, 23 Sep 2014 12:29:10 +0000
Subject: [PATCH] SSDM-351: Implement a queue for all asynchronous registartion
 from openbis UI (big refactoring + custom import)

SVN: 32483
---
 .../web/server/CommonClientService.java       | 40 ++++++++++++----
 .../generic/server/AbstractServer.java        | 48 -------------------
 .../openbis/generic/server/CommonServer.java  | 21 --------
 .../generic/server/CommonServerLogger.java    |  9 ----
 .../openbis/generic/shared/ICommonServer.java |  7 ---
 5 files changed, 31 insertions(+), 94 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 6fe8c846a36..66fecaa4d28 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.client.web.server;
 
 import java.io.Reader;
+import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -27,6 +28,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpSession;
 
 import org.apache.commons.io.FileUtils;
@@ -218,6 +220,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.server.queue.ConsumerQueue;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.server.queue.ConsumerTask;
 
 /**
  * The {@link ICommonClientService} implementation.
@@ -227,6 +231,9 @@ import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
 public final class CommonClientService extends AbstractClientService implements
         ICommonClientService
 {
+    @Resource(name = "registration-queue")
+    private ConsumerQueue asyncRegistrationQueue;
+    
     private final ICommonServer commonServer;
 
     public CommonClientService(final ICommonServer commonServer,
@@ -2709,10 +2716,12 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public List<BatchRegistrationResult> performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail)
+    public List<BatchRegistrationResult> performCustomImport(final String sessionKey, final String customImportCode, final boolean async, final String userEmail)
     {
         HttpSession httpSession = getHttpSession();
         UploadedFilesBean uploadedFiles = null;
+        ConsumerTask asyncCustomImportTask = null;
+        
         try
         {
             uploadedFiles = (UploadedFilesBean) httpSession.getAttribute(sessionKey);
@@ -2722,7 +2731,23 @@ public final class CommonClientService extends AbstractClientService implements
 
             if (async)
             {
-                commonServer.performCustomImportAsync(getSessionToken(), customImportCode, customImportFile, userEmail);
+                asyncCustomImportTask = new ConsumerTask(uploadedFiles) {
+                    @Override
+                    public String getName() { return "Custom import"; }
+                    
+                    @Override
+                    public String getUserEmail() { return userEmail; }
+                    
+                    @Override
+                    public void doActionOrThrowException(Writer writer)
+                    {
+                      //Some stuff is repeated on the async executor, this is expected
+                       CustomImportFile customImportFileAsync = getCustomImportFile(this.getFilesForTask());
+                      //Execute task
+                      commonServer.performCustomImport(getSessionToken(), customImportCode, customImportFileAsync);
+                    }
+                };
+                
                 return AsyncBatchRegistrationResult.singletonList(customImportFile.getFileName());
             } else
             {
@@ -2742,13 +2767,10 @@ public final class CommonClientService extends AbstractClientService implements
                             + " (More details can be found in the server logs.)");
         } finally
         {
-            if (uploadedFiles != null)
-            {
-                uploadedFiles.deleteTransferredFiles();
-            }
-            if (httpSession != null)
-            {
-                httpSession.removeAttribute(sessionKey);
+            if (async && (asyncCustomImportTask != null)) {
+                asyncRegistrationQueue.addTaskAsLast(asyncCustomImportTask);
+            } else {
+                cleanUploadedFiles(sessionKey, httpSession, uploadedFiles);
             }
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index c43144f565e..9765718227b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -16,17 +16,12 @@
 
 package ch.systemsx.cisd.openbis.generic.server;
 
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 
 import javax.annotation.Resource;
 
@@ -41,7 +36,6 @@ import ch.systemsx.cisd.common.action.IDelegatedActionWithResult;
 import ch.systemsx.cisd.common.exceptions.InvalidSessionException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.mail.IMailClient;
-import ch.systemsx.cisd.common.mail.MailClient;
 import ch.systemsx.cisd.common.mail.MailClientParameters;
 import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
 import ch.systemsx.cisd.openbis.common.spring.AbstractServiceWithLogger;
@@ -99,8 +93,6 @@ import ch.systemsx.cisd.openbis.generic.shared.util.ServerUtils;
  */
 public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> implements IServer
 {
-    protected static ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 10, 360,
-            TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
 
     private final static String ETL_SERVER_USERNAME_PREFIX = "etlserver";
 
@@ -978,52 +970,12 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
         }
     }
 
-    protected void executeASync(final String userEmail, final IASyncAction action)
-    {
-        final IMailClient mailClient = new MailClient(mailClientParameters);
-        Runnable task = new Runnable()
-            {
-                @Override
-                public void run()
-                {
-                    StringWriter writer = new StringWriter();
-                    boolean success = true;
-                    Date startDate = new Date();
-                    try
-                    {
-                        success = action.doAction(writer);
-                    } catch (RuntimeException e)
-                    {
-                        operationLog.error("Asynchronous action '" + action.getName()
-                                + "' failed. ", e);
-                        success = false;
-                    } finally
-                    {
-                        sendEmail(mailClient, writer.toString(),
-                                getSubject(action.getName(), startDate, success), userEmail);
-                    }
-                }
-            };
-        executor.submit(task);
-    }
-
     protected void sendEmail(IMailClient mailClient, String content, String subject,
             String... recipient)
     {
         mailClient.sendMessage(subject, content, null, null, recipient);
     }
 
-    private static String getSubject(String actionName, Date startDate, boolean success)
-    {
-        return addDate(actionName + " " + (success ? "successfully performed" : "failed"),
-                startDate);
-    }
-
-    private static String addDate(String subject, Date startDate)
-    {
-        return subject + " (initiated at " + startDate + ")";
-    }
-
     static boolean isResolved(String name)
     {
         return StringUtils.isNotBlank(name) && name.startsWith("${") == false;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 342e3d3a5b0..48d4adc7c27 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -4127,27 +4127,6 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         return searchHelper.searchForMaterials(session.getUserName(), criteria);
     }
 
-    @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
-    public void performCustomImportAsync(final String sessionToken, final String customImportCode,
-            final CustomImportFile customImportFile, final String userEmail) throws UserFailureException
-    {
-        executeASync(userEmail, new AbstractASyncAction()
-            {
-                @Override
-                public String getName()
-                {
-                    return "Custom import";
-                }
-
-                @Override
-                protected void doActionOrThrowException(Writer messageWriter)
-                {
-                    commonServer.performCustomImport(sessionToken, customImportCode, customImportFile);
-                }
-            });
-    }
-
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
     public void performCustomImport(String sessionToken, String customImportCode,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index ad0da899be3..4c5b2d1a534 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -1615,15 +1615,6 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
-    @Override
-    public void performCustomImportAsync(String sessionToken, String customImportCode,
-            CustomImportFile customImportFile, String userEmail)
-    {
-        logAccess(sessionToken, "performCustomImportAsync",
-                "CUSTOM_IMPORT_CODE(%s), CUSTOM_IMPORT_FILE(%s), USER_EMAIL(%s)", customImportCode,
-                customImportFile, userEmail);
-    }
-
     @Override
     public void performCustomImport(String sessionToken, String customImportCode,
             CustomImportFile customImportFile)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 08e3100362c..3f371a0afba 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1451,13 +1451,6 @@ public interface ICommonServer extends IServer
     @Transactional(readOnly = true)
     public List<Material> searchForMaterials(String sessionToken, DetailedSearchCriteria criteria);
 
-    /**
-     * Performs an asynchronous import of file to the dss.
-     */
-    @Transactional
-    public void performCustomImportAsync(String sessionToken, String customImportCode,
-            CustomImportFile customImportFile, String userEmail) throws UserFailureException;
-
     /**
      * Performs an import of file to the dss.
      */
-- 
GitLab