You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2010/05/31 03:42:34 UTC
svn commit: r949643 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/model/
camel-core/src/test/java/org/apache/camel/processor/routingslip/
components/camel-spring/src/test/resources/org/apache/camel/spring/processor/
Author: ningjiang
Date: Mon May 31 01:42:33 2010
New Revision: 949643
URL: http://svn.apache.org/viewvc?rev=949643&view=rev
Log:
CAMEL-2704 Now RoutingSlip supports expression in DSL
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipTest.java
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/routingSlip.xml
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java?rev=949643&r1=949642&r2=949643&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java Mon May 31 01:42:33 2010
@@ -26,6 +26,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@@ -45,7 +46,6 @@ import org.apache.camel.builder.ErrorHan
import org.apache.camel.builder.ExpressionBuilder;
import org.apache.camel.builder.ExpressionClause;
import org.apache.camel.builder.ProcessorBuilder;
-import org.apache.camel.builder.ValueBuilder;
import org.apache.camel.model.language.ConstantExpression;
import org.apache.camel.model.language.ExpressionDefinition;
import org.apache.camel.model.language.LanguageExpression;
@@ -1364,6 +1364,56 @@ public abstract class ProcessorDefinitio
addOutput(answer);
return (Type) this;
}
+
+ /**
+ * <a href="http://camel.apache.org/routing-slip.html">Routing Slip EIP:</a>
+ * Creates a routing slip allowing you to route a message consecutively through a series of processing
+ * steps where the sequence of steps is not known at design time and can vary for each message.
+ *
+ * @param expresion to decide the destinations
+ * @param uriDelimiter is the delimiter that will be used to split up
+ * the list of URIs in the routing slip.
+ *
+ * @return the builder
+ */
+ public RoutingSlipDefinition<Type> routingSlip(Expression expression, String uriDelimiter) {
+ RoutingSlipDefinition<Type> answer = new RoutingSlipDefinition<Type>(expression, uriDelimiter);
+ addOutput(answer);
+ return answer;
+ }
+
+ /**
+ * <a href="http://camel.apache.org/routing-slip.html">Routing Slip EIP:</a>
+ * Creates a routing slip allowing you to route a message consecutively through a series of processing
+ * steps where the sequence of steps is not known at design time and can vary for each message.
+ * <p>
+ * The list of URIs will be split based on the default delimiter {@link RoutingSlipDefinition#DEFAULT_DELIMITER}
+ *
+ * @param expresion to decide the destinations
+ *
+ * @return the builder
+ */
+ public RoutingSlipDefinition<Type> routingSlip(Expression expression) {
+ RoutingSlipDefinition<Type> answer = new RoutingSlipDefinition<Type>(expression);
+ addOutput(answer);
+ return answer;
+ }
+
+ /**
+ * <a href="http://camel.apache.org/routing-slip.html">Routing Slip EIP:</a>
+ * Creates a routing slip allowing you to route a message consecutively through a series of processing
+ * steps where the sequence of steps is not known at design time and can vary for each message.
+ * <p>
+ * The list of URIs will be split based on the default delimiter {@link RoutingSlipDefinition#DEFAULT_DELIMITER}
+ *
+ *
+ * @return the expression clause to configure the expression to decide the destinations
+ */
+ public ExpressionClause<RoutingSlipDefinition<Type>> routingSlip() {
+ RoutingSlipDefinition<Type> answer = new RoutingSlipDefinition<Type>();
+ addOutput(answer);
+ return ExpressionClause.createAndSetExpression(answer);
+ }
/**
* <a href="http://camel.apache.org/sampling.html">Sampling Throttler</a>
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java?rev=949643&r1=949642&r2=949643&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java Mon May 31 01:42:33 2010
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAcce
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.camel.Expression;
import org.apache.camel.Processor;
import org.apache.camel.processor.RoutingSlip;
import org.apache.camel.spi.RouteContext;
@@ -34,9 +35,8 @@ import org.apache.camel.util.ObjectHelpe
*/
@XmlRootElement(name = "routingSlip")
@XmlAccessorType(XmlAccessType.FIELD)
-public class RoutingSlipDefinition extends ProcessorDefinition<ProcessorDefinition> {
+public class RoutingSlipDefinition <Type extends ProcessorDefinition> extends ExpressionNode {
public static final String DEFAULT_DELIMITER = ",";
-
@XmlAttribute
private String headerName;
@XmlAttribute
@@ -45,7 +45,7 @@ public class RoutingSlipDefinition exten
private Boolean ignoreInvalidEndpoints;
public RoutingSlipDefinition() {
- this(null, DEFAULT_DELIMITER);
+ this((String)null, DEFAULT_DELIMITER);
}
public RoutingSlipDefinition(String headerName) {
@@ -56,6 +56,15 @@ public class RoutingSlipDefinition exten
setHeaderName(headerName);
setUriDelimiter(uriDelimiter);
}
+
+ public RoutingSlipDefinition(Expression expression, String uriDelimiter) {
+ super(expression);
+ setUriDelimiter(uriDelimiter);
+ }
+
+ public RoutingSlipDefinition(Expression expression) {
+ this(expression, DEFAULT_DELIMITER);
+ }
@Override
public String toString() {
@@ -69,9 +78,13 @@ public class RoutingSlipDefinition exten
@Override
public Processor createProcessor(RouteContext routeContext) throws Exception {
- ObjectHelper.notEmpty(getHeaderName(), "headerName", this);
- ObjectHelper.notEmpty(getUriDelimiter(), "uriDelimiter", this);
- RoutingSlip routingSlip = new RoutingSlip(routeContext.getCamelContext(), getHeaderName(), getUriDelimiter());
+ RoutingSlip routingSlip;
+ if (getHeaderName() != null) {
+ routingSlip = new RoutingSlip(routeContext.getCamelContext(), getHeaderName(), getUriDelimiter());
+ } else {
+ Expression expression = getExpression().createExpression(routeContext);
+ routingSlip = new RoutingSlip(routeContext.getCamelContext(), expression, getUriDelimiter());
+ }
if (getIgnoreInvalidEndpoint() != null) {
routingSlip.setIgnoreInvalidEndpoints(getIgnoreInvalidEndpoint());
}
@@ -106,4 +119,25 @@ public class RoutingSlipDefinition exten
public Boolean getIgnoreInvalidEndpoint() {
return ignoreInvalidEndpoints;
}
+
+ // Fluent API
+ // -------------------------------------------------------------------------
+
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public Type end() {
+ // allow end() to return to previous type so you can continue in the DSL
+ return (Type) super.end();
+ }
+
+ /**
+ * Ignore the invalidate endpoint exception when try to create a producer with that endpoint
+ *
+ * @return the builder
+ */
+ public RoutingSlipDefinition<Type> ignoreInvalidEndpoints() {
+ setIgnoreInvalidEndpoints(true);
+ return this;
+ }
}
Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipTest.java?rev=949643&r1=949642&r2=949643&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipTest.java Mon May 31 01:42:33 2010
@@ -17,6 +17,7 @@
package org.apache.camel.processor.routingslip;
import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.ExpressionBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
@@ -30,12 +31,10 @@ public class RoutingSlipTest extends Con
MockEndpoint x = getMockEndpoint("mock:x");
MockEndpoint y = getMockEndpoint("mock:y");
MockEndpoint z = getMockEndpoint("mock:z");
-
- // at each destination, the routing slip should contain
- // the remaining destinations
- x.expectedHeaderReceived(ROUTING_SLIP_HEADER, "mock:y,mock:z");
- y.expectedHeaderReceived(ROUTING_SLIP_HEADER, "mock:z");
- z.expectedHeaderReceived(ROUTING_SLIP_HEADER, "");
+
+ x.expectedBodiesReceived(ANSWER);
+ y.expectedBodiesReceived(ANSWER);
+ z.expectedBodiesReceived(ANSWER);
sendBody("direct:a", ROUTING_SLIP_HEADER, ",");
@@ -47,11 +46,9 @@ public class RoutingSlipTest extends Con
MockEndpoint y = getMockEndpoint("mock:y");
MockEndpoint z = getMockEndpoint("mock:z");
- // at each destination, the routing slip should contain
- // the remaining destinations
- x.expectedHeaderReceived("aRoutingSlipHeader", "mock:y,mock:z");
- y.expectedHeaderReceived("aRoutingSlipHeader", "mock:z");
- z.expectedHeaderReceived("aRoutingSlipHeader", "");
+ x.expectedBodiesReceived(ANSWER);
+ y.expectedBodiesReceived(ANSWER);
+ z.expectedBodiesReceived(ANSWER);
sendBody("direct:b", "aRoutingSlipHeader", ",");
@@ -63,16 +60,28 @@ public class RoutingSlipTest extends Con
MockEndpoint y = getMockEndpoint("mock:y");
MockEndpoint z = getMockEndpoint("mock:z");
- // at each destination, the routing slip should contain
- // the remaining destinations
- x.expectedHeaderReceived("aRoutingSlipHeader", "mock:y#mock:z");
- y.expectedHeaderReceived("aRoutingSlipHeader", "mock:z");
- z.expectedHeaderReceived("aRoutingSlipHeader", "");
+ x.expectedBodiesReceived(ANSWER);
+ y.expectedBodiesReceived(ANSWER);
+ z.expectedBodiesReceived(ANSWER);
sendBody("direct:c", "aRoutingSlipHeader", "#");
assertMockEndpointsSatisfied();
}
+
+ public void testBodyExpression() throws Exception {
+ MockEndpoint x = getMockEndpoint("mock:x");
+ MockEndpoint y = getMockEndpoint("mock:y");
+ MockEndpoint z = getMockEndpoint("mock:z");
+
+ x.expectedBodiesReceived("mock:x, mock:y,mock:z");
+ y.expectedBodiesReceived("mock:x, mock:y,mock:z");
+ z.expectedBodiesReceived("mock:x, mock:y,mock:z");
+
+ template.sendBody("direct:d", "mock:x, mock:y,mock:z");
+ assertMockEndpointsSatisfied();
+
+ }
public void testMessagePassingThrough() throws Exception {
MockEndpoint end = getMockEndpoint("mock:end");
@@ -122,12 +131,16 @@ public class RoutingSlipTest extends Con
// END SNIPPET: e1
// START SNIPPET: e2
- from("direct:b").routingSlip("aRoutingSlipHeader");
+ from("direct:b").routingSlip(ExpressionBuilder.headerExpression("aRoutingSlipHeader"));
// END SNIPPET: e2
// START SNIPPET: e3
from("direct:c").routingSlip("aRoutingSlipHeader", "#");
// END SNIPPET: e3
+
+ // START SNIPPET: e4
+ from("direct:d").routingSlip(ExpressionBuilder.bodyExpression());
+ // END SNIPPET: e4
}
};
}
Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/routingSlip.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/routingSlip.xml?rev=949643&r1=949642&r2=949643&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/routingSlip.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/routingSlip.xml Mon May 31 01:42:33 2010
@@ -24,24 +24,38 @@
<!--
from("direct:a").routingSlip("myHeader").to("mock:end");
- from("direct:b").routingSlip("aRoutingSlipHeader");
+ from("direct:b").routingSlip(ExpressionBuilder.headerExpression("aRoutingSlipHeader"));
from("direct:c").routingSlip("aRoutingSlipHeader", "#");
+ from("direct:d").routingSlip(ExpressionBuilder.bodyExpression());
-->
<camelContext id="camel"
xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:a" />
- <routingSlip headerName="myHeader"/>
+ <routingSlip>
+ <simple>${header.myHeader}</simple>
+ </routingSlip>
<to uri="mock:end" />
</route>
<route>
<from uri="direct:b" />
- <routingSlip headerName="aRoutingSlipHeader" />
+ <routingSlip>
+ <simple>${header.aRoutingSlipHeader}</simple>
+ </routingSlip>
</route>
<route>
<from uri="direct:c" />
- <routingSlip headerName="aRoutingSlipHeader" uriDelimiter="#" />
+ <routingSlip uriDelimiter="#">
+ <simple>${header.aRoutingSlipHeader}</simple>
+ </routingSlip>
</route>
+ <route>
+ <from uri="direct:d" />
+ <routingSlip>
+ <simple>${body}</simple>
+ </routingSlip>
+ </route>
+
</camelContext>
</beans>