From f9b70242b002f472c4dd33011b6b38813e3766f4 Mon Sep 17 00:00:00 2001
From: gakin <gakin>
Date: Mon, 23 Jan 2017 10:57:07 +0000
Subject: [PATCH] SSDM-4675 : Adding mandatory property or removing a property
 when entities of that type exist should update entity time stamps

SVN: 37608
---
 .../business/bo/EntityTypePropertyTypeBO.java |  7 +++
 .../dataaccess/IEntityPropertyTypeDAO.java    |  7 +++
 .../dataaccess/db/EntityPropertyTypeDAO.java  | 43 +++++++++++++++++++
 3 files changed, 57 insertions(+)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
index bf9d8b1c03d..c27e8af2025 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
@@ -161,6 +161,12 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
         }
     }
 
+    private void updateEntityModificationTimestamps(List<Long> entityIds)
+    {
+        IEntityPropertyTypeDAO entityPropertyTypeDAO = getEntityPropertyTypeDAO(entityKind);
+        entityPropertyTypeDAO.updateEntityModificationTimestamps(entityIds, getTransactionTimeStamp());
+    }
+
     private ScriptPE tryFindScript(NewETPTAssignment newAssignment)
     {
         if (newAssignment.getScriptName() == null)
@@ -205,6 +211,7 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
                                 registrator, validatedValue);
 
                 entityPropertyTypeDAO.createProperties(property, entityIds);
+                updateEntityModificationTimestamps(entityIds);
             }
 
             if (operationLog.isDebugEnabled())
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java
index 76e9fdb9b5e..409247eceff 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.dao.DataAccessException;
@@ -121,4 +122,10 @@ public interface IEntityPropertyTypeDAO
      */
     public void createProperties(EntityPropertyPE property, List<Long> entityIds);
 
+    /**
+     * Updates the modification time stamps of the entities specified by entityIds This is necessary when 1. A new mandatory property is assigned to
+     * the entity type and existing entities need to be updated with a default value for the mandatory property 2. If a property is unassigned from an
+     * entity type.
+     */
+    public void updateEntityModificationTimestamps(final List<Long> entityIds, final Date timestamp);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java
index 6ae0233d308..584e9e1908d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -26,13 +27,16 @@ import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
+import org.hibernate.HibernateException;
 import org.hibernate.SQLQuery;
+import org.hibernate.Session;
 import org.hibernate.StatelessSession;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.ProjectionList;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
+import org.springframework.orm.hibernate4.HibernateCallback;
 import org.springframework.orm.hibernate4.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
@@ -242,6 +246,44 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty
         return list;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public void updateEntityModificationTimestamps(final List<Long> entityIds, final Date timestamp)
+    {
+        getHibernateTemplate().execute(new HibernateCallback()
+            {
+                @Override
+                public Object doInHibernate(Session session) throws HibernateException
+                {
+                    String entityTableName = null;
+
+                    switch (entityKind)
+                    {
+                        case SAMPLE:
+                            entityTableName = TableNames.SAMPLES_ALL_TABLE;
+                            break;
+                        case DATA_SET:
+                            entityTableName = TableNames.DATA_ALL_TABLE;
+                            break;
+                        case MATERIAL:
+                            entityTableName = TableNames.MATERIALS_TABLE;
+                            break;
+                        case EXPERIMENT:
+                            entityTableName = TableNames.EXPERIMENTS_VIEW;
+                            break;
+                        default:
+                            throw new IllegalArgumentException(entityKind.toString());
+                    }
+                    SQLQuery clearQuery =
+                            session.createSQLQuery(
+                                    "update " + entityTableName + " set modification_timestamp = :timestamp where id in :entityIds ");
+                    clearQuery.setTimestamp("timestamp", timestamp);
+                    clearQuery.setParameterList("entityIds", entityIds);
+                    clearQuery.executeUpdate();
+                    return null;
+                }
+            });
+    }
+
     @Override
     public List<Long> listIdsOfEntitiesWithoutPropertyValue(
             final EntityTypePropertyTypePE assignment) throws DataAccessException
@@ -509,6 +551,7 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty
         template.clear();
         template.delete(assignment);
 
+        updateEntityModificationTimestamps(entityIds, getTransactionTimeStamp());
         scheduleDynamicPropertiesEvaluation(entityIds);
 
         if (operationLog.isInfoEnabled())
-- 
GitLab