camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Claus Ibsen <claus.ib...@gmail.com>
Subject Re: Bean component/Bean Binding: Body as InputStream parametr (specified as ${body} in route)
Date Tue, 01 Oct 2013 19:35:58 GMT
Hi

Yeah sounds like a bug. Do you mind logging a JIRA ticket?

On Tue, Oct 1, 2013 at 11:25 AM,  <radek_kraus@centrum.cz> wrote:
> Hello,
> I am playing with "bean binding" on bean component. I know, that I can solve my requirements
by another way.
> But anyway I think, that my "syntetic" example doesn't work how I expect (I tested it
with Camel 2.11.2, 2.12.1).
>
> I have a "streamBodyBindingBean" bean with this method:
>
> public void bodyBinding(InputStream in) throws IOException {
>   int byteCount = 0;
>   int c;
>   while((c = in.read()) != -1)
>     byteCount++;
>   System.out.println("ByteCount: " + byteCount);
> }
>
> And this route:
>
> <route id="" trace="true">
>   <from uri="direct://body-input-stream-binding-in"/>
>   <to uri="bean://streamBodyBindingBean?method=bodyBinding(${body})"/>
>   <!-- to uri="bean://isBodyBindingBean"/-->
>   <to uri="mock://body-input-stream-binding-out"/>
> </route>
>
> Here is a way how I send exchange from test stuff:
>
> ByteArrayInputStream in = new ByteArrayInputStream(
>   "Small body, which I want to bind as InputStream".getBytes("UTF-8")
> );
> Exchange exchange = createExchangeWithBody(in);
> exchange.getIn().setHeader("testHeader", "testHeader");
> exchange.setPattern(ExchangePattern.InOnly);
> template.send("direct://body-input-stream-binding-in", exchange);
>
> In this case I got a sysout message: "ByteCount: 0".
> When I used the commented variant in route, I got expected result: "ByteCount: 47", 
=> is it an ${body} evaluation problem?
>
> I think that the reason is MethodInfo class, line 526 (with strange comment for me):
>
> // the parameter value was not already valid, but since the simple language have evaluated
the expression
> // which may change the parameterValue, so we have to check it again to see if its now
valid
> exp = exchange.getContext().getTypeConverter().convertTo(String.class, parameterValue);
> // String values from the simple language is always valid
> if (!valid) {
>   ...
> }
>
> The line after "strange" comment caused that my "InputStream" is transformed into String
(what can be a problem in case of "big" InputStream).
> The question is, why this line isn't in "if(!valid)" block? I am unable to decide, if
it is a problem, which should be reported to JIRA or
> I only don't understand how bean binding should work or if I have only "stupid/incorrect"
example.
>
> This i a reason, why I ask first here.
>
> Thank you for any feedback.
> Radek Kraus.



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen

Mime
View raw message