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