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() {