On Tue, May 10, 2011 at 3:38 PM, Romain Manni-Bucau
<rmannibu...@gmail.com> wrote:
> after having talked with Claus on IRC i tried to look how to implement his
> idea:
>
> from(...).bean(XXX.class, "myMethod(${header.myHeader}, ${body}").to(...).
>
> But i don't understand something: method are managed from BeanInfo and
> MethodInfo. Where is the link with the route?
>
> In other word how can i get the "myMethod(${header.myHeader}, ${body}"
> string from BeanInfo?
>
> I think BeanInfo should have another cached (method, expressions) list to
> manage it.
>

Could you create a ticket in JIRA for this new feature. Then we can track it.


> - Romain
>
> 2011/5/8 Romain Manni-Bucau <rmannibu...@gmail.com>
>
>> i did a poc,
>>
>> i need a modification in camel-core, here is the diff:
>>
>> Index: src/main/java/org/apache/camel/component/bean/BeanInfo.java
>> ===================================================================
>> --- src/main/java/org/apache/camel/component/bean/BeanInfo.java (révision
>> 1100337)
>> +++ src/main/java/org/apache/camel/component/bean/BeanInfo.java (copie de
>> travail)
>> @@ -289,7 +289,7 @@
>>      @SuppressWarnings("unchecked")
>>     protected MethodInfo createMethodInfo(Class clazz, Method method) {
>>          Class[] parameterTypes = method.getParameterTypes();
>> -        Annotation[][] parametersAnnotations =
>> method.getParameterAnnotations();
>> +        Annotation[][] parametersAnnotations = getAnnotationsFor(method);
>>
>>         List<ParameterInfo> parameters = new ArrayList<ParameterInfo>();
>>          List<ParameterInfo> bodyParameters = new
>> ArrayList<ParameterInfo>();
>> @@ -338,6 +338,10 @@
>>          return new MethodInfo(camelContext, clazz, method, parameters,
>> bodyParameters, hasCustomAnnotation, hasHandlerAnnotation);
>>      }
>>
>> +    protected Annotation[][] getAnnotationsFor(Method method) {
>> +        return method.getParameterAnnotations();
>> +    }
>> +
>>     /**
>>      * Lets try choose one of the available methods to invoke if we can
>> match
>>       * the message body to the body parameter
>>
>>
>> It is simply adding getAnnotationsFor(Method method) method to allow me to
>> override it in a child class.
>>
>> After this modification i did a component reading a file containing the
>> annotation description:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <methods>
>>   <method class="org.apache.camel.component.bean.FooBean" name="foo">
>>     <parameter index="0" type="java.lang.String">
>>       <annotation class="org.apache.camel.Header">
>>         <annotation-parameter name="value" value="bar" />
>>       </annotation>
>>     </parameter>
>>     <parameter index="1" type="java.lang.String">
>>       <annotation class="org.apache.camel.Body" />
>>     </parameter>
>>   </method>
>> </methods>
>>
>>
>> and i change the behavior of the method i started my mail with to test if
>> annotations are defined in a file before returning the array.
>>
>> To avoid to load the file each time i need it i created a service to do it.
>>
>> Finally i can do what i want: to use a pojo without any camel import and
>> avoiding to create an array to set parameters.
>>
>> My questions are now:
>>
>> 1) do you think the method can be created in the trunk?
>> 2) i didn't find how to register my service in camel (i added it manually
>> in my unit test)
>> 3) any thoughts?
>>
>> PS: i'll upload the code in my repository very soon (
>> http://code.google.com/p/rmannibucau/ )
>>
>> - Romain
>>
>> 2011/5/8 Romain Manni-Bucau <rmannibu...@gmail.com>:
>>
>> > Hi,
>> >
>> > maybe another solution to this problem could be to add a kind of
>> > descriptor file:
>> >
>> > in camel a bean can extract parameters from headers or something else
>> > with annotations, if there is a file saying the same thing the bean
>> > could not use any camel imports but do the same.
>> >
>> > what do you think of a file like:
>> >
>> > <methods>
>> >    <method class="aaa" method="bbb">
>> >        <parameter index="ccc">
>> >              <annotation class="ddd">
>> >                  <annotation-parameter name="eee" value="fff" />
>> >              </annotation>
>> >        </parameter>
>> >    </method>
>> > </methods>
>> >
>> > - Romain
>> >
>> > 2011/5/6 Romain Manni-Bucau <rmannibu...@gmail.com>:
>> >> Hi,
>> >>
>> >> i would like to do a route with a bit more bean invocations than
>> >> usually and i realise the use of array body to specify parameters is
>> >> not very nice, i always have something like:
>> >>
>> >> from(...).to(<create my array>).to("bean:...").to(<save my output in
>> >> headers and replace the body to continue>)....
>> >>
>> >> do you  think it could be improved specifying in the bean component
>> >> input/output from headers for example?
>> >>
>> >> example:
>> from(...).to("bean:foo.bar.MyClass?method=hello&parameter[0]=header(first)&aprameter[2]=header(other)&result=header(out)").to(...)
>> >>
>> >> - Romain
>> >>
>> >
>>
>>
>



-- 
Claus Ibsen
-----------------
FuseSource
Email: cib...@fusesource.com
Web: http://fusesource.com
CamelOne 2011: http://fusesource.com/camelone2011/
Twitter: davsclaus
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/

Reply via email to