[
https://issues.apache.org/activemq/browse/CAMEL-2551?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=58246#action_58246
]
Sergey Zolotaryov commented on CAMEL-2551:
------------------------------------------
Current workaround we have to use is the following:
\\
{code}
InputStream is = ....
final InputStream camelBugWorkaround = new InputStream()
{
@Override
public int read(final byte[] b, int off, int len) throws IOException
{
final int expectedMaxBytes = len;
int read = 0;
int totalRead = 0;
while ((read = is.read(b, off, len)) != -1)
{
if (read < len)
{
off += read;
len -= read;
}
totalRead += read;
if (totalRead == expectedMaxBytes)
{
break;
}
}
return totalRead == 0 ? -1 : totalRead;
}
@Override
public int read() throws IOException
{
return is.read();
}
@Override
public void close() throws IOException
{
is.close();
}
@Override
public int available() throws IOException
{
return is.available();
}
@Override
public long skip(final long n) throws IOException
{
return is.skip(n);
}
};
exchange.getOut().setBody(camelBugWorkaround);
{code}
Where _is_ is the PipedInputStream.
> File component does not correctly handle PipedInputStream in message body.
> --------------------------------------------------------------------------
>
> Key: CAMEL-2551
> URL: https://issues.apache.org/activemq/browse/CAMEL-2551
> Project: Apache Camel
> Issue Type: Bug
> Components: camel-core
> Affects Versions: 2.2.0
> Environment: does not matter
> Reporter: Sergey Zolotaryov
> Attachments: patch.txt
>
>
> Streams that do not have their contents length at immediate disposal, like
> PipedInputStream, are not processed correctly by the file component.
> \\
> {code}
> private void writeFileByStream(InputStream in, File target) throws
> IOException {
> FileChannel out = null;
> try {
> out = prepareOutputFileChannel(target, out);
> if (LOG.isTraceEnabled()) {
> LOG.trace("Using InputStream to transfer from: " + in + " to:
> " + out);
> }
> int size = endpoint.getBufferSize();
> byte[] buffer = new byte[size];
> ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
> while (true) {
> int count = in.read(buffer);
> if (count <= 0) {
> break;
> } else if (count < size) {
> byteBuffer = ByteBuffer.wrap(buffer, 0, count);
> out.write(byteBuffer);
> break;
> } else {
> out.write(byteBuffer);
> byteBuffer.clear();
> }
> }
> } finally {
> ObjectHelper.close(in, target.getName(), LOG);
> ObjectHelper.close(out, target.getName(), LOG);
> }
> }
> {code}
> The code
> {code}
> } else if (count < size) {
> byteBuffer = ByteBuffer.wrap(buffer, 0, count);
> out.write(byteBuffer);
> break;
> } else {
> {code}
> does not take into account that bytes read can be less than the size of the
> buffer passed into the InputStream.read method and stream can still have more
> content. The only indication that EOF was reached is -1 returned from the
> read method according to Java API.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.