Hi Claus and all,

I struggled to better write the previous route, I've come to this final
solution.
It seem to me ok

Thank you for the support ;-)

Cristiano


<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring
">
<proxy id="myServiceProxy" serviceInterface="org.example.MyService"
serviceUrl="direct:entry" />

<route>
<from uri="direct:entry" />
<choice>
 <when>
<simple>${body} is not
'org.apache.camel.component.bean.BeanInvocation'</simple>
 <throwException ref="unsupportedException" />
</when>
 <when>
<simple>${body?.method?.name} == 'myMethod1'</simple>
 <to uri="log:endoint_1?showAll=true" />
</when>
<when>
 <simple>${body?.method?.name} == 'myMethod2'</simple>
<to uri="log:endoint_2?showAll=true" />
 </when>
<otherwise>
<throwException ref="unsupportedException" />
 </otherwise>
</choice>
</route>
</camelContext>






2013/7/11 Cristiano Costantini <cristiano.costant...@gmail.com>

> Hi Claus,
> thanks again,
>
> yes I understand the problem, and I agree that the Simple language should
> be simple !
>
> While for my specific case, I've found that it exists an "is" operator in
> simple language to test instanceof :
> ${in.header.type} is 'java.lang.String'
>
> I can use it to check if the body is an instance of BeanInvocation, then
> use the ?. operator, else route the message somewhere else.
>
> For example I can change the original XML route in this way (it is a bit
> verbose but I hope it should work):
>
> <camelContext id="camelContext" xmlns="
> http://camel.apache.org/schema/spring";>
>  <proxy id="myServiceProxy" serviceInterface="org.example.MyService"
> serviceUrl="direct:step1" />
>
> <route>
> <from uri="direct:step1" />
> <choice>
>  <when>
> <simple>${body} is
> 'org.apache.camel.component.bean.BeanInvocation'</simple>
>  <to uri="direct:step2" />
> </when>
> <otherwise>
>  <throwException ref="unsupportedException" />
> </otherwise>
> </choice>
>  </route>
>
> <route>
> <from uri="direct:step2" />
>  <setHeader headerName="methodName">
> <simple>${body?.method?.name}</simple>
>  </setHeader>
> <choice>
> <when>
>  <simple>${header.methodName} == 'myMethod1'</simple>
> <to uri="log:endoint_1?showAll=true" />
>  </when>
> <when>
> <simple>${header.methodName} == 'myMethod2'</simple>
>  <to uri="log:endoint_2?showAll=true" />
> </when>
> <otherwise>
>  <throwException ref="unsupportedException" />
> </otherwise>
> </choice>
>  </route>
> </camelContext>
>
>
> Please note that I've not tested yet the above route!!
> And again, any improvement is welcome. ;-)
>
> Cristiano
>
>
>
>
>
>
>
>
>
>
> 2013/7/11 Claus Ibsen <claus.ib...@gmail.com>
>
>> Hi
>>
>> Ah yeah the null safe doesn't apply for methods not found.
>> I am not sure if this is a good idea to add support for that. As if
>> you have a typo in the method name, then the null safe will ignore
>> that also.
>>
>> And adding more stuff to the syntax would just confuse even more, eg
>>
>> For example with a double ?? to indicate ignore method not found.
>>
>> ${body??.method??.name}
>>
>> The ? is null safe, so its if the getMethod returns null, then break
>> out of the OGNL path.
>>
>>
>>
>>
>>
>> On Wed, Jul 10, 2013 at 7:01 PM, Cristiano Costantini
>> <cristiano.costant...@gmail.com> wrote:
>> > mmmm,
>> > I would need exactly that, but I've tested sending a string with a
>> producer
>> > template and I got this error:
>> >
>> > Failed to invoke method: ?.method?.name on null due to:
>> > org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to
>> > invoke method: method on null due to:
>> > org.apache.camel.component.bean.MethodNotFoundException: Method with
>> name:
>> > method not found on bean: Hello World! of type: java.lang.String.
>> > Exchange[Message: Hello World!]
>> >
>> > caused by
>> >
>> > Failed to invoke method: method on null due to:
>> > org.apache.camel.component.bean.MethodNotFoundException: Method with
>> name:
>> > method not found on bean: Hello World! of type: java.lang.String.
>> > Exchange[Message: Hello World!]
>> >
>> >
>> > again caused by
>> >
>> >
>> > Method with name: method not found on bean: Hello World! of type:
>> > java.lang.String. Exchange[Message: Hello World!]
>> >
>> >
>> > I'm using camel 2.10.4...
>> > Any suggestion?
>> >
>> > Thanks,
>> > Cristiano
>> >
>> >
>> >
>> >
>> >
>> >
>> > 2013/7/10 Claus Ibsen <claus.ib...@gmail.com>
>> >
>> >> There is a ? operator, so you can do
>> >>
>> >> <simple>${body?.method?.name</simple>
>> >>
>> >> Then it will be null if the body if the body doesnt have a
>> >> getMethod().getName()
>> >>
>> >> There is also a bodyAs(type) to use the Camel type converter.
>> >>
>> >>
>> >>
>> >> On Wed, Jul 10, 2013 at 4:48 PM, Cristiano Costantini
>> >> <cristiano.costant...@gmail.com> wrote:
>> >> > mmm, it seems that "<simple>${body.method.name}</simple>" works:
>> >> >
>> >> > <setHeader headerName="methodName">
>> >> > <simple>${body.method.name}</simple>
>> >> > </setHeader>
>> >> >
>> >> >
>> >> > Any comment about this solution? (is it good?)
>> >> >
>> >> > What happens if the body is not of class
>> >> > org.apache.camel.component.bean.BeanInvocation?
>> >> > Is there a way to check if body is of the right instance?
>> >> >
>> >> > Many thanks!!!
>> >> >
>> >> > Cristiano
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > 2013/7/10 Cristiano Costantini <cristiano.costant...@gmail.com>
>> >> >
>> >> >> Hi All,
>> >> >>
>> >> >> I have a Camel Proxy that pushes "BeanInvokation" exchanges  to a
>> camel
>> >> >> route, and I want to route these messages depending on the method
>> name
>> >> that
>> >> >> is invoked.
>> >> >>
>> >> >> Is there any way to extract this information and put into an header
>> so
>> >> to
>> >> >> use it in a <choice>?
>> >> >>
>> >> >>
>> >> >> For example, considering the following XML code:
>> >> >>
>> >> >> <camelContext id="camelContext" xmlns="
>> >> >> http://camel.apache.org/schema/spring";>
>> >> >> <proxy id="myServiceProxy" serviceInterface="org.example.MyService"
>> >> >>  serviceUrl="direct:entry" />
>> >> >>
>> >> >> <route>
>> >> >> <from uri="direct:entry" />
>> >> >>  <setHeader headerName="methodName">
>> >> >>  <?? how to extract the method name ??>
>> >> >>  </setHeader>
>> >> >>
>> >> >> <choice>
>> >> >> <when>
>> >> >>  <simple>${header.methodName} == 'myMethod1'</simple>
>> >> >> <to uri="log:endoint_1?showAll=true" />
>> >> >>  </when>
>> >> >> <when>
>> >> >> <simple>${header.methodName} == 'myMethod2'</simple>
>> >> >>  <to uri="log:endoint_2?showAll=true" />
>> >> >> </when>
>> >> >> <otherwise>
>> >> >>  <throwException ref="unsupportedException" />
>> >> >> </otherwise>
>> >> >> </choice>
>> >> >>  </route>
>> >> >> </camelContext>
>> >> >>
>> >> >>
>> >> >> I'm searching for a solution to be used between the two <setHeader>
>> >> tags.
>> >> >>
>> >> >> I know I can write a processor, but I will have problems deploying
>> it to
>> >> >> the classpath where I put the route, so I need a solution that rely
>> on
>> >> the
>> >> >> default camel capability (like using simple language or other
>> expression
>> >> >> languages available with camel).
>> >> >>
>> >> >>
>> >> >> Any idea?
>> >> >> Thank you all!
>> >> >>
>> >> >> Cristiano
>> >> >>
>> >> >>
>> >> >>
>> >>
>> >>
>> >>
>> >> --
>> >> Claus Ibsen
>> >> -----------------
>> >> Red Hat, Inc.
>> >> Email: cib...@redhat.com
>> >> Twitter: davsclaus
>> >> Blog: http://davsclaus.com
>> >> Author of Camel in Action: http://www.manning.com/ibsen
>> >>
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> Email: cib...@redhat.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>>
>
>

Reply via email to