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>