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 3d6c5a638abb4709d692378cdc312fd83ce16046..5bfe66460d9e612d34f950dbd953c90bd7b3c305 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 @@ -215,6 +215,13 @@ class PathInfoProviderBasedHierarchicalContent implements IHierarchicalContent return true; } + @Override + protected boolean isPhysicalFile() + { + File file = doGetFile(); + return file.isFile(); + } + @Override public boolean isDirectory() { diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContentTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContentTest.java index 9e3a22af7324a56ce050043716b08bf8b891fb64..abaf141fe90f1e81bd0bca536da181b78d7b39dd 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContentTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/PathInfoProviderBasedHierarchicalContentTest.java @@ -21,6 +21,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.jmock.Expectations; import org.jmock.Mockery; import org.testng.annotations.AfterMethod; @@ -46,7 +48,9 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo; */ public class PathInfoProviderBasedHierarchicalContentTest extends AbstractFileSystemTestCase { - + private static final File TEST_HDF5_EXAMPLE = new File( + "../openbis-common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5"); + private File rootDir; private File file1; @@ -73,6 +77,8 @@ public class PathInfoProviderBasedHierarchicalContentTest extends AbstractFileSy private IDelegatedAction onCloseAction; + private File hdf5Example; + @BeforeMethod public void beforeMethod() throws Exception { @@ -86,6 +92,8 @@ public class PathInfoProviderBasedHierarchicalContentTest extends AbstractFileSy file2 = new File(rootDir, "file2"); subDir = new File(rootDir, "subDir"); + hdf5Example = new File(subDir, "my-hdf5.h5"); + FileUtils.copyFile(TEST_HDF5_EXAMPLE, hdf5Example); subDir.mkdirs(); subFile1 = new File(subDir, "subFile1"); subFile2 = new File(subDir, "subFile2"); @@ -349,17 +357,21 @@ public class PathInfoProviderBasedHierarchicalContentTest extends AbstractFileSy will(returnValue(Arrays.asList(createDummyFileBasedPath(rootDir, subFile1, 1), createDummyFileBasedPath(rootDir, subFile2, null), createDummyFileBasedPath(rootDir, subFile3, 3), - createDummyFileBasedPath(rootDir, subSubFile, 4)))); + createDummyFileBasedPath(rootDir, subSubFile, 4), + createDummyHDF5FileBasedPath(rootDir, hdf5Example)))); } }); List<IHierarchicalContentNode> matchingNodes = rootContent.listMatchingNodes(startingPath, pattern); - assertEquals(4, matchingNodes.size()); + assertEquals(5, matchingNodes.size()); sortNodes(matchingNodes); - checkNodeMatchesFile(matchingNodes.get(0), subFile1, 1); - checkNodeMatchesFile(matchingNodes.get(1), subFile2, -2056143706); - checkNodeMatchesFile(matchingNodes.get(2), subFile3, 3); - checkNodeMatchesFile(matchingNodes.get(3), subSubFile, 4); + checkNodeMatchesFile(matchingNodes.get(0), hdf5Example, 0); + assertEquals(537641, matchingNodes.get(0).getFileLength()); + assertEquals(-2098219814, matchingNodes.get(0).getChecksumCRC32()); + checkNodeMatchesFile(matchingNodes.get(1), subFile1, 1); + checkNodeMatchesFile(matchingNodes.get(2), subFile2, -2056143706); + checkNodeMatchesFile(matchingNodes.get(3), subFile3, 3); + checkNodeMatchesFile(matchingNodes.get(4), subSubFile, 4); context.assertIsSatisfied(); } @@ -409,5 +421,16 @@ public class PathInfoProviderBasedHierarchicalContentTest extends AbstractFileSy } return result; } + + private static DataSetPathInfo createDummyHDF5FileBasedPath(final File root, final File file) + { + DataSetPathInfo result = new DataSetPathInfo(); + result.setFileName(file.getName()); + result.setDirectory(true); + result.setRelativePath(FileUtilities.getRelativeFilePath(root, file)); + result.setSizeInBytes(file.length()); + return result; + } + } diff --git a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNode.java b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNode.java index 8120b67962d653761523a171934ea9463e95c7d8..760028f0a785ad0c389db020ac90c22b9e33e9c2 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNode.java +++ b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNode.java @@ -33,10 +33,10 @@ import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchical public abstract class AbstractHierarchicalContentNode implements IHierarchicalContentNode { static final String OPERATION_NOT_SUPPORTED_FOR_A_DIRECTORY = - "Operation not supported for a directory"; + "Operation not supported for a directory: "; static final String OPERATION_SUPPORTED_ONLY_FOR_A_DIRECTORY = - "Operation supported only for a directory"; + "Operation supported only for a directory: "; /** Returns relative path of this node or <code>null</code> for root node. */ abstract protected String doGetRelativePath(); @@ -72,15 +72,20 @@ public abstract class AbstractHierarchicalContentNode implements IHierarchicalCo { if (isDirectory() == false) { - throw new UnsupportedOperationException(OPERATION_SUPPORTED_ONLY_FOR_A_DIRECTORY); + throw new UnsupportedOperationException(OPERATION_SUPPORTED_ONLY_FOR_A_DIRECTORY + getRelativePath()); } } - private final void failOnDirectory() + protected boolean isPhysicalFile() { - if (isDirectory()) + return isDirectory() == false; + } + + private final void requirePhysicalFile() + { + if (isDirectory() && isPhysicalFile() == false) { - throw new UnsupportedOperationException(OPERATION_NOT_SUPPORTED_FOR_A_DIRECTORY); + throw new UnsupportedOperationException(OPERATION_NOT_SUPPORTED_FOR_A_DIRECTORY + getRelativePath()); } } @@ -94,28 +99,28 @@ public abstract class AbstractHierarchicalContentNode implements IHierarchicalCo @Override public final long getFileLength() throws UnsupportedOperationException { - failOnDirectory(); + requirePhysicalFile(); return doGetFileLength(); } @Override public int getChecksumCRC32() throws UnsupportedOperationException { - failOnDirectory(); + requirePhysicalFile(); return doGetChecksumCRC32(); } @Override public final IRandomAccessFile getFileContent() { - failOnDirectory(); + requirePhysicalFile(); return doGetFileContent(); } @Override public final InputStream getInputStream() { - failOnDirectory(); + requirePhysicalFile(); return doGetInputStream(); } diff --git a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java index b802d434446a911a3e2a35b7d7750fc3bb79e327..8cee9c9cb184c1683e19734b80b6f9463e805f41 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java +++ b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java @@ -63,6 +63,12 @@ public class HDF5ContainerBasedHierarchicalContentNode extends return true; // always a directory } + @Override + protected boolean isPhysicalFile() + { + return true; + } + @Override public List<IHierarchicalContentNode> doGetChildNodes() { diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java index dd545076e6e29ef12b098a945d62fd08cda12251..55ed93b3a802eece8db779b0a2d813ef94103f91 100644 --- a/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java +++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java @@ -149,7 +149,7 @@ public class AbstractHierarchicalContentNodeTest extends AssertJUnit @Override public String doGetRelativePath() { - return null; + return ""; } @Override @@ -234,7 +234,7 @@ public class AbstractHierarchicalContentNodeTest extends AssertJUnit @Override public String doGetRelativePath() { - return null; + return ""; } @Override diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java index 4cb857221b184fee68541748368003f78b660728..3cf435cb367d5d65c1cf5818fc742916d22611f4 100644 --- a/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java +++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/openbis/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java @@ -62,6 +62,8 @@ public class HDF5ContainerBasedHierarchicalContentNodeTest extends AssertJUnit "f8d4cfc7 26367 PLATE1_A01_06_Cy3.png\n" + "aeb12b1a 25086 PLATE1_A01_06_DAPI.png\n" + "ced4332a 22199 PLATE1_A01_06_GFP.png", getNamesChecksumsAndSizes(nodes)); + assertEquals(537641, node.getFileLength()); + assertEquals(-2098219814, node.getChecksumCRC32()); } @Test