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