This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new e19d5b8b277 CAMEL-21352: camel-smb - Add option to download file using 
streaming to avoid loading into memory.
e19d5b8b277 is described below

commit e19d5b8b277206e0af2a2f82ba8241714257b296
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jan 6 08:15:39 2025 +0100

    CAMEL-21352: camel-smb - Add option to download file using streaming to 
avoid loading into memory.
---
 .../org/apache/camel/catalog/components/smb.json   |  2 +-
 .../FtpStreamDownloadStreamCacheIT.java}           | 33 +++++++++-------------
 .../org/apache/camel/component/smb/smb.json        |  2 +-
 .../camel/component/smb/SmbConfiguration.java      |  7 +++--
 .../apache/camel/component/smb/SmbConsumer.java    |  3 +-
 .../org/apache/camel/component/smb/SmbFile.java    | 25 ++++++++++++++++
 .../apache/camel/component/smb/SmbOperations.java  | 32 ++++++++-------------
 ...wnloadIT.java => SmbStreamDownloadFalseIT.java} | 22 ++++++++-------
 .../camel/component/smb/SmbStreamDownloadIT.java   | 12 ++++++--
 ...IT.java => SmbStreamDownloadStreamCacheIT.java} | 15 ++++------
 10 files changed, 84 insertions(+), 69 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json
