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)

Reply via email to