From add6a343062b623e3c76148ff37957190d5473ac Mon Sep 17 00:00:00 2001
From: felmer <franz-josef.elmer@id.ethz.ch>
Date: Thu, 31 Jan 2019 08:04:37 +0100
Subject: [PATCH] SSDM-7204: harvester: update registrator and registration
 timestamp for materials

---
 .../synchronizer/EntitySynchronizer.java      | 79 +++++++++++--------
 .../synchronizer/IHarvesterQuery.java         |  8 +-
 .../synchronizer/MaterialTypeRecord.java      | 28 +++++++
 .../synchronizer/RegistrationDTO.java         | 12 +++
 4 files changed, 93 insertions(+), 34 deletions(-)
 create mode 100644 datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MaterialTypeRecord.java

diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
index 27acb973269..960fbaf0005 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
@@ -271,12 +271,20 @@ public class EntitySynchronizer
             Map<String, Long> userTechIdsByUserId, Monitor monitor)
     {
         monitor.log("update " + materials.size() + " materials");
+        List<MaterialTypeRecord> listAllMaterialTypes = query.listAllMaterialTypes();
+        Map<String, Long> materialTypeIdsByCode = new HashMap<>();
+        for (MaterialTypeRecord materialTypeRecord : listAllMaterialTypes)
+        {
+            materialTypeIdsByCode.put(materialTypeRecord.code, materialTypeRecord.id);
+        }
         List<RegistrationDTO> registrations = new ArrayList<>();
         for (IncomingMaterial incomingMaterial : materials)
         {
-//            addRegistration(registrations, incomingMaterial.getPermID(), incomingMaterial, userTechIdsByUserId);
+            NewMaterialWithType material = incomingMaterial.getMaterial();
+            Long typeId = materialTypeIdsByCode.get(material.getType());
+            addRegistration(registrations, material.getCode(), typeId, incomingMaterial, userTechIdsByUserId);
         }
-        query.updateProjectRegistrations(registrations);
+        query.updateMaterialRegistrations(registrations);
     }
 
     private void updateProjects(Collection<IncomingProject> projects, IHarvesterQuery query,
@@ -290,7 +298,7 @@ public class EntitySynchronizer
         }
         query.updateProjectRegistrations(registrations);
     }
-    
+
     private void updateExperiments(Collection<IncomingExperiment> experiments, IHarvesterQuery query,
             Map<String, Long> userTechIdsByUserId, Monitor monitor)
     {
@@ -345,41 +353,47 @@ public class EntitySynchronizer
     {
         monitor.log("update " + dataSets.size() + " data sets");
         BatchOperationExecutor.executeInBatches(new IBatchOperation<IncomingDataSet>()
-        {
-            @Override
-            public List<IncomingDataSet> getAllEntities()
             {
-                return new ArrayList<>(dataSets);
-            }
-            
-            @Override
-            public void execute(List<IncomingDataSet> dataSets)
-            {
-                List<RegistrationDTO> registrations = new ArrayList<>();
-                for (IncomingDataSet incomingDataSet : dataSets)
+                @Override
+                public List<IncomingDataSet> getAllEntities()
                 {
-                    addRegistration(registrations, incomingDataSet.getFullDataSet().getMetadataCreation().getCode(), 
-                            incomingDataSet, userTechIdsByUserId);
+                    return new ArrayList<>(dataSets);
                 }
-                query.updateDataSetRegistrations(registrations);
-            }
-            
-            @Override
-            public String getEntityName()
-            {
-                return "data set";
-            }
-            
-            @Override
-            public String getOperationName()
-            {
-                return "update registration";
-            }
-        });
+
+                @Override
+                public void execute(List<IncomingDataSet> dataSets)
+                {
+                    List<RegistrationDTO> registrations = new ArrayList<>();
+                    for (IncomingDataSet incomingDataSet : dataSets)
+                    {
+                        addRegistration(registrations, incomingDataSet.getFullDataSet().getMetadataCreation().getCode(),
+                                incomingDataSet, userTechIdsByUserId);
+                    }
+                    query.updateDataSetRegistrations(registrations);
+                }
+
+                @Override
+                public String getEntityName()
+                {
+                    return "data set";
+                }
+
+                @Override
+                public String getOperationName()
+                {
+                    return "update registration";
+                }
+            });
     }
-    
+
     private void addRegistration(List<RegistrationDTO> registrations, String permID, AbstractRegistrationHolder entity,
             Map<String, Long> userTechIdsByUserId)
+    {
+        addRegistration(registrations, permID, null, entity, userTechIdsByUserId);
+    }
+
+    private void addRegistration(List<RegistrationDTO> registrations, String permID, Long typeId, AbstractRegistrationHolder entity,
+            Map<String, Long> userTechIdsByUserId)
     {
         String registrator = entity.getRegistrator();
         Long registratorId = userTechIdsByUserId.get(registrator);
@@ -387,6 +401,7 @@ public class EntitySynchronizer
         {
             RegistrationDTO registration = new RegistrationDTO();
             registration.setPermId(permID);
+            registration.setTypeId(typeId);
             registration.setRegistrationTimestamp(entity.getRegistrationTimestamp());
             registration.setRegistratorId(registratorId);
             registrations.add(registration);
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/IHarvesterQuery.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/IHarvesterQuery.java
index a56bbaa8cb7..f6c790f9e84 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/IHarvesterQuery.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/IHarvesterQuery.java
@@ -34,8 +34,12 @@ public interface IHarvesterQuery extends BaseQuery
     @Select("select id,user_id as userId from persons")
     public List<PersonRecord> listAllUsers();
 
-//    @Update(sql = "update materials " + UPDATE2, batchUpdate = true)
-//    public void updateMaterialRegistrations(List<RegistrationDTO> registrations);
+    @Select("select id,code from material_types")
+    public List<MaterialTypeRecord> listAllMaterialTypes();
+
+    @Update(sql = "update materials set registration_timestamp = ?{1.registrationTimestamp}, pers_id_registerer = ?{1.registratorId} "
+            + "where code = ?{1.permId} and maty_id = ?{1.typeId}", batchUpdate = true)
+    public void updateMaterialRegistrations(List<RegistrationDTO> registrations);
 
     @Update(sql = "update projects " + UPDATE2, batchUpdate = true)
     public void updateProjectRegistrations(List<RegistrationDTO> registrations);
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MaterialTypeRecord.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MaterialTypeRecord.java
new file mode 100644
index 00000000000..5bfc4625f94
--- /dev/null
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MaterialTypeRecord.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2019 ETH Zuerich, SIS
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.server.dss.plugins.sync.harvester.synchronizer;
+
+/**
+ * @author Franz-Josef Elmer
+ *
+ */
+public class MaterialTypeRecord
+{
+    public long id;
+    public String code;
+
+}
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/RegistrationDTO.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/RegistrationDTO.java
index 8aa31fe1a2d..de5777cfe3e 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/RegistrationDTO.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/RegistrationDTO.java
@@ -24,6 +24,8 @@ import java.util.Date;
 public class RegistrationDTO
 {
     private String permId;
+    
+    private Long typeId;
 
     private Date registrationTimestamp;
 
@@ -39,6 +41,16 @@ public class RegistrationDTO
         this.permId = permId;
     }
 
+    public Long getTypeId()
+    {
+        return typeId;
+    }
+
+    public void setTypeId(Long typeId)
+    {
+        this.typeId = typeId;
+    }
+
     public Date getRegistrationTimestamp()
     {
         return registrationTimestamp;
-- 
GitLab