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