You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2008/09/04 07:41:46 UTC
svn commit: r691875 - in /activemq/camel/trunk/camel-core/src:
main/java/org/apache/camel/builder/ExpressionBuilder.java
test/java/org/apache/camel/TestSupport.java
test/java/org/apache/camel/builder/ExpressionBuilderTest.java
Author: davsclaus
Date: Wed Sep 3 22:41:46 2008
New Revision: 691875
URL: http://svn.apache.org/viewvc?rev=691875&view=rev
Log:
CAMEL-875: Expression tokenizer should support streams
Modified:
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java?rev=691875&r1=691874&r2=691875&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java Wed Sep 3 22:41:46 2008
@@ -16,16 +16,20 @@
*/
package org.apache.camel.builder;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.List;
-import java.util.StringTokenizer;
+import java.util.Scanner;
import java.util.regex.Pattern;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Message;
+import org.apache.camel.RuntimeCamelException;
/**
* A helper class for working with <a href="http://activemq.apache.org/camel/expression.html">expressions</a>.
@@ -402,15 +406,17 @@
final String token) {
return new Expression<E>() {
public Object evaluate(E exchange) {
- String text = evaluateStringExpression(expression, exchange);
- if (text == null) {
- return null;
- }
- StringTokenizer iter = new StringTokenizer(text, token);
List<String> answer = new ArrayList<String>();
- while (iter.hasMoreTokens()) {
- answer.add(iter.nextToken());
+
+ Object value = expression.evaluate(exchange);
+ Scanner scanner = getScanner(expression, exchange, value);
+ if (scanner != null) {
+ scanner.useDelimiter(token);
+ while (scanner.hasNext()) {
+ answer.add(scanner.next());
+ }
}
+
return answer;
}
@@ -426,15 +432,22 @@
* given regex
*/
public static <E extends Exchange> Expression<E> regexTokenize(final Expression<E> expression,
- String regexTokenizer) {
+ final String regexTokenizer) {
final Pattern pattern = Pattern.compile(regexTokenizer);
return new Expression<E>() {
public Object evaluate(E exchange) {
- String text = evaluateStringExpression(expression, exchange);
- if (text == null) {
- return null;
+ List<String> answer = new ArrayList<String>();
+
+ Object value = expression.evaluate(exchange);
+ Scanner scanner = getScanner(expression, exchange, value);
+ if (scanner != null) {
+ scanner.useDelimiter(regexTokenizer);
+ while (scanner.hasNext()) {
+ answer.add(scanner.next());
+ }
}
- return Arrays.asList(pattern.split(text));
+
+ return answer;
}
@Override
@@ -444,12 +457,44 @@
};
}
+ private static Scanner getScanner(Expression expression, Exchange exchange, Object value) {
+ String charset = (String)exchange.getProperty(Exchange.CHARSET_NAME);
+
+ Scanner scanner = null;
+ if (value instanceof Readable) {
+ scanner = new Scanner((Readable)value);
+ } else if (value instanceof InputStream) {
+ scanner = charset == null ? new Scanner((InputStream)value)
+ : new Scanner((InputStream)value, charset);
+ } else if (value instanceof File) {
+ try {
+ scanner = charset == null ? new Scanner((File)value) : new Scanner((File)value, charset);
+ } catch (FileNotFoundException e) {
+ throw new RuntimeCamelException(e);
+ }
+ } else if (value instanceof String) {
+ scanner = new Scanner((String)value);
+ } else if (value instanceof ReadableByteChannel) {
+ scanner = charset == null ? new Scanner((ReadableByteChannel)value)
+ : new Scanner((ReadableByteChannel)value, charset);
+ }
+
+ if (scanner == null) {
+ // value is not a suitable type, try to convert value to a string
+ String text = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, value);
+ if (text != null) {
+ scanner = new Scanner(text);
+ }
+ }
+ return scanner;
+ }
+
/**
* Transforms the expression into a String then performs the regex
* replaceAll to transform the String and return the result
*/
public static <E extends Exchange> Expression<E> regexReplaceAll(final Expression<E> expression,
- String regex, final String replacement) {
+ final String regex, final String replacement) {
final Pattern pattern = Pattern.compile(regex);
return new Expression<E>() {
public Object evaluate(E exchange) {
Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java?rev=691875&r1=691874&r2=691875&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/TestSupport.java Wed Sep 3 22:41:46 2008
@@ -190,6 +190,7 @@
log.debug("Received response: " + exchange + " with out: " + exchange.getOut());
}
+
protected Object assertMessageHeader(Message message, String name, Object expected) {
Object value = message.getHeader(name);
assertEquals("Header: " + name + " on Message: " + message, expected, value);
Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java?rev=691875&r1=691874&r2=691875&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java Wed Sep 3 22:41:46 2008
@@ -16,6 +16,7 @@
*/
package org.apache.camel.builder;
+import java.util.ArrayList;
import java.util.Arrays;
import org.apache.camel.Exchange;
@@ -23,14 +24,15 @@
import org.apache.camel.Message;
import org.apache.camel.Predicate;
import org.apache.camel.TestSupport;
-import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.impl.DefaultExchange;
-
+import static org.apache.camel.builder.ExpressionBuilder.bodyExpression;
import static org.apache.camel.builder.ExpressionBuilder.constantExpression;
import static org.apache.camel.builder.ExpressionBuilder.headerExpression;
import static org.apache.camel.builder.ExpressionBuilder.regexReplaceAll;
import static org.apache.camel.builder.ExpressionBuilder.regexTokenize;
+import static org.apache.camel.builder.ExpressionBuilder.tokenizeExpression;
import static org.apache.camel.builder.PredicateBuilder.contains;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
/**
* @version $Revision$
@@ -40,7 +42,8 @@
public void testRegexTokenize() throws Exception {
Expression<Exchange> expression = regexTokenize(headerExpression("location"), ",");
- assertExpression(expression, exchange, Arrays.asList(new String[] {"Islington", "London", "UK"}));
+ ArrayList expected = new ArrayList(Arrays.asList(new String[] {"Islington", "London", "UK"}));
+ assertExpression(expression, exchange, expected);
Predicate<Exchange> predicate = contains(regexTokenize(headerExpression("location"), ","),
constantExpression("London"));
@@ -60,6 +63,29 @@
assertExpression(expression, exchange, "Islington,James,UK");
}
+ public void testTokenize() throws Exception {
+ Expression <Exchange> expression = tokenizeExpression(headerExpression("location"), ",");
+
+ ArrayList expected = new ArrayList(Arrays.asList(new String[] {"Islington", "London", "UK"}));
+ assertExpression(expression, exchange, expected);
+
+ Predicate<Exchange> predicate = contains(tokenizeExpression(headerExpression("location"), ","),
+ constantExpression("London"));
+ assertPredicate(predicate, exchange, true);
+
+ predicate = contains(tokenizeExpression(headerExpression("location"), ","),
+ constantExpression("Manchester"));
+ assertPredicate(predicate, exchange, false);
+ }
+
+ public void testTokenizeLines() throws Exception {
+ Expression expression = regexTokenize(bodyExpression(), "[\r|\n]");
+ exchange.getIn().setBody("Hello World\nBye World\rSee you again");
+
+ ArrayList expected = new ArrayList(Arrays.asList(new String[] {"Hello World", "Bye World", "See you again"}));
+ assertExpression(expression, exchange, expected);
+ }
+
@Override
protected void setUp() throws Exception {
super.setUp();