From 89bed7b590ea7b501d3224b4dde42e2c8992a97d Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 17 Mar 2009 08:53:19 +0000
Subject: [PATCH] LMS-778 Add reason text field and try to fix problem in
 HibernateSearchDAO for data set searches where search results contain deleted
 data sets.

SVN: 10253
---
 .../web/client/ICommonClientService.java      |  2 +-
 .../web/client/ICommonClientServiceAsync.java |  4 +-
 .../ui/data/AbstractExternalDataGrid.java     | 54 ++++++++++++-------
 .../web/server/CommonClientService.java       |  4 +-
 .../openbis/generic/server/CommonServer.java  |  4 +-
 .../generic/server/CommonServerLogger.java    |  4 +-
 .../dataaccess/db/HibernateSearchDAO.java     | 12 ++---
 .../openbis/generic/shared/ICommonServer.java |  2 +-
 .../cisd/openbis/public/common-dictionary.js  |  2 +-
 .../shared/ICommonServer.java.expected        |  2 +-
 10 files changed, 52 insertions(+), 38 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 4a36bab7ae3..87c73759f25 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
@@ -364,6 +364,6 @@ public interface ICommonClientService extends IClientService
             throws UserFailureException;
 
     /** Deletes the specified data sets. */
-    public void deleteDataSets(List<String> dataSetCodes) throws UserFailureException;
+    public void deleteDataSets(List<String> dataSetCodes, String reason) 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 cff6959039d..934e8abbe11 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
@@ -320,6 +320,6 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void updateSample(final String sampleIdentifier, List<SampleProperty> properties,
             final AsyncCallback<Void> asyncCallback) throws UserFailureException;
 
-    /** @see ICommonClientService#deleteDataSets(List) */
-    public void deleteDataSets(List<String> dataSetCodes, AsyncCallback<Void> asyncCallback);
+    /** @see ICommonClientService#deleteDataSets(List, String) */
+    public void deleteDataSets(List<String> dataSetCodes, String reason, AsyncCallback<Void> asyncCallback);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
index 75910ce195b..eb275269f49 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
@@ -20,8 +20,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.ComponentEvent;
+import com.extjs.gxt.ui.client.event.KeyListener;
 import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.TextField;
 import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
@@ -35,7 +39,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractSimpleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListener;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.ConfirmationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.DataSetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition;
@@ -67,30 +70,19 @@ public abstract class AbstractExternalDataGrid extends AbstractSimpleBrowserGrid
         }
     }
     
-    private static final class DeletionConfirmationDialog extends ConfirmationDialog
+    private static final class DeletionConfirmationDialog extends Dialog
     {
-
-        private static String render(List<ExternalData> dataSets)
-        {
-            StringBuilder builder = new StringBuilder();
-            for (ExternalData externalData : dataSets)
-            {
-                builder.append("\n").append(externalData.getCode());
-            }
-            return builder.toString();
-        }
-        
         private final IViewContext<?> viewContext;
 
         private final List<String> dataSetCodes;
 
         private final IBrowserGridActionInvoker invoker;
 
+        private final TextField<String> reason;
+
         public DeletionConfirmationDialog(IViewContext<?> viewContext, List<ExternalData> dataSets,
                 IBrowserGridActionInvoker invoker)
         {
-            super(viewContext.getMessage(Dict.CONFIRM_DATASET_DELETION_TITLE), viewContext
-                    .getMessage(Dict.CONFIRM_DATASET_DELETION_MSG, render(dataSets)));
             this.viewContext = viewContext;
             this.invoker = invoker;
             dataSetCodes = new ArrayList<String>();
@@ -98,14 +90,36 @@ public abstract class AbstractExternalDataGrid extends AbstractSimpleBrowserGrid
             {
                 dataSetCodes.add(externalData.getCode());
             }
-            setSize(400, 300);
+            setHeading(viewContext.getMessage(Dict.CONFIRM_DATASET_DELETION_TITLE));
+            setButtons(Dialog.OKCANCEL);
+            addText(viewContext.getMessage(Dict.CONFIRM_DATASET_DELETION_MSG, dataSets.size()));
+            reason = new TextField<String>();
+            reason.setSelectOnFocus(true);
+            reason.setHideLabel(true);
+            reason.setWidth("100%");
+            reason.setMaxLength(250);
+            reason.addKeyListener(new KeyListener()
+                {
+                    @Override
+                    public void handleEvent(ComponentEvent ce)
+                    {
+                        okBtn.setEnabled(reason.isValid());
+                    }
+                });
+            add(reason);
+            setHideOnButtonClick(true);
+            setModal(true);
         }
-
+        
         @Override
-        protected void onYes()
+        protected void onButtonPressed(Button button)
         {
-            viewContext.getCommonService().deleteDataSets(dataSetCodes,
-                    new DeletionCallback(viewContext, invoker));
+            super.onButtonPressed(button);
+            if (button.getItemId().equals(Dialog.OK) && reason.isValid())
+            {
+                viewContext.getCommonService().deleteDataSets(dataSetCodes, reason.getValue(),
+                        new DeletionCallback(viewContext, invoker));
+            }
         }
     }
     
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 a876e17d5da..d35fa5e82de 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
@@ -1015,13 +1015,13 @@ public final class CommonClientService extends AbstractClientService implements
 
     }
 
