From 957b342c3ec95d0185749a9d89de4e9518dc58ee Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 21 Jun 2011 11:08:01 +0000
Subject: [PATCH] LMS-2286 extend path info database with last modified date
 and use it

SVN: 21765
---
 .../path/DatabaseBasedDataSetPathsInfoFeeder.java   |  2 +-
 .../systemsx/cisd/etlserver/path/IPathsInfoDAO.java |  6 ++++--
 .../ch/systemsx/cisd/etlserver/path/PathInfo.java   |  9 +++++++++
 .../DatabaseBasedDataSetPathInfoProvider.java       |  7 ++++++-
 .../shared/PathInfoDatabaseVersionHolder.java       |  2 +-
 .../PathInfoProviderBasedHierarchicalContent.java   |  4 +++-
 .../dss/generic/shared/dto/DataSetPathInfo.java     | 13 +++++++++++++
 .../DatabaseBasedDataSetPathsInfoFeederTest.java    | 13 +++++++------
 .../path/PathInfoDatabaseFeedingTaskTest.java       |  3 ++-
 .../systemtests/PathInfoDatabaseTest.java           |  5 +++--
 10 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java
index 283f127dca1..992605af10e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java
@@ -62,7 +62,7 @@ public class DatabaseBasedDataSetPathsInfoFeeder implements IDataSetPathsInfoFee
         String relativePath = parentId == null ? "" : pathPrefix + fileName;
         long id =
                 dao.createDataSetFile(dataSetId, parentId, relativePath, fileName,
-                        pathInfo.getSizeInBytes(), directory);
+                        pathInfo.getSizeInBytes(), directory, pathInfo.getLastModifiedDate());
         if (relativePath.length() > 0)
         {
             relativePath += '/';
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java
index abc6cf3b74e..99d5157a78f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.etlserver.path;
 
+import java.util.Date;
+
 import net.lemnik.eodsql.Select;
 import net.lemnik.eodsql.TransactionQuery;
 
@@ -33,8 +35,8 @@ public interface IPathsInfoDAO extends TransactionQuery
     public long createDataSet(String code, String location);
     
     @Select("insert into data_set_files (dase_id, parent_id, relative_path, file_name, "
-            + "size_in_bytes, is_directory) values (?{1}, ?{2}, ?{3}, ?{4}, ?{5}, ?{6}) returning id")
+            + "size_in_bytes, is_directory, last_modified) values (?{1}, ?{2}, ?{3}, ?{4}, ?{5}, ?{6}, ?{7}) returning id")
     public long createDataSetFile(long dataSetId, Long parentId, String relativePath,
-            String fileName, long sizeInBytes, boolean directory);
+            String fileName, long sizeInBytes, boolean directory, Date lastModifiedDate);
     
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfo.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfo.java
index ae6426b72af..6d2f765c08d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfo.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfo.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.etlserver.path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.common.io.IHierarchicalContentNode;
@@ -41,6 +42,7 @@ final class PathInfo
         }
         PathInfo pathInfo = new PathInfo();
         pathInfo.fileName = node.getName();
