Author: davsclaus
Date: Tue May 19 10:58:29 2009
New Revision: 776267

URL: http://svn.apache.org/viewvc?rev=776267&view=rev
Log:
CAMEL-1627: Added more operators to simple language: is and range.

Modified:
    
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/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=776267&r1=776266&r2=776267&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
 Tue May 19 10:58:29 2009
@@ -19,23 +19,27 @@
 /**
  * Operators supported by simple language
  * <ul>
- *   <li>EQ : ==</li>
- *   <li>GT : ></li>
- *   <li>GTE : >=</li>
- *   <li>LT : <</li>
- *   <li>LTE : <=</li>
- *   <li>NOT : !=</li>
+ *   <li>== : equlas</li>
+ *   <li>> : greather than</li>
+ *   <li>>= : greather than or equals</li>
+ *   <li>< : less than</li>
+ *   <li><= : less than or equals</li>
+ *   <li>!= : not</li>
  *   <li>contains : tested for if it contains the value</li>
  *   <li>not contains : tested for if it does not contain the value</li>
  *   <li>regex : matching a regular expression</li>
  *   <li>not regex : not matching a regular expression</li>
  *   <li>in : tested for in a list of values separated by comma</li>
  *   <li>not in : tested for not in a list of values separated by comma</li>
+ *   <li>is : tested for if type is an instanceof the given type</li>
+ *   <li>not is: tested for not if type is an instanceof the given type</li>
+ *   <li>range : tested for if it is within the provided range</li>
+ *   <li>not range : tested for not if it is within the provided range</li>
  * </ul>
  */
 public enum SimpleLangaugeOperator {
 
-    EQ, GT, GTE, LT, LTE, NOT, CONTAINS, NOT_CONTAINS, REGEX, NOT_REGEX, IN, 
NOT_IN;
+    EQ, GT, GTE, LT, LTE, NOT, CONTAINS, NOT_CONTAINS, REGEX, NOT_REGEX, IN, 
NOT_IN, IS, NOT_IS, RANGE, NOT_RANGE;
 
     public static SimpleLangaugeOperator asOperator(String text) {
         if ("==".equals(text)) {
@@ -62,6 +66,14 @@
             return IN;
         } else if ("not in".equals(text)) {
             return NOT_IN;
+        } else if ("is".equals(text)) {
+            return IS;
+        } else if ("not is".equals(text)) {
+            return NOT_IS;
+        } else if ("range".equals(text)) {
+            return RANGE;
+        } else if ("not range".equals(text)) {
+            return NOT_RANGE;
         }
         throw new IllegalArgumentException("Operator not supported: " + text);
     }
@@ -91,6 +103,14 @@
             return "in";
         } else if (operator == NOT_IN) {
             return "not in";
+        } else if (operator == IS) {
+            return "is";
+        } else if (operator == NOT_IS) {
+            return "not is";
+        } else if (operator == RANGE) {
+            return "range";
+        } else if (operator == NOT_RANGE) {
+            return "not range";
         }
         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=776267&r1=776266&r2=776267&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
 Tue May 19 10:58:29 2009