-    public void deleteDataSets(List<String> dataSetCodes)
+    public void deleteDataSets(List<String> dataSetCodes, String reason)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
         {
             final String sessionToken = getSessionToken();
-            commonServer.deleteDataSets(sessionToken, dataSetCodes);
+            commonServer.deleteDataSets(sessionToken, dataSetCodes, reason);
         } 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 6e320a8fa1f..6fc15a6082a 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
@@ -586,7 +586,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
         }
     }
 
-    public void deleteDataSets(String sessionToken, List<String> dataSetCodes)
+    public void deleteDataSets(String sessionToken, List<String> dataSetCodes, String reason)
     {
         Session session = getSessionManager().getSession(sessionToken);
         IExternalDataDAO externalDataDAO = getDAOFactory().getExternalDataDAO();
@@ -605,7 +605,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
 
         for (ExternalDataPE dataSet : dataSets)
         {
-            externalDataDAO.markAsDeleted(dataSet, session.tryGetPerson(), null);
+            externalDataDAO.markAsDeleted(dataSet, session.tryGetPerson(), reason);
         }
         Collection<DataStoreServerSession> sessions = dssSessionManager.getSessions();
         for (DataStoreServerSession dssSession : sessions)
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 6ce8b04eb35..dc7e1cc8e11 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
@@ -318,9 +318,9 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
                 experimentIdentifier, attachments.size());
     }
 
-    public void deleteDataSets(String sessionToken, List<String> dataSetCodes)
+    public void deleteDataSets(String sessionToken, List<String> dataSetCodes, String reason)
     {
-        logTracking(sessionToken, "delete_data_sets", "CODES(%s)", dataSetCodes);
+        logTracking(sessionToken, "delete_data_sets", "CODES(%s) REASON(%s)", dataSetCodes, reason);
     }
 
     public void editMaterial(String sessionToken, MaterialIdentifier identifier,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
index 1778c6557b6..176f8b7de28 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
@@ -355,24 +355,24 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
 
         Criteria criteria = getSession().createCriteria(ExternalDataPE.class);
         criteria.add(Restrictions.eq("deleted", false));
-        criteria.setFetchMode("parents", FetchMode.JOIN);
         criteria.setFetchMode("procedure", FetchMode.JOIN);
         criteria.setFetchMode("procedure.experimentInternal", FetchMode.JOIN);
-        criteria.setFetchMode("procedure.experimentInternal.experimentProperties", FetchMode.JOIN);
         hibernateQuery.setCriteriaQuery(criteria);
 
         List<ExternalDataPE> datasets = AbstractDAO.cast(hibernateQuery.list());
         datasets = filterNulls(datasets);
-        // NOTE: there is a limit on the number of JOINs, so we have to initialize sample properties
-        // manually
-        initSamplesWithProperties(datasets);
+        // NOTE: there is a limit on the number of JOINs, so we have to initialize parents, 
+        // experiment properties, and sample properties manually.
+        initParentsAndExperimentPropertiesAndSamplesWithProperties(datasets);
         return asDataSetHits(datasets);
     }
 
-    private void initSamplesWithProperties(List<ExternalDataPE> datasets)
+    private void initParentsAndExperimentPropertiesAndSamplesWithProperties(List<ExternalDataPE> datasets)
     {
         for (ExternalDataPE dataset : datasets)
         {
+            HibernateUtils.initialize(dataset.getParents());
+            HibernateUtils.initialize(dataset.getProcedure().getExperiment().getProperties());
             initSamplesWithProperties(dataset.getSampleAcquiredFrom());
             initSamplesWithProperties(dataset.getSampleDerivedFrom());
         }
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 5708300af35..48f017687e4 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
@@ -350,7 +350,7 @@ public interface ICommonServer extends IServer
     @RolesAllowed(RoleSet.GROUP_ADMIN)
     public void deleteDataSets(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
-            List<String> dataSetCodes);
+            List<String> dataSetCodes, String reason);
 
     /**
      * Saves changed experiment.
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 db97336ccfb..8557ad9c1a0 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
@@ -233,7 +233,7 @@ var common = {
  data_producer_code: "Producer",
  button_delete_datasets: "Delete",
  confirm_dataset_deletion_title: "Data Sets Deletion Confirmation",
- confirm_dataset_deletion_msg: "Do you really want to delete the following data sets?\n\n{0}",
+ confirm_dataset_deletion_msg: "You are deleting {0} data set(s). Please enter a reason:",
  
  
  //
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
index 2211632a44e..b61efa711ed 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
@@ -350,7 +350,7 @@ public interface ICommonServer extends IServer
     @RolesAllowed(RoleSet.GROUP_ADMIN)
     public void deleteDataSets(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
-            List<String> dataSetCodes);
+            List<String> dataSetCodes, String reason);
 
     /**
      * Saves changed experiment.
-- 
GitLab