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