From 3036127e49105c49f6adce1fa0058a3dfe7f2ca6 Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Thu, 25 Jun 2015 07:49:51 +0000
Subject: [PATCH] SSDM-1813: Return all the files in a dataset instead of only
 the ones in the root folder. Improve tests.

SVN: 34286
---
 .../dss/api/v3/DataStoreServerApi.java        | 29 +++++-
 .../dss/systemtest/api/v3/SearchFileTest.java | 99 +++++++++++++++++--
 2 files changed, 118 insertions(+), 10 deletions(-)

diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/dss/api/v3/DataStoreServerApi.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/dss/api/v3/DataStoreServerApi.java
index 3e66f0d5d62..92fe81e49f5 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/dss/api/v3/DataStoreServerApi.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/dss/api/v3/DataStoreServerApi.java
@@ -17,12 +17,15 @@ package ch.ethz.sis.openbis.generic.dss.api.v3;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.collections.iterators.IteratorChain;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -65,7 +68,6 @@ public class DataStoreServerApi extends AbstractDssServiceRpc<IDataStoreServerAp
     /**
      * Logger with {@link LogCategory#OPERATION} with name of the concrete class, needs to be static for our purpose.
      */
-    @SuppressWarnings("hiding")
     protected static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
             DataStoreServerApi.class);
 
@@ -127,7 +129,6 @@ public class DataStoreServerApi extends AbstractDssServiceRpc<IDataStoreServerAp
             if (iSearchCriterion instanceof DataSetSearchCriterion)
             {
                 List<DataSet> dataSets = as.searchDataSets(sessionToken, (DataSetSearchCriterion) iSearchCriterion, new DataSetFetchOptions());
-                System.err.println(dataSets.size());
                 HashSet<String> codes = new HashSet<String>();
                 for (DataSet dataSet : dataSets)
                 {
@@ -150,8 +151,7 @@ public class DataStoreServerApi extends AbstractDssServiceRpc<IDataStoreServerAp
         for (String code : resultDataSets)
         {
             IHierarchicalContent content = getHierarchicalContentProvider(sessionToken).asContent(code);
-            List<IHierarchicalContentNode> nodes = content.listMatchingNodes("");
-            for (IHierarchicalContentNode node : nodes)
+            for (IHierarchicalContentNode node : iterate(content.getRootNode()))
             {
                 DataSetFile file = new DataSetFile();
                 file.setFileName(node.getFile().getPath());
@@ -162,6 +162,27 @@ public class DataStoreServerApi extends AbstractDssServiceRpc<IDataStoreServerAp
         return result;
     }
 
+    private Iterable<IHierarchicalContentNode> iterate(final IHierarchicalContentNode node)
+    {
+        return new Iterable<IHierarchicalContentNode>()
+            {
+                @Override
+                public Iterator<IHierarchicalContentNode> iterator()
+                {
+                    IteratorChain<IHierarchicalContentNode> chain = new IteratorChain<>(Collections.singleton(node).iterator());
+
+                    if (node.isDirectory())
+                    {
+                        for (IHierarchicalContentNode child : node.getChildNodes())
+                        {
+                            chain.addIterator(iterate(child).iterator());
+                        }
+                    }
+                    return chain;
+                }
+            };
+    }
+
     @Override
     public int getMajorVersion()
     {
diff --git a/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java b/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java
index 2e615d74414..424fb0d7b5c 100644
--- a/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java
+++ b/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java
@@ -1,16 +1,25 @@
 package ch.ethz.sis.openbis.generic.dss.systemtest.api.v3;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
 import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
 import org.testng.annotations.Test;
 
 import ch.ethz.sis.openbis.generic.dss.api.v3.IDataStoreServerApi;
 import ch.ethz.sis.openbis.generic.dss.api.v3.dto.entity.datasetfile.DataSetFile;
 import ch.ethz.sis.openbis.generic.dss.api.v3.dto.search.FileSearchCriterion;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
-import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.datastoreserver.systemtests.SystemTestCase;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
@@ -38,9 +47,15 @@ public class SearchFileTest extends SystemTestCase
         String dataSetCode = UUID.randomUUID().toString().toUpperCase();
 
         File dataSetDir = new File(workingDirectory, dataSetCode);
-        dataSetDir.mkdirs();
-        FileUtilities.writeToFile(new File(dataSetDir, "file1.txt"), "hello world");
-        FileUtilities.writeToFile(new File(dataSetDir, "file2.txt"), "hello world");
+
+        Set<String> directories = new HashSet<>(Arrays.asList("subdir1", "subdir1/subdir2", "subdir3"));
+        createDirectories(dataSetDir, directories);
+
+        Set<String> files =
+                new HashSet<>(Arrays.asList("file1.txt", "file2.txt", "subdir1/file3.txt", "subdir1/file4.txt", "subdir1/subdir2/file5.txt",
+                        "subdir3/file6.txt"));
+        createFiles(dataSetDir, files);
+
         moveFileToIncoming(dataSetDir);
         waitUntilDataSetImported();
         waitUntilIndexUpdaterIsIdle();
@@ -53,7 +68,79 @@ public class SearchFileTest extends SystemTestCase
         sc.withDataSet().withPermId().thatEquals(dataSetCode);
 
         List<DataSetFile> searchFiles = dss.searchFiles(sessionToken, sc);
-        AssertionUtil.assertSize(searchFiles, 1);
+
+        files.addAll(directories);
+        assertThat(searchFiles, containsAll(files));
+        /* directory structure [dataset id]/original/[root folder] */
+        assertThat(searchFiles.size(), is(files.size() + 3));
+    }
+
+    private void createDirectories(File dataSetDir, Set<String> directories)
+    {
+        for (String dir : directories)
+        {
+            new File(dataSetDir, dir).mkdirs();
+        }
+    }
+
+    private void createFiles(File dataSetDir, Collection<String> paths)
+    {
+        for (String path : paths)
+        {
+            File f = new File(dataSetDir, path);
+            FileUtilities.writeToFile(f, "file content of " + f.getPath());
+        }
+    }
+
+    public static Matcher<Collection<DataSetFile>> containsAll(Collection<String> files)
+    {
+        return new CollectionContainsFilesMatcher(files);
+    }
+
+    public static class CollectionContainsFilesMatcher extends TypeSafeMatcher<Collection<DataSetFile>>
+    {
+
+        private final Collection<String> files;
+
+        public CollectionContainsFilesMatcher(Collection<String> files)
+        {
+            this.files = files;
+        }
+
+        @Override
+        public void describeTo(Description description)
+        {
+            description.appendText("A collection containing at least these elements:");
+            for (String file : files)
+            {
+                description.appendText(file + " ");
+            }
+        }
+
+        @Override
+        protected boolean matchesSafely(Collection<DataSetFile> elements)
+        {
+            for (String file : files)
+            {
+                if (fileInElements(file, elements) == false)
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        private boolean fileInElements(String file, Collection<DataSetFile> elements)
+        {
+            for (DataSetFile dsf : elements)
+            {
+                if (dsf.getFileName().endsWith(file))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
     }
 
-}
+}
\ No newline at end of file
-- 
GitLab