From 57bb928dcf6a27ff35713fe9f31b42f89012bc2a Mon Sep 17 00:00:00 2001
From: izabel <izabel>
Date: Wed, 24 Mar 2010 08:28:41 +0000
Subject: [PATCH] [LMS-1452] allow to lock/unlock data sets

SVN: 15245
---
 .../web/client/ICommonClientService.java      | 12 ++++++++
 .../web/client/ICommonClientServiceAsync.java | 12 ++++++++
 .../ui/data/DataSetComputeMenu.java           | 28 +++++++++++++++++--
 .../web/server/CommonClientService.java       | 28 +++++++++++++++++++
 .../openbis/generic/server/CommonServer.java  | 18 ++++++++++++
 .../generic/server/CommonServerLogger.java    | 10 +++++++
 .../server/business/bo/ExternalDataTable.java | 14 ++++++++++
 .../business/bo/IExternalDataTable.java       | 10 +++++++
 .../openbis/generic/shared/ICommonServer.java | 18 ++++++++++++
 .../basic/dto/DataStoreServiceKind.java       |  2 +-
 .../cisd/openbis/public/common-dictionary.js  |  2 ++
 11 files changed, 150 insertions(+), 4 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 3d693582581..620ac4a98d0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -855,4 +855,16 @@ public interface ICommonClientService extends IClientService
     public void deleteMaterials(DisplayedOrSelectedIdHolderCriteria<Material> criteria,
             String reason) throws UserFailureException;
 
+    /**
+     * Locks the specified datasets.
+     */
+    public void lockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws UserFailureException;
+
+    /**
+     * Unlocks the specified datasets.
+     */
+    public void unlockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws UserFailureException;
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index d9b411cdcb5..4087c3c0043 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -757,5 +757,17 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void deleteMaterials(DisplayedOrSelectedIdHolderCriteria<Material> uploadCriteria,
             String value, AsyncCallback<Void> callback);
 
+    /**
+     * @see ICommonClientService#lockDatasets(DisplayedOrSelectedDatasetCriteria)
+     */
+    public void lockDatasets(DisplayedOrSelectedDatasetCriteria criteria,
+            AsyncCallback<Void> callback);
+
+    /**
+     * @see ICommonClientService#unlockDatasets(DisplayedOrSelectedDatasetCriteria)
+     */
+    public void unlockDatasets(DisplayedOrSelectedDatasetCriteria criteria,
+            AsyncCallback<Void> callback);
+
     // --
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
index 747d105658e..e6f8ec677d7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
@@ -88,6 +88,8 @@ public class DataSetComputeMenu extends TextToolItem
         addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_PROCESSING);
         addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_ARCHIVIZATION);
         addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_UNARCHIVIZATION);
+        addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_LOCK);
+        addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_UNLOCK);
         setMenu(submenu);
     }
 
@@ -99,7 +101,9 @@ public class DataSetComputeMenu extends TextToolItem
         COMPUTE_MENU_QUERIES(DataStoreServiceKind.QUERIES), COMPUTE_MENU_PROCESSING(
                 DataStoreServiceKind.PROCESSING), COMPUTE_MENU_ARCHIVIZATION(
                 DataStoreServiceKind.ARCHIVIZATION), COMPUTE_MENU_UNARCHIVIZATION(
-                DataStoreServiceKind.UNARCHIVIZATION);
+                DataStoreServiceKind.UNARCHIVIZATION),
+        COMPUTE_MENU_LOCK(DataStoreServiceKind.LOCK), COMPUTE_MENU_UNLOCK(
+                DataStoreServiceKind.UNLOCK);
 
         private final DataStoreServiceKind dssTaskKind;
 
@@ -154,6 +158,8 @@ public class DataSetComputeMenu extends TextToolItem
                     {
                         case ARCHIVIZATION:
                         case UNARCHIVIZATION:
+                        case LOCK:
+                        case UNLOCK:
                             return new PerformArchivizationDialog(viewContext, data, title);
                         default:
                             return new PerformComputationDialog(viewContext, data, title);
@@ -193,6 +199,18 @@ public class DataSetComputeMenu extends TextToolItem
                                     new ArchivizationDisplayCallback(viewContext, dssTaskKind
                                             .getDescription()));
                             break;
+                        case LOCK:
+                            viewContext.getService().lockDatasets(
+                                    criteria,
+                                    new ArchivizationDisplayCallback(viewContext, dssTaskKind
+                                            .getDescription()));
+                            break;
+                        case UNLOCK:
+                            viewContext.getService().unlockDatasets(
+                                    criteria,
+                                    new ArchivizationDisplayCallback(viewContext, dssTaskKind
+                                            .getDescription()));
+                            break;
                     }
                 }
             };
@@ -321,6 +339,10 @@ public class DataSetComputeMenu extends TextToolItem
                     return DataSetArchivizationStatus.ACTIVE;
                 case UNARCHIVIZATION:
                     return DataSetArchivizationStatus.ARCHIVED;
+                case LOCK:
+                    return DataSetArchivizationStatus.ACTIVE;
+                case UNLOCK:
+                    return DataSetArchivizationStatus.LOCKED;
                 default:
                     return null; // not possible
             }
@@ -379,7 +401,7 @@ public class DataSetComputeMenu extends TextToolItem
         // not null only if all selected datasets come from the same datastore
         private final DataStore dataStoreOrNull;
 