index 9fab33a3d63..c301a2dd548 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/smb.json
@@ -64,7 +64,7 @@
     "recursive": { "index": 12, "kind": "parameter", "displayName": 
"Recursive", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If a directory, 
will look for files in all the sub-directories as well." },
     "searchPattern": { "index": 13, "kind": "parameter", "displayName": 
"Search Pattern", "group": "consumer", "label": "consumer", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.smb.SmbConfiguration", "configurationField": 
"configuration", "description": "The search pattern used to list the files 
(server side on SMB). This parameter can contain the name of a  [...]
     "sendEmptyMessageWhenIdle": { "index": 14, "kind": "parameter", 
"displayName": "Send Empty Message When Idle", "group": "consumer", "label": 
"consumer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If the polling consumer did not poll any files, you can 
enable this option to send an empty message (no body) instead." },
-    "streamDownload": { "index": 15, "kind": "parameter", "displayName": 
"Stream Download", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.smb.SmbConfiguration", "configurationField": 
"configuration", "description": "Sets the download method to use when not using 
a local working directory. If set to true [...]
+    "streamDownload": { "index": 15, "kind": "parameter", "displayName": 
"Stream Download", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", 
"configurationField": "configuration", "description": "Sets the download method 
to use when not using a local working di [...]
     "bridgeErrorHandler": { "index": 16, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming [...]
     "exceptionHandler": { "index": 17, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 18, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
diff --git 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
 
b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/integration/FtpStreamDownloadStreamCacheIT.java
similarity index 64%
copy from 
components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
copy to 
components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/integration/FtpStreamDownloadStreamCacheIT.java
index 6f1130df33c..0512eaa13f5 100644
--- 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
+++ 
b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/integration/FtpStreamDownloadStreamCacheIT.java
@@ -14,51 +14,46 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.smb;
-
-import java.io.InputStream;
+package org.apache.camel.component.file.remote.integration;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.StreamCache;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertNotNull;
+public class FtpStreamDownloadStreamCacheIT extends FtpServerTestSupport {
 
-public class SmbStreamDownloadIT extends SmbServerTestSupport {
+    private String getFtpUrl() {
+        return 
"ftp://localhost:{{ftp.server.port}}/stream?username=admin&password=admin&stepwise=false&streamDownload=true";;
+    }
 
     @Override
     public void doPostSetup() throws Exception {
-        prepareSmbServer();
+        prepareFtpServer();
     }
 
-    protected String getSmbUrl() {
-        return String.format(
-                
"smb:%s/%s?username=%s&password=%s&path=/uploadstream&streamDownload=true",
-                service.address(), service.shareName(), service.userName(), 
service.password());
+    private void prepareFtpServer() {
+        template.sendBodyAndHeader(getFtpUrl(), "World", Exchange.FILE_NAME,
+                "world.txt");
     }
 
     @Test
     public void testStreamDownload() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:received_send");
-        mock.message(0).body().isInstanceOf(InputStream.class);
+        mock.message(0).body().isInstanceOf(StreamCache.class);
         mock.expectedMessageCount(1);
+        mock.expectedBodiesReceived("World");
 
         mock.assertIsSatisfied();
-
-        InputStream is = 
mock.getExchanges().get(0).getIn().getBody(InputStream.class);
-        assertNotNull(is);
-    }
-
-    private void prepareSmbServer() {
-        template.sendBodyAndHeader(getSmbUrl(), "World", Exchange.FILE_NAME, 
"world.txt");
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
+            @Override
             public void configure() {
-                from(getSmbUrl())
+                from(getFtpUrl())
                         .to("mock:received_send");
             }
         };
diff --git 
a/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json
 
b/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json
index 9fab33a3d63..c301a2dd548 100644
--- 
a/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json
+++ 
b/components/camel-smb/src/generated/resources/META-INF/org/apache/camel/component/smb/smb.json
@@ -64,7 +64,7 @@
     "recursive": { "index": 12, "kind": "parameter", "displayName": 
"Recursive", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If a directory, 
will look for files in all the sub-directories as well." },
     "searchPattern": { "index": 13, "kind": "parameter", "displayName": 
"Search Pattern", "group": "consumer", "label": "consumer", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.smb.SmbConfiguration", "configurationField": 
"configuration", "description": "The search pattern used to list the files 
(server side on SMB). This parameter can contain the name of a  [...]
     "sendEmptyMessageWhenIdle": { "index": 14, "kind": "parameter", 
"displayName": "Send Empty Message When Idle", "group": "consumer", "label": 
"consumer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If the polling consumer did not poll any files, you can 
enable this option to send an empty message (no body) instead." },
-    "streamDownload": { "index": 15, "kind": "parameter", "displayName": 
"Stream Download", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.smb.SmbConfiguration", "configurationField": 
"configuration", "description": "Sets the download method to use when not using 
a local working directory. If set to true [...]
+    "streamDownload": { "index": 15, "kind": "parameter", "displayName": 
"Stream Download", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": "org.apache.camel.component.smb.SmbConfiguration", 
"configurationField": "configuration", "description": "Sets the download method 
to use when not using a local working di [...]
     "bridgeErrorHandler": { "index": 16, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming [...]
     "exceptionHandler": { "index": 17, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 18, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
diff --git 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java
 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java
index 858172880f7..158814bfd6e 100644
--- 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java
+++ 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConfiguration.java
@@ -55,9 +55,10 @@ public class SmbConfiguration extends 
GenericFileConfiguration {
                             + " For example, the criterion x?? matches xab, 
xa, and x, but not xabc. If only ? characters are present in the file name 
selection criterion, then the match is made as if the criterion contained ? 
characters trailing a literal."
                             + " The * (asterisk) character matches an entire 
file name. A null or empty specification criterion also selects all file names. 
For example, *.abc or .abc match any file with an extension of abc. *.*, *, or 
empty string match all files in a directory.")
     private String searchPattern;
-    @UriParam(label = "consumer", description = "Sets the download method to 
use when not using a local working "
-                                                + "directory.  If set to true, 
the remote files are streamed to the route as they are read.  When set to "
-                                                + "false, the remote files are 
loaded into memory before being sent into the route.")
+    @UriParam(label = "consumer", description = "Sets the download method to 
use when not using a local working directory."
+                                                + " If set to true, the remote 
files are streamed to the route as they are read. When set to"
+                                                + " false, the remote files 
are loaded into memory before being sent into the route.")
+    @Metadata
     private boolean streamDownload;
     @Metadata(defaultValue = "2048")
     @UriParam(label = "producer", description = "Read buffer size when for 
file being produced", defaultValue = "2048")
diff --git 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConsumer.java
 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConsumer.java
index 638a13b5e67..0701490b3ad 100644
--- 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConsumer.java
+++ 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbConsumer.java
@@ -63,7 +63,6 @@ public class SmbConsumer extends 
GenericFileConsumer<FileIdBothDirectoryInformat
 
     @Override
     protected boolean pollDirectory(String path, 
List<GenericFile<FileIdBothDirectoryInformation>> fileList, int depth) {
-
         depth++;
         path = (path == null) ? "" : path;
         FileIdBothDirectoryInformation[] files = getSmbFiles(path);
@@ -191,7 +190,7 @@ public class SmbConsumer extends 
GenericFileConsumer<FileIdBothDirectoryInformat
     }
 
     private SmbFile asGenericFile(String path, FileIdBothDirectoryInformation 
file, String charset) {
-        SmbFile genericFile = new SmbFile();
+        SmbFile genericFile = new SmbFile(getOperations(), 
configuration.isStreamDownload());
         genericFile.setHostname(configuration.getHostname());
         genericFile.setFile(file);
         genericFile.setEndpointPath(endpointPath);
diff --git 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbFile.java
 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbFile.java
index c0db5c99f01..c174cd511cb 100644
--- 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbFile.java
+++ 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbFile.java
@@ -17,13 +17,28 @@
 package org.apache.camel.component.smb;
 
 import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation;
+import org.apache.camel.Exchange;
 import org.apache.camel.component.file.GenericFile;
 import org.apache.camel.component.file.GenericFileMessage;
 
 public class SmbFile extends GenericFile<FileIdBothDirectoryInformation> {
 
+    private final SmbOperations operations;
+    private final boolean streamDownload;
+    private Exchange exchange;
     private String hostname;
 
+    public SmbFile(SmbOperations operations, boolean streamDownload) {
+        this.operations = operations;
+        this.streamDownload = streamDownload;
+    }
+
+    @Override
+    public void bindToExchange(Exchange exchange) {
+        this.exchange = exchange;
+        super.bindToExchange(exchange);
+    }
+
     /**
      * Populates the {@link GenericFileMessage} relevant headers
      *
@@ -67,6 +82,16 @@ public class SmbFile extends 
GenericFile<FileIdBothDirectoryInformation> {
         remoteResult.setHostname(remoteSource.getHostname());
     }
 
+    @Override
+    public Object getBody() {
+        if (streamDownload) {
+            return operations.getBodyAsInputStream(exchange, 
this.getAbsoluteFilePath());
+        } else {
+            // use operations so smb file can be closed
+            return operations.getBody(this.getAbsoluteFilePath());
+        }
+    }
+
     @Override
     public String toString() {
         return "SmbFile[" + (isAbsolute() ? getAbsoluteFilePath() : 
getRelativeFilePath()) + "]";
diff --git 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java
 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java
index ef8a031138e..934e10a1340 100644
--- 
a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java
+++ 
b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java
@@ -66,7 +66,7 @@ public class SmbOperations implements SmbFileOperations {
 
     public SmbOperations(SmbConfiguration configuration) {
         this.configuration = configuration;
-        smbClient = new SMBClient();
+        this.smbClient = new SMBClient();
     }
 
     @Override
@@ -143,7 +143,7 @@ public class SmbOperations implements SmbFileOperations {
 
     @Override
     public GenericFile<FileIdBothDirectoryInformation> newGenericFile() {
-        return new SmbFile();
+        return new SmbFile(this, configuration.isStreamDownload());
     }
 
     @Override
@@ -331,7 +331,6 @@ public class SmbOperations implements SmbFileOperations {
     }
 
     private boolean doStoreFile(String name, Exchange exchange) throws 
GenericFileOperationFailedException {
-
         LOG.trace("doStoreFile({})", name);
 
         // for backwards compatibility for existing smb that uses a header to 
control 'file-exist'
@@ -341,18 +340,14 @@ public class SmbOperations implements SmbFileOperations {
         }
 
         boolean existFile = false;
-
         // if an existing file already exists what should we do?
         if (gfe == GenericFileExist.Ignore || gfe == GenericFileExist.Fail
                 || gfe == GenericFileExist.Move || gfe == 
GenericFileExist.Append
                 || gfe == GenericFileExist.Override) {
-
             existFile = share.fileExists(name);
-
             if (existFile && gfe == GenericFileExist.Ignore) {
                 // ignore but indicate that the file was written
                 LOG.trace("An existing file already exists: {}. Ignore and do 
not override it.", name);
-
                 return true;
             } else if (existFile && gfe == GenericFileExist.Fail) {
                 throw new GenericFileOperationFailedException("File already 
exist: " + name + ". Cannot write new file.");
@@ -380,7 +375,6 @@ public class SmbOperations implements SmbFileOperations {
                     // charset configured so we must convert to the desired
                     // charset so we can write with encoding
                     is = new 
ByteArrayInputStream(exchange.getIn().getMandatoryBody(String.class).getBytes(charset));
-
                     LOG.trace("Using InputStream {} with charset {}.", is, 
charset);
                 } else {
                     is = exchange.getIn().getMandatoryBody(InputStream.class);
@@ -391,38 +385,27 @@ public class SmbOperations implements SmbFileOperations {
             boolean answer;
             LOG.debug("About to store file: {} using stream: {}", name, is);
             if (existFile && gfe == GenericFileExist.Append) {
-
                 LOG.trace("Client appendFile: {}", name);
-
                 try (File shareFile = share.openFile(name, 
EnumSet.of(AccessMask.FILE_WRITE_DATA),
                         EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL),
                         SMB2ShareAccess.ALL, 
SMB2CreateDisposition.FILE_OPEN_IF,
                         EnumSet.of(SMB2CreateOptions.FILE_DIRECTORY_FILE))) {
-
                     writeToFile(name, shareFile, is);
                 }
-
             } else if (existFile && gfe == GenericFileExist.Override) {
-
                 try (File shareFile = share.openFile(name, 
EnumSet.of(AccessMask.FILE_WRITE_DATA),
                         EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL),
                         SMB2ShareAccess.ALL, 
SMB2CreateDisposition.FILE_OVERWRITE_IF,
                         EnumSet.of(SMB2CreateOptions.FILE_DIRECTORY_FILE))) {
-
                     writeToFile(name, shareFile, is);
                 }
-
             } else {
-
                 LOG.trace("Client storeFile: {}", name);
-
                 createDirectory(share, name);
-
                 try (File shareFile = share.openFile(name, 
EnumSet.of(AccessMask.FILE_WRITE_DATA),
                         EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL),
                         SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_CREATE,
                         EnumSet.of(SMB2CreateOptions.FILE_DIRECTORY_FILE))) {
-
                     writeToFile(name, shareFile, is);
                 }
             }
@@ -444,9 +427,7 @@ public class SmbOperations implements SmbFileOperations {
     }
 
     public void createDirectory(DiskShare share, String fileName) {
-
         String parentDir = FileUtil.onlyPath(fileName);
-
         boolean dirExists = share.folderExists(parentDir);
         if (!dirExists) {
             if (endpoint.isAutoCreate()) {
@@ -524,6 +505,15 @@ public class SmbOperations implements SmbFileOperations {
         }
     }
 
+    public InputStream getBodyAsInputStream(Exchange exchange, String path) {
+        connectIfNecessary();
+        File shareFile = share.openFile(path, 
EnumSet.of(AccessMask.GENERIC_READ), null,
+                SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);
+        InputStream is = shareFile.getInputStream();
+        exchange.getIn().setHeader(SmbComponent.SMB_FILE_INPUT_STREAM, is);
+        return is;
+    }
+
     /*
      * Normalize changes separators for smb
      */
diff --git 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
 
b/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadFalseIT.java
similarity index 74%
copy from 
components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
copy to 
components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadFalseIT.java
index 6f1130df33c..7686e3c080a 100644
--- 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
+++ 
b/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadFalseIT.java
@@ -16,16 +16,14 @@
  */
 package org.apache.camel.component.smb;
 
-import java.io.InputStream;
-
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 
-public class SmbStreamDownloadIT extends SmbServerTestSupport {
+public class SmbStreamDownloadFalseIT extends SmbServerTestSupport {
 
     @Override
     public void doPostSetup() throws Exception {
@@ -34,20 +32,24 @@ public class SmbStreamDownloadIT extends 
SmbServerTestSupport {
 
     protected String getSmbUrl() {
         return String.format(
-                
"smb:%s/%s?username=%s&password=%s&path=/uploadstream&streamDownload=true",
+                
"smb:%s/%s?username=%s&password=%s&path=/uploadstream2&streamDownload=false",
                 service.address(), service.shareName(), service.userName(), 
service.password());
     }
 
     @Test
-    public void testStreamDownload() throws Exception {
+    public void testStreamDownloadFalse() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:received_send");
-        mock.message(0).body().isInstanceOf(InputStream.class);
+        mock.message(0).body().isInstanceOf(SmbFile.class);
+        mock.message(0).predicate(e -> {
+            Object b = e.getMessage().getBody(SmbFile.class).getBody();
+            return b.getClass().isArray();
+        });
         mock.expectedMessageCount(1);
 
         mock.assertIsSatisfied();
 
-        InputStream is = 
mock.getExchanges().get(0).getIn().getBody(InputStream.class);
-        assertNotNull(is);
+        byte[] arr = mock.getExchanges().get(0).getIn().getBody(byte[].class);
+        assertArrayEquals("World".getBytes(), arr);
     }
 
     private void prepareSmbServer() {
@@ -58,7 +60,7 @@ public class SmbStreamDownloadIT extends SmbServerTestSupport 
{
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from(getSmbUrl())
+                from(getSmbUrl()).streamCache("false")
                         .to("mock:received_send");
             }
         };
diff --git 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
 
b/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
index 6f1130df33c..809d5d19986 100644
--- 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
+++ 
b/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
@@ -21,6 +21,8 @@ import java.io.InputStream;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.util.IOHelper;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -41,13 +43,19 @@ public class SmbStreamDownloadIT extends 
SmbServerTestSupport {
     @Test
     public void testStreamDownload() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:received_send");
-        mock.message(0).body().isInstanceOf(InputStream.class);
+        mock.message(0).body().isInstanceOf(SmbFile.class);
+        mock.message(0).predicate(e -> {
+            Object b = e.getMessage().getBody(SmbFile.class).getBody();
+            return b instanceof InputStream;
+        });
         mock.expectedMessageCount(1);
 
         mock.assertIsSatisfied();
 
         InputStream is = 
mock.getExchanges().get(0).getIn().getBody(InputStream.class);
         assertNotNull(is);
+        String text = IOHelper.loadText(is);
+        Assertions.assertEquals("World\n", text);
     }
 
     private void prepareSmbServer() {
@@ -58,7 +66,7 @@ public class SmbStreamDownloadIT extends SmbServerTestSupport 
{
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from(getSmbUrl())
+                from(getSmbUrl()).streamCache("false")
                         .to("mock:received_send");
             }
         };
diff --git 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
 
b/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadStreamCacheIT.java
similarity index 84%
copy from 
components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
copy to 
components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadStreamCacheIT.java
index 6f1130df33c..d437167cbde 100644
--- 
a/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadIT.java
+++ 
b/components/camel-smb/src/test/java/org/apache/camel/component/smb/SmbStreamDownloadStreamCacheIT.java
@@ -16,16 +16,13 @@
  */
 package org.apache.camel.component.smb;
 
-import java.io.InputStream;
-
 import org.apache.camel.Exchange;
+import org.apache.camel.StreamCache;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-public class SmbStreamDownloadIT extends SmbServerTestSupport {
+public class SmbStreamDownloadStreamCacheIT extends SmbServerTestSupport {
 
     @Override
     public void doPostSetup() throws Exception {
@@ -34,20 +31,18 @@ public class SmbStreamDownloadIT extends 
SmbServerTestSupport {
 
     protected String getSmbUrl() {
         return String.format(
-                
"smb:%s/%s?username=%s&password=%s&path=/uploadstream&streamDownload=true",
+                
"smb:%s/%s?username=%s&password=%s&path=/uploadstream3&streamDownload=true",
                 service.address(), service.shareName(), service.userName(), 
service.password());
     }
 
     @Test
     public void testStreamDownload() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:received_send");
-        mock.message(0).body().isInstanceOf(InputStream.class);
+        mock.message(0).body().isInstanceOf(StreamCache.class);
         mock.expectedMessageCount(1);
+        mock.expectedBodiesReceived("World");
 
         mock.assertIsSatisfied();
-
-        InputStream is = 
mock.getExchanges().get(0).getIn().getBody(InputStream.class);
-        assertNotNull(is);
     }
 
     private void prepareSmbServer() {

Reply via email to