From 578eb7fc7bd3e67ee7c49d842659047139cc6632 Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Tue, 23 Sep 2014 13:45:41 +0000
Subject: [PATCH] SSDM-351: Implement a queue for all asynchronous registartion
 from openbis UI (screening fix to remove when finish)

SVN: 32488
---
 .../generic/server/AbstractServer.java        | 48 +++++++++++++++++++
 1 file changed, 48 insertions(+)

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 9765718227b..0886c6c3c7e 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,12 +16,17 @@
 
 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;
 
@@ -36,6 +41,7 @@ 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;
@@ -93,6 +99,8 @@ 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";
 
@@ -970,12 +978,52 @@ 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;
-- 
GitLab