From ffed26957ea40bdedc201843efb483a87c3610c5 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 19 Apr 2011 09:25:18 +0000
Subject: [PATCH] LMS-2172 IDataSetPathInfoProvider extended by method 
 listPathInfosByRegularExpression

SVN: 20968
---
 .../DatabaseBasedDataSetPathsInfoFeeder.java  |   8 +-
 .../cisd/etlserver/path/IPathsInfoDAO.java    |   3 +
 .../path/PathInfoDatabaseFeedingTask.java     |  10 +-
 .../DatabaseBasedDataSetPathInfoProvider.java | 111 +++++++++++++-----
 .../shared/IDataSetPathInfoProvider.java      |   4 +
 ...tabaseBasedDataSetPathsInfoFeederTest.java |  12 +-
 6 files changed, 108 insertions(+), 40 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 e70f7ca1876..283f127dca1 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
@@ -59,16 +59,20 @@ public class DatabaseBasedDataSetPathsInfoFeeder implements IDataSetPathsInfoFee
     {
         boolean directory = pathInfo.isDirectory();
         String fileName = pathInfo.getFileName();
-        String relativePath = pathPrefix + fileName;
+        String relativePath = parentId == null ? "" : pathPrefix + fileName;
         long id =
                 dao.createDataSetFile(dataSetId, parentId, relativePath, fileName,
                         pathInfo.getSizeInBytes(), directory);
+        if (relativePath.length() > 0)
+        {
+            relativePath += '/';
+        }
         if (directory)
         {
             List<PathInfo> children = pathInfo.getChildren();
             for (PathInfo child : children)
             {
-                addPaths(dataSetId, id, relativePath + "/", child);
+                addPaths(dataSetId, id, relativePath, child);
             }
         }
     }
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 71614c37f86..abc6cf3b74e 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
@@ -26,6 +26,9 @@ import net.lemnik.eodsql.TransactionQuery;
  */
 public interface IPathsInfoDAO extends TransactionQuery
 {
+    @Select("select id from data_sets where code = ?{1}")
+    public Long tryGetDataSetId(String code);
+    
     @Select("insert into data_sets (code, location) values (?{1}, ?{2}) returning id")
     public long createDataSet(String code, String location);
     
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java
index a7f9dc01e05..ed67d991b9e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java
@@ -159,10 +159,14 @@ public class PathInfoDatabaseFeedingTask implements IMaintenanceTask, IPostRegis
         {
             DatabaseBasedDataSetPathsInfoFeeder feeder =
                     new DatabaseBasedDataSetPathsInfoFeeder(dao, hierarchicalContentFactory);
-            feeder.addPaths(dataSetCode, dataSet.getDataSetLocation(), dataSetRoot);
+            Long id = dao.tryGetDataSetId(dataSetCode);
+            if (id != null)
+            {
+                feeder.addPaths(dataSetCode, dataSet.getDataSetLocation(), dataSetRoot);
+            }
             dao.commit();
-            operationLog.info("Successfully added paths inside data set " + dataSetCode
-                    + " to database.");
+            operationLog.info("Paths inside data set " + dataSetCode
+                    + " successfully added to database.");
         } catch (Exception ex)
         {
             handleException(ex, dataSetCode);
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 39535fdb180..d816a8b0708 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
@@ -61,6 +61,14 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
         
         @Select("select id, parent_id, relative_path, size_in_bytes, is_directory from data_set_files where dase_id = ?{1}")
         public List<DataSetFileRecord> listDataSetFiles(long dataSetId);
+        
+        @Select("select id, parent_id, relative_path, size_in_bytes, is_directory from data_set_files where dase_id = ?{1} and relative_path ~ ?{2}")
+        public List<DataSetFileRecord> listDataSetFilesByRegularExpression(long dataSetId, String regex);
+    }
+    
+    private static interface ILoader
+    {
+        List<DataSetFileRecord> listDataSetFiles(long dataSetId);
     }
     
     private IPathInfoDAO dao;
@@ -74,52 +82,97 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
         this.dao = dao;
     }
 
