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¶meter[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/