-        private ComputationDataSetsRadioProvider radioProvider;
+        private final ComputationDataSetsRadioProvider radioProvider;
 
         private Html selectedDataSetTypesText;
 
@@ -656,7 +678,7 @@ public class DataSetComputeMenu extends TextToolItem
 
         private Radio computeOnAllRadio;
 
-        private ComputationData data;
+        private final ComputationData data;
 
         public ComputationDataSetsRadioProvider(ComputationData data)
         {
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 6173748f161..bd49ac7d293 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
@@ -2408,4 +2408,32 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
+    public void lockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            List<String> datasetCodes = extractDatasetCodes(criteria);
+            commonServer.lockDatasets(sessionToken, datasetCodes);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
+    public void unlockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            List<String> datasetCodes = extractDatasetCodes(criteria);
+            commonServer.unlockDatasets(sessionToken, datasetCodes);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
 }
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 abc649edb57..1b068d54539 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
@@ -1847,4 +1847,22 @@ public final class CommonServer extends AbstractCommonServer<ICommonServer> impl
         }
     }
 
+    public void lockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        Session session = getSession(sessionToken);
+        IExternalDataTable externalDataTable =
+                businessObjectFactory.createExternalDataTable(session);
+        externalDataTable.loadByDataSetCodes(datasetCodes, true);
+        externalDataTable.lockDatasets();
+    }
+
+    public void unlockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        Session session = getSession(sessionToken);
+        IExternalDataTable externalDataTable =
+                businessObjectFactory.createExternalDataTable(session);
+        externalDataTable.loadByDataSetCodes(datasetCodes, true);
+        externalDataTable.unlockDatasets();
+    }
+
 }
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 dd0a6fbe208..381ecea0a6d 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
@@ -830,4 +830,14 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         logTracking(sessionToken, "delete_materials", "IDS(%s) REASON(%s)", materialIds, reason);
     }
 
+    public void lockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        logTracking(sessionToken, "lockDatasets", "NO_OF_DATASETS(%s)", datasetCodes.size());
+    }
+
+    public void unlockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        logTracking(sessionToken, "unlockDatasets", "NO_OF_DATASETS(%s)", datasetCodes.size());
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
index 170c6701304..4afa55d2606 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
@@ -616,4 +616,18 @@ public final class ExternalDataTable extends AbstractExternalDataBusinessObject
             }
         }
     }
+
+    public void lockDatasets()
+    {
+        Map<DataStorePE, List<ExternalDataPE>> datasetsByStore = groupDataSetsByDataStores();
+        filterByStatusAndUpdate(datasetsByStore, DataSetArchivizationStatus.ACTIVE,
+                DataSetArchivizationStatus.LOCKED);
+    }
+
+    public void unlockDatasets()
+    {
+        Map<DataStorePE, List<ExternalDataPE>> datasetsByStore = groupDataSetsByDataStores();
+        filterByStatusAndUpdate(datasetsByStore, DataSetArchivizationStatus.LOCKED,
+                DataSetArchivizationStatus.ACTIVE);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java
index 361ed49c1b7..acb990d01fd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java
@@ -89,4 +89,14 @@ public interface IExternalDataTable
      */
     public void loadByDataStore(DataStorePE dataStore);
 
+    /**
+     * Locks loaded data sets.
+     */
+    void lockDatasets();
+
+    /**
+     * Unlocks loaded data sets.
+     */
+    void unlockDatasets();
+
 }
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 c19e3270288..f487a81eb87 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
@@ -1047,4 +1047,22 @@ public interface ICommonServer extends IServer
     @DatabaseCreateOrDeleteModification(value = ObjectKind.MATERIAL)
     public void deleteMaterials(String sessionToken, List<TechId> materialIds, String reason);
 
+    /**
+     * Locks data sets
+     */
+    @Transactional
+    @RolesAllowed(RoleSet.SPACE_ADMIN)
+    @DatabaseUpdateModification(value = ObjectKind.DATA_SET)
+    public void lockDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> datasetCodes);
+
+    /**
+     * Unlocks data sets
+     */
+    @Transactional
+    @RolesAllowed(RoleSet.SPACE_ADMIN)
+    @DatabaseUpdateModification(value = ObjectKind.DATA_SET)
+    public void unlockDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> datasetCodes);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java
index c827d8e0c55..55bcd84e667 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java
@@ -27,7 +27,7 @@ public enum DataStoreServiceKind implements Serializable, IsSerializable
 {
     // Do not refactor names - they are stored in database.
     PROCESSING("Processing"), QUERIES("Query"), ARCHIVIZATION("Archivization"), UNARCHIVIZATION(
-            "Unarchivization");
+            "Unarchivization"), LOCK("Lock"), UNLOCK("Unlock");
 
     private final String description;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index 09e2e37f462..eb0c677e319 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -327,6 +327,8 @@ var common = {
   COMPUTE_MENU_PROCESSING: "Processing",
   COMPUTE_MENU_ARCHIVIZATION: "Archivization",
   COMPUTE_MENU_UNARCHIVIZATION: "Unarchivization",
+  COMPUTE_MENU_LOCK: "Lock",
+  COMPUTE_MENU_UNLOCK: "Unlock",
   
   menu_modules: "Utilities",
     
-- 
GitLab