+    public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode,
+            final String regularExpression)
+    {
+        return new Loader(dataSetCode, new ILoader()
+            {
+                public List<DataSetFileRecord> listDataSetFiles(long dataSetId)
+                {
+                    return getDao().listDataSetFilesByRegularExpression(dataSetId,
+                            "^" + regularExpression + "$");
+                }
+            }).getInfos();
+    }
+
     public DataSetPathInfo tryGetDataSetRootPathInfo(String dataSetCode)
     {
-        DataSetPathInfo result = null;
-        Long dataSetId = getDao().tryToGetDataSetId(dataSetCode);
-        if (dataSetId != null)
-        {
-            List<DataSetFileRecord> dataSetFileRecords = getDao().listDataSetFiles(dataSetId);
-            Map<Long, DataSetPathInfo> idToInfoMap = new HashMap<Long, DataSetPathInfo>();
-            Map<Long, List<DataSetPathInfo>> parentChildrenMap =
-                    new HashMap<Long, List<DataSetPathInfo>>();
-            for (DataSetFileRecord dataSetFileRecord : dataSetFileRecords)
+        return new Loader(dataSetCode, new ILoader()
             {
-                DataSetPathInfo dataSetPathInfo = new DataSetPathInfo();
-                dataSetPathInfo.setFileName(dataSetFileRecord.file_name);
-                dataSetPathInfo.setRelativePath(dataSetFileRecord.relative_path);
-                dataSetPathInfo.setDirectory(dataSetFileRecord.is_directory);
-                dataSetPathInfo.setSizeInBytes(dataSetFileRecord.size_in_bytes);
-                idToInfoMap.put(dataSetFileRecord.id, dataSetPathInfo);
-                Long parentId = dataSetFileRecord.parent_id;
-                if (parentId == null)
+                public List<DataSetFileRecord> listDataSetFiles(long dataSetId)
                 {
-                    result = dataSetPathInfo;
-                } else
+                    return getDao().listDataSetFiles(dataSetId);
+                }
+            }).getRoot();
+    }
+    
+    private final class Loader
+    {
+        private Map<Long, DataSetPathInfo> idToInfoMap = new HashMap<Long, DataSetPathInfo>();
+        private DataSetPathInfo root;
+
+        Loader(String dataSetCode, ILoader loader)
+        {
+            Long dataSetId = getDao().tryToGetDataSetId(dataSetCode);
+            if (dataSetId != null)
+            {
+                List<DataSetFileRecord> dataSetFileRecords = loader.listDataSetFiles(dataSetId);
+                Map<Long, List<DataSetPathInfo>> parentChildrenMap =
+                        new HashMap<Long, List<DataSetPathInfo>>();
+                for (DataSetFileRecord dataSetFileRecord : dataSetFileRecords)
                 {
-                    List<DataSetPathInfo> children = parentChildrenMap.get(parentId);
-                    if (children == null)
+                    DataSetPathInfo dataSetPathInfo = new DataSetPathInfo();
+                    dataSetPathInfo.setFileName(dataSetFileRecord.file_name);
+                    dataSetPathInfo.setRelativePath(dataSetFileRecord.relative_path);
+                    dataSetPathInfo.setDirectory(dataSetFileRecord.is_directory);
+                    dataSetPathInfo.setSizeInBytes(dataSetFileRecord.size_in_bytes);
+                    idToInfoMap.put(dataSetFileRecord.id, dataSetPathInfo);
+                    Long parentId = dataSetFileRecord.parent_id;
+                    if (parentId == null)
+                    {
+                        root = dataSetPathInfo;
+                    } else
                     {
-                        children = new ArrayList<DataSetPathInfo>();
-                        parentChildrenMap.put(parentId, children);
+                        List<DataSetPathInfo> children = parentChildrenMap.get(parentId);
+                        if (children == null)
+                        {
+                            children = new ArrayList<DataSetPathInfo>();
+                            parentChildrenMap.put(parentId, children);
+                        }
+                        children.add(dataSetPathInfo);
                     }
-                    children.add(dataSetPathInfo);
                 }
+                linkParentsWithChildren(parentChildrenMap);
             }
+        }
+
+        private void linkParentsWithChildren(Map<Long, List<DataSetPathInfo>> parentChildrenMap)
+        {
             for (Entry<Long, List<DataSetPathInfo>> entry : parentChildrenMap.entrySet())
             {
                 Long parentId = entry.getKey();
                 DataSetPathInfo parent = idToInfoMap.get(parentId);
-                List<DataSetPathInfo> children = entry.getValue();
-                for (DataSetPathInfo child : children)
+                if (parent != null)
                 {
-                    parent.addChild(child);
-                    child.setParent(parent);
+                    List<DataSetPathInfo> children = entry.getValue();
+                    for (DataSetPathInfo child : children)
+                    {
+                        parent.addChild(child);
+                        child.setParent(parent);
+                    }
                 }
             }
         }
-        return result;
+
+        DataSetPathInfo getRoot()
+        {
+            return root;
+        }
+        
+        List<DataSetPathInfo> getInfos()
+        {
+            return new ArrayList<DataSetPathInfo>(idToInfoMap.values());
+        }
     }
     
     private IPathInfoDAO getDao()
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java
index 1f9e485fe34..4f5e1024992 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java
@@ -17,6 +17,8 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared;
 
 
+import java.util.List;
+
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo;
 
 
@@ -27,5 +29,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo;
  */
 public interface IDataSetPathInfoProvider
 {
+    public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode, String regularExpression);
+    
     public DataSetPathInfo tryGetDataSetRootPathInfo(String dataSetCode);
 }
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 ae6756a0217..de868dfcc86 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
@@ -79,22 +79,22 @@ public class DatabaseBasedDataSetPathsInfoFeederTest extends AbstractFileSystemT
                     one(dao).createDataSet("ds-1", "a/b/c/");
                     will(returnValue(42L));
                     