+        pathInfo.lastModifiedDate = new Date(node.getLastModified());
         pathInfo.directory = node.isDirectory();
         if (pathInfo.directory)
         {
@@ -90,6 +92,8 @@ final class PathInfo
     private boolean directory;
     
     private List<PathInfo> children;
+    
+    private Date lastModifiedDate;
 
     public String getFileName()
     {
@@ -111,6 +115,11 @@ final class PathInfo
         return directory;
     }
 
+    public Date getLastModifiedDate()
+    {
+        return lastModifiedDate;
+    }
+
     public List<PathInfo> getChildren()
     {
         return children == null ? NO_CHILDREN : Collections.unmodifiableList(children);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java
index 244194be21c..213ae21b3ca 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.dss.generic.server;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -53,13 +54,15 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
         public long size_in_bytes;
 
         public boolean is_directory;
+        
+        public Date last_modified;
     }
 
     @Private
     static interface IPathInfoDAO extends BaseQuery
     {
         static String SELECT_DATA_SET_FILES =
-                "SELECT id, parent_id, relative_path, file_name, size_in_bytes, is_directory FROM data_set_files ";
+                "SELECT id, parent_id, relative_path, file_name, size_in_bytes, is_directory, last_modified FROM data_set_files ";
 
         @Select("SELECT id FROM data_sets WHERE code = ?{1}")
         public Long tryToGetDataSetId(String dataSetCode);
@@ -245,6 +248,7 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
             result.setRelativePath(record.relative_path);
             result.setDirectory(record.is_directory);
             result.setSizeInBytes(record.size_in_bytes);
+            result.setLastModified(record.last_modified);
             return result;
         }
 
@@ -281,6 +285,7 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
                     dataSetPathInfo.setRelativePath(dataSetFileRecord.relative_path);
                     dataSetPathInfo.setDirectory(dataSetFileRecord.is_directory);
                     dataSetPathInfo.setSizeInBytes(dataSetFileRecord.size_in_bytes);
+                    dataSetPathInfo.setLastModified(dataSetFileRecord.last_modified);
                     idToInfoMap.put(dataSetFileRecord.id, dataSetPathInfo);
                     Long parentId = dataSetFileRecord.parent_id;
                     if (parentId == null)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/PathInfoDatabaseVersionHolder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/PathInfoDatabaseVersionHolder.java
index e0070d1fe65..3ffc15c1bf4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/PathInfoDatabaseVersionHolder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/PathInfoDatabaseVersionHolder.java
@@ -25,7 +25,7 @@ public class PathInfoDatabaseVersionHolder implements IDatabaseVersionHolder
 {
     public String getDatabaseVersion()
     {
-        return "001"; // S104
+        return "002"; // S109
     }
 
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContent.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContent.java
index 5705ef4d4e1..7cca3c57e8f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContent.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContent.java
@@ -21,6 +21,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
@@ -209,7 +210,8 @@ class PathInfoProviderBasedHierarchicalContent implements IHierarchicalContent
 
         public long getLastModified()
         {
-            return System.currentTimeMillis();
+            Date lastModified = pathInfo.getLastModified();
+            return lastModified == null ? System.currentTimeMillis() : lastModified.getTime();
         }
 
         @Override
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetPathInfo.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetPathInfo.java
index 3544dc7fea2..3d44c3c3fcf 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetPathInfo.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetPathInfo.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.dto;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -31,6 +32,8 @@ public class DataSetPathInfo
     private String relativePath;
 
     private boolean directory;
+    
+    private Date lastModified;
 
     private long sizeInBytes;
 
@@ -78,6 +81,16 @@ public class DataSetPathInfo
         this.sizeInBytes = sizeInBytes;
     }
 
+    public Date getLastModified()
+    {
+        return lastModified;
+    }
+
+    public void setLastModified(Date lastModified)
+    {
+        this.lastModified = lastModified;
+    }
+
     @Deprecated
     public DataSetPathInfo getParent()
     {
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java
index 5aabdcec994..d7f993b18ad 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.etlserver.path;
 
 import java.io.File;
 import java.lang.reflect.Method;
+import java.util.Date;
 
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -79,22 +80,22 @@ public class DatabaseBasedDataSetPathsInfoFeederTest extends AbstractFileSystemT
                     one(dao).createDataSet("ds-1", "a/b/c/");
                     will(returnValue(42L));
                     
-                    one(dao).createDataSetFile(42L, null, "", ROOT_PATH, 38, true);
+                    one(dao).createDataSetFile(42L, null, "", ROOT_PATH, 38, true, new Date(1));
                     will(returnValue(100L));
                     
-                    one(dao).createDataSetFile(42L, 100L, "dir", "dir", 26, true);
+                    one(dao).createDataSetFile(42L, 100L, "dir", "dir", 26, true, new Date(2));
                     will(returnValue(101L));
                     
-                    one(dao).createDataSetFile(42L, 101L, "dir/hello.txt", "hello.txt", 11, false);
+                    one(dao).createDataSetFile(42L, 101L, "dir/hello.txt", "hello.txt", 11, false, new Date(3));
                     will(returnValue(102L));
                     
-                    one(dao).createDataSetFile(42L, 101L, "dir/read.me", "read.me", 15, false);
+                    one(dao).createDataSetFile(42L, 101L, "dir/read.me", "read.me", 15, false, new Date(4));
                     will(returnValue(103L));
                     
-                    one(dao).createDataSetFile(42L, 101L, "dir/dir", "dir", 0, true);
+                    one(dao).createDataSetFile(42L, 101L, "dir/dir", "dir", 0, true, new Date(5));
                     will(returnValue(104L));
                     
-                    one(dao).createDataSetFile(42L, 100L, "read.me", "read.me", 12, false);
+                    one(dao).createDataSetFile(42L, 100L, "read.me", "read.me", 12, false, new Date(6));
                     will(returnValue(105L));
                 }
             });
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTaskTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTaskTest.java
index f86a7b2be2b..c4ead1dae4a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTaskTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTaskTest.java
@@ -21,6 +21,7 @@ import static ch.systemsx.cisd.common.utilities.IDelegatedAction.DO_NOTHING;
 import java.io.File;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.Date;
 
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -239,7 +240,7 @@ public class PathInfoDatabaseFeedingTaskTest extends AbstractFileSystemTestCase
                     one(node).isDirectory();
                     will(returnValue(false));
 
-                    one(dao).createDataSetFile(101L, null, "", "ds1-root", 12345L, false);
+                    one(dao).createDataSetFile(101L, null, "", "ds1-root", 12345L, false, new Date(42));
                     will(returnValue(102L));
 
                     one(dao).commit();
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/PathInfoDatabaseTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/PathInfoDatabaseTest.java
index 48994b4ae34..f02dd013884 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/PathInfoDatabaseTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/PathInfoDatabaseTest.java
@@ -22,6 +22,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.regex.Pattern;
 
@@ -129,7 +130,7 @@ public class PathInfoDatabaseTest extends SystemTestCase
         try
         {
             long id = dao.createDataSet("ds-1", "a/b/c/");
-            long parentId = dao.createDataSetFile(id, null, "", "ds-1", 0, true);
+            long parentId = dao.createDataSetFile(id, null, "", "ds-1", 0, true, new Date(4711));
             numberOfEntries += feedDataBase(dao, id, parentId, 3, "");
             dao.commit();
         } catch (Exception ex)
@@ -151,7 +152,7 @@ public class PathInfoDatabaseTest extends SystemTestCase
             String fileName = "file-" + i + "-" + (i * i) + (directory ? "" : "-xyz.xml");
             long id =
                     dao.createDataSetFile(dataSetId, parentId, prefix + fileName, fileName, level
-                            * 100 + i, directory);
+                            * 100 + i, directory, new Date(4711));
             numberOfEntries++;
             if (directory)
             {
-- 
GitLab