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: Simple way to do some elementary bean operations
Date Fri, 20 Sep 2013 05:54:39 GMT
Hi

You can use the language component, and set transform=false
http://camel.apache.org/language

Though the idea of having a <script> in the DSL seems good. Though we
are often a bit careful to add to the DSL to not make it too big.


On Thu, Sep 19, 2013 at 8:23 PM, Dale King <dalewking@gmail.com> wrote:
> Thinking about this some more the real issue is not so much direct support
> for setting properties or invoking arbitrary methods because we have things
> like OGNL which can do that work for us. For example, the OGNL expression:
>
>    request.body.someProperty = request.headers.foo
>
> would do the trick for setting a property without resorting to Java.
>
> The real problem is that there is no way to just invoke a script like this
> without requiring you to do something with the result (store it in the
> body, a property, a header, use the value as a filter, etc.) We need a way
> to just say invoke this expression which could be in OGNL, Groovy,
> Javascript, etc. without being forced to do something with the result.
>
> Looking at the code there is the EvaluateExpressionProcessor which would be
> perfect for this. It evaluates an expression and stores the result in a
> property "CamelEvaluateExpressionResult". All we need is DSL to create an
> instance of this.
>
> So in Java DSL it would be something like:
>
>     .eval().ognl("request.body.someProperty = request.headers.foo")
>
> In Spring DSL it would be something like:
>
>     <eval><ognl>request.body.someProperty =
> request.headers.foo</ognl></eval>
>
> The workaround for now is to do the equivalent:
>
>     .setProperty("dummy").ognl("request.body.someProperty =
> request.headers.foo")
>
>
> On Tue, Sep 3, 2013 at 2:09 PM, Dale King <dalewking@gmail.com> wrote:
>
>> Yeah, LIKE I SAID, I know I can break out to a bean or a processor, but
>> that is such a heavyweight solution to do something so simple that really
>> should be built into Camel. You have to create a class, come up with some
>> meaningful name of the class, repeat that name a couple of times if using a
>> Spring DSL, etc.
>>
>> Let's say we do it with anonymous classes in a Java DSL:
>>
>>   process(new Processor()
>>   {
>>         @Override
>>          public void process(Exchange exchange) throws Exception
>>          {
>>                exchange.getIn().getBody(MyBodyType.class)
>>
>> .setSomeProperty(exchange.getIn().getHeader("foo", SomeType.class);
>>          }
>>   })
>>
>> Or perhaps better as a bean:
>>
>>   bean( new Object()
>>   {
>>       public void set( @Body MyBodyType body, @Header("foo") value)
>>       {
>>           body.setSomeProperty(value);
>>       }
>>   }
>>
>> I personally would rather replace any of those with something more like
>> this in DSL:
>>
>>   body().set("someProperty", header("foo"))
>>
>> This is much more obvious what is happening when looking at the route.
>>
>>
>>
>> On Tue, Sep 3, 2013 at 1:51 PM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
>>
>>> On Tue, Sep 3, 2013 at 5:51 PM, Dale King <dalewking@gmail.com> wrote:
>>> > Through simple and OGNL we have nice easy ways to read the properties of
>>> > beans in the body, headers, or properties. But what I cannot find is an
>>> > easy way to invoke a setter on a bean property, but perhaps I am missing
>>> > something.
>>> >
>>> > I can certainly create a bean or processor to invoke the setter, but it
>>> > seems to me that if I am forced to do it for something as simple as
>>> setting
>>> > a property then something is missing in Camel. I try to do as much as
>>> > possible in Camel.
>>> >
>>> > I can certainly use another language like javascript, groovy, or el to
>>> do
>>> > it, but once again bringing in a whole new language seems like overkill
>>> > just to set a property.
>>> >
>>> > So 3 operations that i don't see an easy way to do in Camel without
>>> > resorting to these heavyweight solutions are:
>>> >
>>> >  - Set a bean property
>>> >  - More generally, you should be able to invoke any method on a bean
>>> > including with parameters
>>> >  - Create a new instance of a bean (possibly with parameters)
>>> >
>>> > Correct me if I am wrong and there is a simple way to do these.
>>> >
>>>
>>> Well there is something called Java programming language, where you
>>> can do all that ;)
>>>
>>> > --
>>> > Dale King
>>>
>>>
>>>
>>> --
>>> 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
>>>
>>
>>
>>
>> --
>> Dale King
>>
>
>
>
> --
> Dale King



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