-                    one(dao).createDataSetFile(42L, null, ROOT_PATH, ROOT_PATH, 38, true);
+                    one(dao).createDataSetFile(42L, null, "", ROOT_PATH, 38, true);
                     will(returnValue(100L));
                     
-                    one(dao).createDataSetFile(42L, 100L, ROOT_PATH + "/dir", "dir", 26, true);
+                    one(dao).createDataSetFile(42L, 100L, "dir", "dir", 26, true);
                     will(returnValue(101L));
                     
-                    one(dao).createDataSetFile(42L, 101L, ROOT_PATH + "/dir/hello.txt", "hello.txt", 11, false);
+                    one(dao).createDataSetFile(42L, 101L, "dir/hello.txt", "hello.txt", 11, false);
                     will(returnValue(102L));
                     
-                    one(dao).createDataSetFile(42L, 101L, ROOT_PATH + "/dir/read.me", "read.me", 15, false);
+                    one(dao).createDataSetFile(42L, 101L, "dir/read.me", "read.me", 15, false);
                     will(returnValue(103L));
                     
-                    one(dao).createDataSetFile(42L, 101L, ROOT_PATH + "/dir/dir", "dir", 0, true);
+                    one(dao).createDataSetFile(42L, 101L, "dir/dir", "dir", 0, true);
                     will(returnValue(104L));
                     
-                    one(dao).createDataSetFile(42L, 100L, ROOT_PATH + "/read.me", "read.me", 12, false);
+                    one(dao).createDataSetFile(42L, 100L, "read.me", "read.me", 12, false);
                     will(returnValue(105L));
                 }
             });
-- 
GitLab