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";
}