Author: davsclaus
Date: Mon Feb 16 16:10:56 2009
New Revision: 744955

URL: http://svn.apache.org/viewvc?rev=744955&view=rev
Log:
CAMEL-1338: Added contains,regex,in operators to simple language

Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ValueBuilder.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLangaugeOperator.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java

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=744955&r1=744954&r2=744955&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 
Mon Feb 16 16:10:56 2009
@@ -106,6 +106,7 @@
         List<Predicate> predicates = new ArrayList<Predicate>();
         for (Object value : values) {
             Expression right = asExpression(value);
+            right = ExpressionBuilder.convertTo(right, expression);
             Predicate predicate = 
onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
             predicates.add(predicate);
         }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLangaugeOperator.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLangaugeOperator.java?rev=744955&r1=744954&r2=744955&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLangaugeOperator.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLangaugeOperator.java
 Mon Feb 16 16:10:56 2009
@@ -25,11 +25,14 @@
  *   <li>LT : <</li>
  *   <li>LTE : <=</li>
  *   <li>NOT : !=</li>
+ *   <li>contains : tested for if it contains the value</li>
+ *   <li>regex : matching a regular expression</li>
+ *   <li>in : tested for in a list of values separated by comma</li>
  * </ul>
  */
 public enum SimpleLangaugeOperator {
 
-    EQ, GT, GTE, LT, LTE, NOT;
+    EQ, GT, GTE, LT, LTE, NOT, CONTAINS, REGEX, IN;
 
     public static SimpleLangaugeOperator asOperator(String text) {
         if ("==".equals(text)) {
@@ -44,6 +47,12 @@
             return LTE;
         } else if ("!=".equals(text)) {
             return NOT;
+        } else if ("contains".equals(text)) {
+            return CONTAINS;
+        } else if ("regex".equals(text)) {
+            return REGEX;
+        } else if ("in".equals(text)) {
+            return IN;
         }
         throw new IllegalArgumentException("Operator not supported: " + text);
     }
@@ -61,7 +70,13 @@
             return "<=";
         } else if (operator == NOT) {
             return "!=";
-        } 
+        } else if (operator == CONTAINS) {
+            return "contains";
+        } else if (operator == REGEX) {
+            return "regex";
+        } else if (operator == IN) {
+            return "in";
+        }
         return "";
     }
 

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java?rev=744955&r1=744954&r2=744955&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
 Mon Feb 16 16:10:56 2009
@@ -18,6 +18,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Iterator;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -26,6 +27,7 @@
 import org.apache.camel.Predicate;
 import org.apache.camel.builder.ExpressionBuilder;
 import org.apache.camel.builder.PredicateBuilder;
+import org.apache.camel.builder.ValueBuilder;
 import org.apache.camel.impl.ExpressionAdapter;
 import org.apache.camel.spi.Language;
 import org.apache.camel.util.ObjectHelper;
