From 2f0f124898dfef0f7366fcd852cd71abb93dce25 Mon Sep 17 00:00:00 2001 From: jakubs <jakubs> Date: Wed, 3 Aug 2016 09:59:48 +0000 Subject: [PATCH] SSDM-3907: improve behavior for getting file streams SVN: 36868 --- .../ftp/v3/V3HierarchicalContentResolver.java | 2 +- .../server/ftp/v3/file/V3FtpFileResponse.java | 29 +++++++++++++++++-- .../ftp/v3/plugins/V3DataSetTypeResolver.java | 12 ++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3HierarchicalContentResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3HierarchicalContentResolver.java index b49e028a0f4..6073566ffab 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3HierarchicalContentResolver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3HierarchicalContentResolver.java @@ -48,7 +48,7 @@ class V3HierarchicalContentResolver implements V3Resolver if (false == rootNode.isDirectory()) { - return new V3FtpFileResponse(fullPath, rootNode); + return new V3FtpFileResponse(fullPath, rootNode, content); } V3FtpDirectoryResponse response = new V3FtpDirectoryResponse(fullPath); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/file/V3FtpFileResponse.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/file/V3FtpFileResponse.java index 227e94f6481..403bab96a87 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/file/V3FtpFileResponse.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/file/V3FtpFileResponse.java @@ -22,17 +22,22 @@ import java.util.List; import org.apache.ftpserver.ftplet.FtpFile; +import ch.systemsx.cisd.openbis.common.io.hierarchical_content.HierarchicalContentUtils; +import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContentNode; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.resolver.AbstractFtpFile; public class V3FtpFileResponse extends AbstractFtpFile implements V3FtpFile { - private IHierarchicalContentNode node; + private final IHierarchicalContentNode node; - public V3FtpFileResponse(String fullPath, final IHierarchicalContentNode node) + private final IHierarchicalContent content; + + public V3FtpFileResponse(String fullPath, final IHierarchicalContentNode node, final IHierarchicalContent content) { super(fullPath); this.node = node; + this.content = content; } @Override @@ -56,7 +61,25 @@ public class V3FtpFileResponse extends AbstractFtpFile implements V3FtpFile @Override public InputStream createInputStream(long offset) throws IOException { - return node.getInputStream(); + try + { + InputStream result = + HierarchicalContentUtils.getInputStreamAutoClosingContent(node, content); + + if (offset > 0) + { + result.skip(offset); + } + return result; + } catch (IOException ioex) + { + content.close(); + throw ioex; + } catch (RuntimeException re) + { + content.close(); + throw re; + } } @Override diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/plugins/V3DataSetTypeResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/plugins/V3DataSetTypeResolver.java index 8fe8d3acce5..6ed5b42377a 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/plugins/V3DataSetTypeResolver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/plugins/V3DataSetTypeResolver.java @@ -79,10 +79,10 @@ public class V3DataSetTypeResolver implements V3Resolver if (requestedFileName != null) { - IHierarchicalContentNode result = findRequestedNode(dataSetsToSearch, requestedFileName, context.getContentProvider()); + V3FtpFileResponse result = findRequestedNode(fullPath, dataSetsToSearch, requestedFileName, context.getContentProvider()); if (result != null) { - return new V3FtpFileResponse(fullPath, result); + return result; } else { return new V3FtpNonExistingFile(fullPath, "Unable to locate requested file"); @@ -123,16 +123,16 @@ public class V3DataSetTypeResolver implements V3Resolver return result; } - private IHierarchicalContentNode findRequestedNode(List<DataSet> dataSetsToSearch, String requestedFileName, + private V3FtpFileResponse findRequestedNode(String fullPath, List<DataSet> dataSetsToSearch, String requestedFileName, IHierarchicalContentProvider contentProvider) { for (DataSet dataSet : dataSetsToSearch) { IHierarchicalContent content = contentProvider.asContent(dataSet.getCode()); - IHierarchicalContentNode result = findRequestedNode(content.getRootNode(), requestedFileName); - if (result != null) + IHierarchicalContentNode node = findRequestedNode(content.getRootNode(), requestedFileName); + if (node != null) { - return result; + return new V3FtpFileResponse(fullPath, node, content); } } return null; -- GitLab