Thanks for all the help! Roshan Punnoose Phone: 301-497-6039 -----Original Message----- From: Hadrian Zbarcea [mailto:[EMAIL PROTECTED] Sent: Thursday, August 02, 2007 10:24 AM To: camel-user@activemq.apache.org Subject: Re: Camel Pojo Routing
Roshnan, James Strachan pointed out another solution that does not require any extra code: from("direct:hello").choice().when( new ValueBuilder(el("${in.body.args[0]}")).isEqualTo("One")) .to("pojo:one").otherwise().to("pojo:two"); you would need to import static org.apache.camel.language.juel.JuelExpression.el; Thanks James, Hadrian Hadrian Zbarcea wrote: > Hi Roshnan, > > You are right that the root of the problem is that the "body() > function only returns a PojoInvocation and not the actual argument". > However this is what you asked camel to do. As you are dealing with a > POJO, you are not interested in the whole PojoInvocation, but a > particular argument (could have been more than one) or you could have > been interested in the method name to make the choice. So you might > want to write your code like this: > > context.addRoutes(new RouteBuilder(context) { > public void configure() { > > from("direct:hello").choice().when(argument(0).isEqualTo("One")) > .to("pojo:one").otherwise().to("pojo:two"); > } > > private ValueBuilder<PojoExchange> argument(int index) { > Expression<PojoExchange> expression = > PojoExpressionBuilder.argumentExpression(index); > return new ValueBuilder<PojoExchange>(expression); > } > }); > > Please note that the Predicate for your choice is now "when the 1st > argument of my pojo method call is equal to 'One'". You would need > though an Expression that evaluates to the n-th argument of a pojo > method call to implement the argument method as above. Camel does not > provide such as Expression, but here is some code that does the job (a > method that creates an Expression that evaluates to the method name is > also provided). > > import org.apache.camel.Expression; > > public class PojoExpressionBuilder { > > public static Expression<PojoExchange> methodExpression() { > return new Expression<PojoExchange>() { > public Object evaluate(PojoExchange exchange) { > PojoInvocation body = > (PojoInvocation)exchange.getIn().getBody(); > if (body != null) { > return body.getMethod().getName(); > } > return null; > } > > > @Override > public String toString() { > return "method"; > } > }; > } > public static Expression<PojoExchange> argumentExpression(final > int index) { > return new Expression<PojoExchange>() { > public Object evaluate(PojoExchange exchange) { > PojoInvocation body = > (PojoInvocation)exchange.getIn().getBody(); > if (body != null) { > return body.getArgs()[index]; > } > return null; > } > > > @Override > public String toString() { > return "arg(" + index + ")"; > } > }; > } > } > > > I hope this helps, > Hadrian > > > Punnoose, Roshan wrote: >> I couldn't get the forums to come up, it keeps timing out, so I have to >> ask this question on the mailing list. >> >> >> >> I have two Pojo endpoints, and I want to route based on a String input. >> How do I do that? This is my code currently: >> >> >> >> CamelContext context = new DefaultCamelContext(); >> >> PojoComponent component1 = (PojoComponent) >> context.getComponent("pojo"); >> >> component1.addService("one", new PojoOne()); >> >> PojoComponent component2 = (PojoComponent) >> context.getComponent("pojo"); >> >> component2.addService("two", new PojoTwo()); >> >> >> >> DirectComponent directComponent = >> (DirectComponent) context >> >> .getComponent("direct"); >> >> directComponent.createEndpoint("hello"); >> >> >> >> context.addRoutes(new RouteBuilder() { >> >> public void configure() { >> >> FromBuilder from = >> from("direct:hello"); >> >> ChoiceBuilder choice = >> from.choice(); >> >> WhenBuilder when = >> choice >> >> >> .when(body().isEqualTo("One")); >> >> when.to("pojo:one") >> >> >> .otherwise().to("pojo:two"); >> >> } >> >> }); >> >> >> >> context.start(); >> >> >> >> Endpoint endpoint = >> context.getEndpoint("direct:hello"); >> >> PojoNumInterface pojo = (PojoNumInterface) >> PojoComponent.createProxy( >> >> endpoint, >> PojoNumInterface.class); >> >> pojo.execute("One"); >> >> >> >> >> >> I'm guessing the body() function only returns a PojoInvocation and not >> the actual argument "One". >> >> >> >> Roshan >> >> >> >