From a0f7d5f2df44297cddf793d44e7c670863438e3b Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 22 Oct 2010 15:10:12 +0000
Subject: [PATCH] [LMS-1846] trigger update of index after evaluation of
 dynamic properties

SVN: 18420
---
 .../business/bo/AbstractBusinessObject.java    |  6 ++++++
 .../generic/server/dataaccess/IDAOFactory.java |  4 ++++
 .../server/dataaccess/db/AbstractDAO.java      | 15 +++++++++++----
 ...AbstractGenericEntityWithPropertiesDAO.java |  8 ++------
 .../server/dataaccess/db/DAOFactory.java       |  8 ++++++++
 .../server/dataaccess/db/ExperimentDAO.java    |  2 --
 .../DefaultDynamicPropertyEvaluator.java       |  4 ++--
 ...DummyDynamicPropertyEvaluationRunnable.java |  4 +++-
 .../DynamicPropertyEvaluationRunnable.java     | 18 +++++++++++++++---
 .../IDynamicPropertyEvaluator.java             |  3 ++-
 .../db/search/FullTextIndexUpdater.java        | 10 ++++++++--
 .../plugin/generic/server/GenericServer.java   | 15 +++++++++++++--
 12 files changed, 74 insertions(+), 23 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
index acb53c38888..914ad644b58 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
@@ -53,6 +53,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.ICodeSequenceDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.IPermIdDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 import ch.systemsx.cisd.openbis.generic.server.util.GroupIdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
@@ -323,4 +324,9 @@ abstract class AbstractBusinessObject implements IDAOFactory
     {
         return daoFactory.getDynamicPropertyEvaluationScheduler();
     }
+
+    public IFullTextIndexUpdateScheduler getFullTextIndexUpdateScheduler()
+    {
+        return daoFactory.getFullTextIndexUpdateScheduler();
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java
index ec88c63f32f..81348678603 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.ICodeSequenceDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.IPermIdDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
@@ -102,4 +103,7 @@ public interface IDAOFactory extends IAuthorizationDAOFactory
     /** Returns an implementation of {@link IDynamicPropertyEvaluationScheduler}. */
     public IDynamicPropertyEvaluationScheduler getDynamicPropertyEvaluationScheduler();
 
+    /** Returns an implementation of {@link IFullTextIndexUpdateScheduler}. */
+    public IFullTextIndexUpdateScheduler getFullTextIndexUpdateScheduler();
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
index e3113ddccab..ecb69ad2634 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
@@ -392,14 +392,21 @@ public abstract class AbstractDAO extends HibernateDaoSupport
         return result;
     }
 
-    protected static <T extends IEntityInformationWithPropertiesHolder> void scheduleDynamicPropertiesEvaluation(
-            IDynamicPropertyEvaluationScheduler scheduler, Class<T> entityClass, List<T> entities)
+    protected static <T extends IEntityInformationWithPropertiesHolder> List<Long> transformEntities2Longs(
+            Collection<T> entities)
     {
-        List<Long> ids = new ArrayList<Long>();
+        final List<Long> result = new ArrayList<Long>();
         for (IEntityInformationWithPropertiesHolder entity : entities)
         {
-            ids.add(entity.getId());
+            result.add(entity.getId());
         }
+        return result;
+    }
+
+    protected static <T extends IEntityInformationWithPropertiesHolder> void scheduleDynamicPropertiesEvaluation(
+            IDynamicPropertyEvaluationScheduler scheduler, Class<T> entityClass, List<T> entities)
+    {
+        List<Long> ids = transformEntities2Longs(entities);
         scheduleDynamicPropertiesEvaluationForIds(scheduler, entityClass, ids);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java
index 5f1fc5d3575..f6c6221fb66 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java
@@ -65,12 +65,8 @@ public abstract class AbstractGenericEntityWithPropertiesDAO<T extends IEntityIn
 
     protected void scheduleRemoveFromFullTextIndex(List<Long> ids)
     {
-        getIndexUpdateScheduler().scheduleUpdate(IndexUpdateOperation.remove(getClass(), ids));
-    }
-
-    protected void scheduleFullTextIndexUpdate(List<Long> ids)
-    {
-        getIndexUpdateScheduler().scheduleUpdate(IndexUpdateOperation.reindex(getClass(), ids));
+        getIndexUpdateScheduler()
+                .scheduleUpdate(IndexUpdateOperation.remove(getEntityClass(), ids));
     }
 
     protected void scheduleDynamicPropertiesEvaluation(List<T> entities)
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 acd3b911185..31c2b359cf4 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
@@ -61,6 +61,8 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
 
     private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
 
+    private final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler;
+
     private final ISampleTypeDAO sampleTypeDAO;
 
     private final IHibernateSearchDAO hibernateSearchDAO;
@@ -107,6 +109,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
         super(context, sessionFactory, fullTextIndexUpdateScheduler,
                 dynamicPropertyEvaluationScheduler);
         this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
+        this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler;
         final DatabaseInstancePE databaseInstance = getHomeDatabaseInstance();
         sampleTypeDAO = new SampleTypeDAO(sessionFactory, databaseInstance);
         hibernateSearchDAO = new HibernateSearchDAO(sessionFactory, hibernateSearchContext);
@@ -234,4 +237,9 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
         return dynamicPropertyEvaluationScheduler;
     }
 