@@ -41,7 +41,8 @@
 public abstract class SimpleLanguageSupport implements Language, IsSingleton {
 
     protected static final Pattern PATTERN = Pattern.compile(
-            "^\\$\\{(.+)\\}\\s+(==|>|>=|<|<=|!=|contains|not 
contains|regex|not regex|in|not in)\\s+(.+)$");
+            "^\\$\\{(.+)\\}\\s+(==|>|>=|<|<=|!=|contains|not 
contains|regex|not regex|in|not in|is|not is|range|not range)\\s+(.+)$");
+    protected static final Pattern RANGE_PATTERN = 
Pattern.compile("^(\\d+)(\\.\\.)(\\d+)$");
     protected final Log log = LogFactory.getLog(getClass());
 
     public Predicate createPredicate(String expression) {
@@ -148,6 +149,39 @@
                     if (operator == NOT_IN) {
                         predicate = PredicateBuilder.not(predicate);
                     }
+                } else if (operator == IS || operator == NOT_IS) {
+                    String name = right.evaluate(exchange, String.class);
+                    Class rightType = 
exchange.getContext().getClassResolver().resolveClass(name);
+                    if (rightType == null) {
+                        // prefix class name with java.lang. so people can use 
String as shorthand
+                        rightType = 
exchange.getContext().getClassResolver().resolveClass("java.lang." + name);
+                    }
+                    if (rightType == null) {
+                        throw new IllegalArgumentException("Syntax error in is 
operator: " + expression
+                                + " cannot find class with name: " + name);
+                    }
+                    predicate = PredicateBuilder.isInstanceOf(left, rightType);
+                    if (operator == NOT_IS) {
+                        predicate = PredicateBuilder.not(predicate);
+                    }
+                } else if (operator == RANGE || operator == NOT_RANGE) {
+                    String range = right.evaluate(exchange, String.class);
+                    Matcher matcher = RANGE_PATTERN.matcher(range);
+                    if (matcher.matches()) {
+                        // wrap as constant expression for the from and to 
values
+                        Expression from = 
ExpressionBuilder.constantExpression(matcher.group(1));
+                        Expression to = 
ExpressionBuilder.constantExpression(matcher.group(3));
+
+                        // build a compound predicate for the range
+                        predicate = 
PredicateBuilder.isGreaterThanOrEqualTo(left, from);
+                        predicate = PredicateBuilder.and(predicate, 
PredicateBuilder.isLessThanOrEqualTo(left, to));
+                    } else {
+                        throw new IllegalArgumentException("Syntax error in 
range operator: " + expression + " is not valid."
+                                + " Valid syntax: from..to (where from and to 
are numbers).");
+                    }
+                    if (operator == NOT_RANGE) {
+                        predicate = PredicateBuilder.not(predicate);
+                    }
                 }
 
                 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=776267&r1=776266&r2=776267&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
 Tue May 19 10:58:29 2009
@@ -226,6 +226,50 @@
         assertExpression("${in.header.bar} not in '100,200'", true);
     }
 
+    public void testIs() throws Exception {
+        assertExpression("${in.header.foo} is 'java.lang.String'", true);
+        assertExpression("${in.header.foo} is 'java.lang.Integer'", false);
+
+        assertExpression("${in.header.foo} is 'String'", true);
+        assertExpression("${in.header.foo} is 'Integer'", false);
+
+        assertExpression("${in.header.foo} is String", true);
+        assertExpression("${in.header.foo} is Integer", false);
+    }
+
+    public void testIsNot() throws Exception {
+        assertExpression("${in.header.foo} not is 'java.lang.String'", false);
+        assertExpression("${in.header.foo} not is 'java.lang.Integer'", true);
+
+        assertExpression("${in.header.foo} not is 'String'", false);
+        assertExpression("${in.header.foo} not is 'Integer'", true);
+
+        assertExpression("${in.header.foo} not is String", false);
+        assertExpression("${in.header.foo} not is Integer", true);
+    }
+
+    public void testRange() throws Exception {
+        assertExpression("${in.header.bar} range 100..200", true);
+        assertExpression("${in.header.bar} range 200..300", false);
+
+        assertExpression("${in.header.foo} range 200..300", false);
+        assertExpression("${bean:generator.generateId} range 123..130", true);
+        assertExpression("${bean:generator.generateId} range 120..123", true);
+        assertExpression("${bean:generator.generateId} range 120..122", false);
+        assertExpression("${bean:generator.generateId} range 124..130", false);
+    }
+
+    public void testNotRange() throws Exception {
+        assertExpression("${in.header.bar} not range 100..200", false);
+        assertExpression("${in.header.bar} not range 200..300", true);
+
+        assertExpression("${in.header.foo} not range 200..300", true);
+        assertExpression("${bean:generator.generateId} not range 123..130", 
false);
+        assertExpression("${bean:generator.generateId} not range 120..123", 
false);
+        assertExpression("${bean:generator.generateId} not range 120..122", 
true);
+        assertExpression("${bean:generator.generateId} not range 124..130", 
true);
+    }
+
     protected String getLanguageName() {
         return "simple";
     }


Reply via email to