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
>>
>

Reply via email to