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 <dalewk...@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.ib...@gmail.com> wrote: > >> On Tue, Sep 3, 2013 at 5:51 PM, Dale King <dalewk...@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: cib...@redhat.com >> Twitter: davsclaus >> Blog: http://davsclaus.com >> Author of Camel in Action: http://www.manning.com/ibsen >> > > > > -- > Dale King > -- Dale King