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();