@@ -38,7 +40,7 @@
  */
 public abstract class SimpleLanguageSupport implements Language {
 
-    protected static final Pattern PATTERN = 
Pattern.compile("^\\$\\{(.+)\\}\\s+(==|>|>=|<|<=|!=)\\s+(.+)$");
+    protected static final Pattern PATTERN = 
Pattern.compile("^\\$\\{(.+)\\}\\s+(==|>|>=|<|<=|!=|contains|regex|in)\\s+(.+)$");
     protected final Log log = LogFactory.getLog(getClass());
 
     public Predicate createPredicate(String expression) {
@@ -74,9 +76,11 @@
         String text = matcher.group(3);
 
         final Expression right;
+        final Expression rightConverted;
         // special null handling
         if ("null".equals(text)) {
             right = createConstantExpression(null);
+            rightConverted = right;
         } else {
             // text can either be a constant enclosed by ' ' or another 
expression using ${ } placeholders
             String constant = ObjectHelper.between(text, "'", "'");
@@ -86,33 +90,45 @@
             }
             String simple = ObjectHelper.between(text, "${", "}");
 
-            Expression exp = simple != null ? createSimpleExpression(simple) : 
createConstantExpression(constant);
+            right = simple != null ? createSimpleExpression(simple) : 
createConstantExpression(constant);
             // to support numeric comparions using > and < operators we must 
convert the right hand side
             // to the same type as the left
-            right = ExpressionBuilder.convertTo(exp, left);
+            rightConverted = ExpressionBuilder.convertTo(right, left);
         }
 
         return new ExpressionAdapter() {
             @Override
-            protected String assertionFailureMessage(Exchange exchange) {
-                return super.assertionFailureMessage(exchange);
-            }
-
-            @Override
-            public Object evaluate(Exchange exchange) {
+            public Object evaluate(final Exchange exchange) {
                 Predicate predicate = null;
                 if (operator == EQ) {
-                    predicate = PredicateBuilder.isEqualTo(left, right);
+                    predicate = PredicateBuilder.isEqualTo(left, 
rightConverted);
                 } else if (operator == GT) {
-                    predicate = PredicateBuilder.isGreaterThan(left, right);
+                    predicate = PredicateBuilder.isGreaterThan(left, 
rightConverted);
                 } else if (operator == GTE) {
-                    predicate = PredicateBuilder.isGreaterThanOrEqualTo(left, 
right);
+                    predicate = PredicateBuilder.isGreaterThanOrEqualTo(left, 
rightConverted);
                 } else if (operator == LT) {
-                    predicate = PredicateBuilder.isLessThan(left, right);
+                    predicate = PredicateBuilder.isLessThan(left, 
rightConverted);
                 } else if (operator == LTE) {
-                    predicate = PredicateBuilder.isLessThanOrEqualTo(left, 
right);
+                    predicate = PredicateBuilder.isLessThanOrEqualTo(left, 
rightConverted);
                 } else if (operator == NOT) {
-                    predicate = PredicateBuilder.isNotEqualTo(left, right);
+                    predicate = PredicateBuilder.isNotEqualTo(left, 
rightConverted);
+                } else if (operator == CONTAINS) {
+                    predicate = PredicateBuilder.contains(left, 
rightConverted);
+                } else if (operator == REGEX) {
+                    // reg ex should use String pattern, so we evalute the 
right hand side as a String
+                    predicate = PredicateBuilder.regex(left, 
right.evaluate(exchange, String.class));
+                } else if (operator == IN) {
+                    // okay the in operator is a bit more complex as we need 
to build a list of values
+                    // from the right handside expression.
+                    // each element on the right handside must be separated by 
comma (default for create iterator)
+                    Iterator it = 
ObjectHelper.createIterator(right.evaluate(exchange));
+                    List<Object> values = new ArrayList<Object>();
+                    while (it.hasNext()) {
+                        values.add(it.next());
+                    }
+                    // then reuse value builder to create the in predicate 
with the list of values
+                    ValueBuilder vb = new ValueBuilder(left);
+                    predicate = vb.in(values.toArray());
                 }
 
                 if (predicate == null) {

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java?rev=744955&r1=744954&r2=744955&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java
 Mon Feb 16 16:10:56 2009
@@ -150,6 +150,42 @@
         assertExpression("${in.header.bar} >= ${bean:generator.generateId}", 
true);
     }
 
+    public void testConstains() throws Exception {
+        assertExpression("${in.header.foo} contains 'a'", true);
+        assertExpression("${in.header.foo} contains a", true);
+        assertExpression("${in.header.foo} contains 'ab'", true);
+        assertExpression("${in.header.foo} contains 'abc'", true);
+        assertExpression("${in.header.foo} contains 'def'", false);
+        assertExpression("${in.header.foo} contains def", false);
+    }
+
+    public void testRegex() throws Exception {
+        assertExpression("${in.header.foo} regex '^a..$'", true);
+        assertExpression("${in.header.foo} regex '^ab.$'", true);
+        assertExpression("${in.header.foo} regex ^ab.$", true);
+        assertExpression("${in.header.foo} regex ^d.*$", false);
+
+        assertExpression("${in.header.bar} regex '^\\d{3}'", true);
+        assertExpression("${in.header.bar} regex '^\\d{2}'", false);
+        assertExpression("${in.header.bar} regex ^\\d{3}", true);
+        assertExpression("${in.header.bar} regex ^\\d{2}", false);
+    }
+
+    public void testIn() throws Exception {
+        // string to string
+        assertExpression("${in.header.foo} in 'foo,abc,def'", true);
+        assertExpression("${in.header.foo} in 
${bean:generator.generateFilename}", true);
+        assertExpression("${in.header.foo} in foo,abc,def", true);
+        assertExpression("${in.header.foo} in 'foo,def'", false);
+
+        // integer to string
+        assertExpression("${in.header.bar} in '100,123,200'", true);
+        assertExpression("${in.header.bar} in 100,123,200", true);
+        assertExpression("${in.header.bar} in ${bean:generator.generateId}", 
true);
+        assertExpression("${in.header.bar} in '100,200'", false);
+    }
+
+
     protected String getLanguageName() {
         return "simple";
     }


Reply via email to