+    public IFullTextIndexUpdateScheduler getFullTextIndexUpdateScheduler()
+    {
+        return fullTextIndexUpdateScheduler;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
index fa14e1ed2ed..afd7c928050 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -130,7 +129,6 @@ public class ExperimentDAO extends AbstractGenericEntityWithPropertiesDAO<Experi
         final HibernateTemplate template = getHibernateTemplate();
         template.saveOrUpdate(experiment);
         template.flush();
-        scheduleDynamicPropertiesEvaluation(Arrays.asList(experiment));
     }
 
     public List<ExperimentPE> listExperimentsByProjectAndProperty(String propertyCode,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java
index b914b82d77b..2562c407afc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java
@@ -76,8 +76,8 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
         try
         {
             transaction = hibernateSession.beginTransaction();
-            // we evaluate properties of entities in batches loading them in groups restricted by id:
-            // [ ids[index], ids[min(index+batchSize, maxIndex))] )
+            // we evaluate properties of entities in batches loading them in groups restricted by
+            // id: [ ids[index], ids[min(index+batchSize, maxIndex))] )
             int index = 0;
             final List<Long> ids = getAllIds(hibernateSession, clazz);
             final int idsSize = ids.size();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java
index ab27ae08cc7..17ad11bc312 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java
@@ -22,6 +22,7 @@ import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 
 /**
  * @author Piotr Buczek
@@ -33,7 +34,8 @@ public final class DummyDynamicPropertyEvaluationRunnable extends HibernateDaoSu
     private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
             DummyDynamicPropertyEvaluationRunnable.class);
 
-    public DummyDynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory)
+    public DummyDynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory,
+            final IFullTextIndexUpdateScheduler fullTextIFullTextIndexUpdateScheduler)
     {
         setSessionFactory(sessionFactory);
         operationLog.debug("dummy property evaluator created");
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
index bdae8d7b28e..ae6aa7427b9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
@@ -28,6 +28,8 @@ import ch.systemsx.cisd.common.collections.ExtendedBlockingQueueFactory;
 import ch.systemsx.cisd.common.collections.IExtendedBlockingQueue;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
@@ -52,8 +54,12 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
 
     private final IExtendedBlockingQueue<DynamicPropertyEvaluationOperation> evaluatorQueue;
 
-    public DynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory)
+    private final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler;
+
+    public DynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory,
+            final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler)
     {
+        this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler;
         setSessionFactory(sessionFactory);
         evaluator = new DefaultDynamicPropertyEvaluator(BATCH_SIZE);
 
@@ -127,9 +133,10 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
                 final StopWatch stopWatch = new StopWatch();
                 stopWatch.start();
                 Session session = null;
+                Class<IEntityInformationWithPropertiesHolder> clazz = null;
                 try
                 {
-                    final Class<IEntityInformationWithPropertiesHolder> clazz =
+                    clazz =
                             (Class<IEntityInformationWithPropertiesHolder>) Class.forName(operation
                                     .getClassName());
                     session = getSession();
@@ -157,6 +164,12 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
                                 + (operation.getIds() == null ? "" : operation.getIds().size()
                                         + " ") + operation.getClassName() + "s took " + stopWatch);
                     }
+                    if (clazz != null)
+                    {
+                        IndexUpdateOperation indexUpdateOperation =
+                                IndexUpdateOperation.reindex(clazz, operation.getIds());
+                        fullTextIndexUpdateScheduler.scheduleUpdate(indexUpdateOperation);
+                    }
                 }
                 evaluatorQueue.take();
             }
@@ -166,5 +179,4 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
                     .error("A problem has occurred while evaluating dynamic properties.", th);
         }
     }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java
index 72b7e48184e..dc4b67c3359 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java
@@ -24,7 +24,8 @@ import org.springframework.dao.DataAccessException;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
- * Each implementation is able to evaluate dynamic properties.
+ * Each implementation is able to evaluate dynamic properties. After evaluation of properties the
+ * entities will be reindexed.
  * 
  * @author Piotr Buczek
  */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java
index 868fa6a0b23..c6229b3cc87 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java
@@ -169,8 +169,14 @@ public final class FullTextIndexUpdater extends HibernateDaoSupport implements
                         switch (operation.getOperationKind())
                         {
                             case REINDEX:
-                                fullTextIndexer.doFullTextIndexUpdate(session, clazz,
-                                        operation.getIds());
+                                if (operation.getIds() == null)
+                                {
+                                    fullTextIndexer.doFullTextIndex(session, clazz);
+                                } else
+                                {
+                                    fullTextIndexer.doFullTextIndexUpdate(session, clazz,
+                                            operation.getIds());
+                                }
                                 break;
                             case REMOVE:
                                 fullTextIndexer.removeFromIndex(session, clazz, operation.getIds());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 1486d9b8bb8..265aeaadf8d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -555,6 +555,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                 sampleBO.setExperiment(experiment);
             }
         }
+        scheduleDynamicPropertiesEvaluation(
+                getDAOFactory().getDynamicPropertyEvaluationScheduler(), ExperimentPE.class,
+                Arrays.asList(experimentBO.getExperiment()));
     }
 
     public void registerMaterials(String sessionToken, String materialTypeCode,
@@ -577,7 +580,8 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
 
                 public void execute(List<NewMaterial> entities)
                 {
-                    final IMaterialTable materialTable = businessObjectFactory.createMaterialTable(session);
+                    final IMaterialTable materialTable =
+                            businessObjectFactory.createMaterialTable(session);
                     materialTable.add(entities, materialTypePE);
                     materialTable.save();
                 }
@@ -613,7 +617,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         {
             return 0;
         }
-        class Counter 
+        class Counter
         {
             int count;
         }
@@ -748,6 +752,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         ExperimentPE experiment = experimentBO.getExperiment();
         result.setModificationDate(experiment.getModificationDate());
         result.setSamples(Code.extractCodes(experiment.getSamples()));
+        scheduleDynamicPropertiesEvaluation(
+                getDAOFactory().getDynamicPropertyEvaluationScheduler(), ExperimentPE.class,
+                Arrays.asList(experimentBO.getExperiment()));
         return result;
     }
 
@@ -861,6 +868,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         return map;
     }
 
+    /**
+     * Schedules evaluation of dynamic properties on specified entities. After evaluation is done
+     * the entities will be indexed.
+     */
     private static <T extends IEntityInformationWithPropertiesHolder> void scheduleDynamicPropertiesEvaluation(
             IDynamicPropertyEvaluationScheduler scheduler, Class<T> entityClass, List<T> entities)
     {
-- 
GitLab