Author: davsclaus
Date: Sun Feb 15 13:28:54 2009
New Revision: 744668

URL: http://svn.apache.org/viewvc?rev=744668&view=rev
Log:
CAMEL-1343: Added in operator for predicate builders. Added wiki example for 
compound predicates.

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceCompoundPredicateTest.java
      - copied, changed from r744631, 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceTest.java
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBuilderTest.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java?rev=744668&r1=744667&r2=744668&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
 Sun Feb 15 13:28:54 2009
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.builder;
 
-
+import java.util.Arrays;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -24,7 +24,6 @@
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.util.ObjectHelper;
-
 import static org.apache.camel.util.ObjectHelper.compare;
 import static org.apache.camel.util.ObjectHelper.notNull;
 
@@ -112,6 +111,30 @@
         };
     }
 
+    /**
+     * A helper method to return true if any of the predicates
+     * matches.
+     */
+    public static Predicate in(final Predicate... predicates) {
+        notNull(predicates, "predicates");
+
+        return new PredicateSupport() {
+            public boolean matches(Exchange exchange) {
+                for (Predicate in : predicates) {
+                    if (in.matches(exchange)) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+
+            @Override
+            public String toString() {
+                return "in (" + Arrays.asList(predicates) + ")";
+            }
+        };
+    }
+
     public static Predicate isEqualTo(final Expression left, final Expression 
right) {
         return new BinaryPredicateSupport(left, right) {
 

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java?rev=744668&r1=744667&r2=744668&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java 
Sun Feb 15 13:28:54 2009
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.builder;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
@@ -99,6 +102,20 @@
         return onNewPredicate(PredicateBuilder.not(predicate));
     }
 
+    public Predicate in(Object... values) {
+        List<Predicate> predicates = new ArrayList<Predicate>();
+        for (Object value : values) {
+            Expression right = asExpression(value);
+            Predicate predicate = 
onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
+            predicates.add(predicate);
+        }
+        return in(predicates.toArray(new Predicate[predicates.size()]));
+    }
+
+    public Predicate in(Predicate... predicates) {
+        return onNewPredicate(PredicateBuilder.in(predicates));
+    }
+
     /**
      * Create a predicate that the left hand expression contains the value of
      * the right hand expression

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBuilderTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBuilderTest.java?rev=744668&r1=744667&r2=744668&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBuilderTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBuilderTest.java
 Sun Feb 15 13:28:54 2009
@@ -22,8 +22,8 @@
 import org.apache.camel.TestSupport;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultExchange;
-
 import static org.apache.camel.builder.Builder.constant;
+import static org.apache.camel.builder.PredicateBuilder.in;
 import static org.apache.camel.builder.PredicateBuilder.not;
 
 /**
@@ -48,6 +48,40 @@
         assertDoesNotMatch(not(header("size").isLessThan(constant(100))));
     }
 
+    public void testCompoundOrPredicates() throws Exception {
+        Predicate p1 = header("name").isEqualTo(constant("Hiram"));
+        Predicate p2 = header("size").isGreaterThanOrEqualTo(constant(10));
+        Predicate or = PredicateBuilder.or(p1, p2);
+
+        assertMatches(or);
+    }
+
+    public void testCompoundAndPredicates() throws Exception {
+        Predicate p1 = header("name").isEqualTo(constant("James"));
+        Predicate p2 = header("size").isGreaterThanOrEqualTo(constant(10));
+        Predicate and = PredicateBuilder.and(p1, p2);
+
+        assertMatches(and);
+    }
+
+    public void testCompoundAndOrPredicates() throws Exception {
+        Predicate p1 = header("name").isEqualTo(constant("Hiram"));
+        Predicate p2 = header("size").isGreaterThan(constant(100));
+        Predicate p3 = header("location").contains("London");
+        Predicate and = PredicateBuilder.and(p1, p2);
+        Predicate andor = PredicateBuilder.or(and, p3);
+
+        assertMatches(andor);
+    }
+
+    public void testPredicateIn() throws Exception {
+        assertMatches(in(header("name").isEqualTo("Hiram"), 
header("name").isEqualTo("James")));
+    }
+
+    public void testValueIn() throws Exception {
+        assertMatches(header("name").in("Hiram", "Jonathan", "James", 
"Claus"));
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();

Copied: 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceCompoundPredicateTest.java
 (from r744631, 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceCompoundPredicateTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceCompoundPredicateTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceTest.java&r1=744631&r2=744668&rev=744668&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceTest.java 
(original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/ChoiceCompoundPredicateTest.java
 Sun Feb 15 13:28:54 2009
@@ -16,78 +16,107 @@
  */
 package org.apache.camel.processor;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Predicate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import static org.apache.camel.component.mock.MockEndpoint.expectsMessageCount;
+import static org.apache.camel.builder.PredicateBuilder.and;
+import static org.apache.camel.builder.PredicateBuilder.or;
 
 /**
  * @version $Revision$
  */
-public class ChoiceTest extends ContextTestSupport {
-    protected MockEndpoint x;
-    protected MockEndpoint y;
-    protected MockEndpoint z;
-    protected MockEndpoint end;
-
-    public void testSendToFirstWhen() throws Exception {
-        String body = "<one/>";
-        x.expectedBodiesReceived(body);
-        end.expectedBodiesReceived(body);
-        // The SpringChoiceTest.java can't setup the header by Spring 
configure file
-        // x.expectedHeaderReceived("name", "a");
-        expectsMessageCount(0, y, z);
+public class ChoiceCompoundPredicateTest extends ContextTestSupport {
+
+    public void testGuest() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:guest");
+        mock.expectedMessageCount(1);
 
-        sendMessage("bar", body);
+        template.sendBody("direct:start", "Hello World");
 
         assertMockEndpointsSatisfied();
     }
 
-    public void testSendToSecondWhen() throws Exception {
-        String body = "<two/>";
-        y.expectedBodiesReceived(body);
-        end.expectedBodiesReceived(body);
-        expectsMessageCount(0, x, z);
+    public void testUser() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:user");
+        mock.expectedMessageCount(1);
 
-        sendMessage("cheese", body);
+        template.sendBodyAndHeader("direct:start", "Hello World", "username", 
"goofy");
 
         assertMockEndpointsSatisfied();
     }
 
-    public void testSendToOtherwiseClause() throws Exception {
-        String body = "<three/>";
-        z.expectedBodiesReceived(body);
-        end.expectedBodiesReceived(body);
-        expectsMessageCount(0, x, y);
-
-        sendMessage("somethingUndefined", body);
+    public void testAdmin() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:admin");
+        mock.expectedMessageCount(1);
+
+        Map<String, Object> headers = new HashMap<String, Object>();
+        headers.put("username", "donald");
+        headers.put("admin", "true");
+        template.sendBodyAndHeaders("direct:start", "Hello World", headers);
 
         assertMockEndpointsSatisfied();
     }
 
-    protected void sendMessage(final Object headerValue, final Object body) 
throws Exception {
-        template.sendBodyAndHeader("direct:start", body, "foo", headerValue);
+    public void testGod() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:god");
+        mock.expectedMessageCount(1);
+
+        Map<String, Object> headers = new HashMap<String, Object>();
+        headers.put("username", "pluto");
+        headers.put("admin", "true");
+        headers.put("type", "god");
+        template.sendBodyAndHeaders("direct:start", "Hello World", headers);
+
+        assertMockEndpointsSatisfied();
     }
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        x = getMockEndpoint("mock:x");
-        y = getMockEndpoint("mock:y");
-        z = getMockEndpoint("mock:z");
-        end = getMockEndpoint("mock:end");
+    public void testRiderGod() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:god");
+        mock.expectedMessageCount(1);
+
+        Map<String, Object> headers = new HashMap<String, Object>();
+        headers.put("username", "Camel");
+        headers.put("admin", "true");
+        template.sendBodyAndHeaders("direct:start", "Hello Camel Rider", 
headers);
+
+        assertMockEndpointsSatisfied();
     }
 
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
+                // START SNIPPET: e1
+                // We define 3 predicates based on some user roles
+                // we have static imported and/or from 
org.apache.camel.builder.PredicateBuilder
+
+                // First we have a regular user that is just identified having 
a username header
+                Predicate user = header("username").isNotNull();
+
+                // The admin user must be a user AND have a admin header as 
true
+                Predicate admin = and(user, header("admin").isEqualTo("true"));
+
+                // And God must be an admin and (either have type god or a 
special message containing Camel Rider)
+                Predicate god = and(admin, or(body().contains("Camel Rider"), 
header("type").isEqualTo("god")));
+
+                // As you can see with the predicates above we can stack them 
to build compound predicates
+
+                // In our route below we can create a nice content based 
rotuer based on the predicates we
+                // have defined. Then the route is easy to read and understand.
+                // We encourge you to define complex predicates outside the 
fluent router bulder as
+                // it will just get a bit complex for humans to read
                 from("direct:start").choice()
-                  .when().xpath("$foo = 'bar'").to("mock:x")
-                  .when().xpath("$foo = 'cheese'").to("mock:y")
-                  .otherwise().to("mock:z").end().to("mock:end");
+                  .when(god).to("mock:god")
+                  .when(admin).to("mock:admin")
+                  .when(user).to("mock:user")
+                  .otherwise().to("mock:guest")
+                .end();
+                // END SNIPPET: e1
             }
         };
     }
 
-}
+}
\ No newline at end of file


Reply via email to