From 1940be4f9536bf397fbbd787af65756a3a3d4842 Mon Sep 17 00:00:00 2001
From: gakin <gakin>
Date: Tue, 10 Nov 2015 15:06:16 +0000
Subject: [PATCH] SSDMSSDM-2708 Attachments are not indexed when added through
 sample details view - update and removal of index

SVN: 35027
---
 .../server/dataaccess/db/AttachmentDAO.java   | 39 +++++++++++++++++--
 .../server/dataaccess/db/DAOFactory.java      |  2 +-
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AttachmentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AttachmentDAO.java
index a4edcba21a6..9336ec1f59e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AttachmentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AttachmentDAO.java
@@ -16,21 +16,25 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.hibernate.Session;
-import org.hibernate.SessionFactory;
 import org.springframework.dao.DataAccessException;
 import org.springframework.orm.hibernate4.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.DynamicPropertyEvaluationOperation;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IAttachmentDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentHolderPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * Implementation of {@link IAttachmentDAO} for data bases.
@@ -45,12 +49,15 @@ final class AttachmentDAO extends AbstractGenericEntityDAO<AttachmentPE> impleme
 
     private final static String TABLE_NAME = ATTACHMENT_CLASS.getSimpleName();
 
+    private final PersistencyResources persistencyResources;
+
     private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
             AttachmentDAO.class);
 
-    AttachmentDAO(final SessionFactory sessionFactory)
+    AttachmentDAO(final PersistencyResources persistencyResources)
     {
-        super(sessionFactory, ATTACHMENT_CLASS);
+        super(persistencyResources.getSessionFactory(), ATTACHMENT_CLASS);
+        this.persistencyResources = persistencyResources;
     }
 
     private final static String createFindLastVersionQuery(AttachmentHolderPE owner)
@@ -81,6 +88,9 @@ final class AttachmentDAO extends AbstractGenericEntityDAO<AttachmentPE> impleme
     {
         AttachmentHolderPE result = internalCreateAttachment(attachment, ownerParam);
         getHibernateTemplate().flush();
+        
+        scheduleDynamicPropertiesEvaluation(ownerParam);
+
         return result;
     }
 
@@ -236,6 +246,8 @@ final class AttachmentDAO extends AbstractGenericEntityDAO<AttachmentPE> impleme
 
         hibernateTemplate.flush();
 
+        scheduleRemoveFromFullTextIndex(owner);
+
         if (operationLog.isInfoEnabled())
         {
             operationLog.debug(String.format(
@@ -246,4 +258,25 @@ final class AttachmentDAO extends AbstractGenericEntityDAO<AttachmentPE> impleme
         return deletedRows;
     }
 
+    private void scheduleDynamicPropertiesEvaluation(final AttachmentHolderPE owner)
+    {
+        // updates the index if the attachment owner is a Sample or an Experiment
+        if (IEntityInformationWithPropertiesHolder.class.isAssignableFrom(owner.getClass()))
+        {
+            IEntityInformationWithPropertiesHolder entity = (IEntityInformationWithPropertiesHolder) owner;
+            persistencyResources.getDynamicPropertyEvaluationScheduler()
+                    .scheduleUpdate(DynamicPropertyEvaluationOperation.evaluate(entity.getClass(), Arrays.asList(entity.getId())));
+        }
+    }
+
+    protected void scheduleRemoveFromFullTextIndex(final AttachmentHolderPE owner)
+    {
+        // removes the index if the attachment owner is a Sample or an Experiment
+        if (IEntityInformationWithPropertiesHolder.class.isAssignableFrom(owner.getClass()))
+        {
+            IEntityInformationWithPropertiesHolder entity = (IEntityInformationWithPropertiesHolder) owner;
+            persistencyResources.getIndexUpdateScheduler()
+                    .scheduleUpdate(IndexUpdateOperation.remove(entity.getClass(), Arrays.asList(entity.getId())));
+        }
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
index 30262abe023..54c9b591c8a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
@@ -150,7 +150,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
         propertyTypeDAO = new PropertyTypeDAO(sessionFactory);
         vocabularyDAO = new VocabularyDAO(sessionFactory);
         vocabularyTermDAO = new VocabularyTermDAO(sessionFactory);
-        attachmentDAO = new AttachmentDAO(sessionFactory);
+        attachmentDAO = new AttachmentDAO(getPersistencyResources());
         dataSetTypeDAO = new DataSetTypeDAO(sessionFactory);
         fileFormatTypeDAO = new FileFormatTypeDAO(sessionFactory);
         locatorTypeDAO = new LocatorTypeDAO(sessionFactory);
-- 
GitLab