Claus Ibsen created CAMEL-25933:
-----------------------------------
Summary: camel-azure-storage-blob - getBlob writes the blob into a
File or GenericFile body, so after a file consumer it overwrites the file that
was consumed
Key: CAMEL-25933
URL: https://issues.apache.org/jira/browse/CAMEL-25933
Project: Camel
Issue Type: Bug
Components: camel-azure
Affects Versions: 4.18.0, 4.22.0, 4.23.0
Reporter: Claus Ibsen
Fix For: 4.24.0
The getBlob operation writes the blob into the body when the body converts to
an {{OutputStream}}, and gives a stream of the blob only when it does not
({{BlobOperations.getBlob}}, main 4065a7464c45, lines 105 and 111):
{code:java}
final OutputStream outputStream = ObjectHelper.isEmpty(message) ? null :
message.getBody(OutputStream.class);
...
if (outputStream == null) {
// Then we create an input stream
{code}
The documentation says it so for an OutputStream body: "Returns an InputStream,
or writes to an OutputStream if one is set in the body"
({{azure-storage-blob-operations.adoc}} line 85). But a {{java.io.File}} and a
{{java.nio.file.Path}} convert to an OutputStream too, as a new
{{FileOutputStream}} that empties the file
({{IOConverter.toOutputStream(File)}} and {{toOutputStream(Path)}}, lines 98
and 103), and so does the GenericFile of the file consumer, through the
fallback converter of camel-file. So a route that gets a blob when a file
arrives:
{code:yaml}
- route:
from:
uri: file:/tmp/blobtest?fileName=local.txt&noop=true
steps:
- to:
azure-storage-blob:devstoreaccount1/bodytypes?operation=getBlob&blobName=hello.txt
- log: "${body.getClass().getName()}"
{code}
replaces the content of {{/tmp/blobtest/local.txt}} with the blob, although the
consumer has {{noop=true}}, and the body after getBlob is a closed
{{java.io.BufferedOutputStream}} instead of the content. Checked against
Azurite on 4.24.0-SNAPSHOT: the file held "local file content" before the
route, and "Hello Camel", the content of the blob, after it.
The code is the same since 3.9.0 at least, when CAMEL-16321 moved the component
to camel-azure.
*Proposed change*: write into the body only when it is an {{OutputStream}}
({{instanceof}}), not when it converts to one, and give the stream of the blob
otherwise.
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)